6565import static com .intellij .plugins .haxe .lang .psi .impl .HaxeReferenceUtil .textCanBeQname ;
6666import static com .intellij .plugins .haxe .model .evaluator .HaxeExpressionEvaluator .findObjectLiteralType ;
6767import static com .intellij .plugins .haxe .model .evaluator .HaxeExpressionEvaluatorHandlers .getArrayAccessTypeFromClass ;
68+ import static com .intellij .plugins .haxe .model .evaluator .callexpression .EnumValueMatchUtil .isInsidePatternMatcher ;
69+ import static com .intellij .plugins .haxe .model .evaluator .callexpression .EnumValueMatchUtil .isPatternMatcher ;
6870import static com .intellij .plugins .haxe .model .evaluator .callexpression .HaxeCallExpressionUtil .createContextForConstructorCall ;
6971import static com .intellij .plugins .haxe .model .evaluator .callexpression .HaxeCallExpressionUtil .createContextForMethodCall ;
7072import static com .intellij .plugins .haxe .model .type .SpecificTypeReference .*;
@@ -368,16 +370,20 @@ private List<? extends PsiElement> checkElementUsage(@NotNull PsiElement referen
368370 // check Enum values
369371 if (haxeClass .isEnum ()) {
370372 if (haxeClass .getModel () instanceof HaxeEnumModel enumModel ) {
373+ boolean isInPatternMatcher = isInsidePatternMatcher (reference );
371374 for (HaxeEnumValueModel value : enumModel .getValues ()) {
372375 if (value .getNamePsi ().textMatches (reference )) {
373376 if (value instanceof HaxeEnumValueConstructorModel constructorModel ) {
374377 // validate parameters if callExpression ignore if EnumExtractor
375- if (!(reference .getParent () instanceof HaxeEnumValueReference )) {
378+ if (!(reference .getParent () instanceof HaxeEnumValueReference )) {
376379 boolean isValidConstructor = testAsEnumValueConstructor (constructorModel .getEnumValuePsi (), referenceExpression );
377- if (!isValidConstructor ) continue ;
380+ if (isValidConstructor || isInPatternMatcher ) {
381+ return List .of (constructorModel .getNamePsi ());
382+ }
378383 }
384+ } else if (isInPatternMatcher && value instanceof HaxeEnumValueFieldModel fieldModel ) {
385+ return List .of (fieldModel .getNamePsi ());
379386 }
380- return List .of (value .getNamePsi ());
381387 }
382388 }
383389 }
@@ -396,6 +402,7 @@ private List<? extends PsiElement> checkElementUsage(@NotNull PsiElement referen
396402 return null ;
397403 }
398404
405+
399406 // Experimental
400407 // try to step one level up until we find a type definition and then pass that back down
401408 private ResultHolder findParentAssignType (@ NotNull PsiElement reference ) {
@@ -516,9 +523,18 @@ private ResultHolder findParentAssignType(@NotNull PsiElement reference, boolean
516523 if (callExpression .getExpression () instanceof HaxeReferenceExpression referenceExpression ) {
517524 PsiElement resolve = referenceExpression .resolve ();
518525 if (resolve instanceof HaxeMethod method ) {
526+
527+ // enumRef.match(enumMember) expects members from the same Enum so it should resolve members without the need of imports.
528+ if (isPatternMatcher (method )) {
529+ ResultHolder type = findTypeFromPatternMatchExpression (referenceExpression );
530+ if (type != null && type .isEnum ()) return type ;
531+ }
532+
519533 int index = expressionList .getExpressionList ().indexOf (reference );
520534 HaxeCallExpressionEvaluation evaluate = cachedHaxeCallExpressionEvaluation (method , callExpression );
521- return evaluate == null ? null : evaluate .getParameterType (index );
535+ if (evaluate != null && evaluate .isValid () && evaluate .isCompleted ()) {
536+ return evaluate .getParameterType (index );
537+ }
522538 }
523539 }
524540 }
@@ -585,6 +601,20 @@ private ResultHolder findParentAssignType(@NotNull PsiElement reference, boolean
585601 return findParentAssignType (parent , isValueExpression );
586602 }
587603
604+ private @ Nullable ResultHolder findTypeFromPatternMatchExpression (HaxeReferenceExpression referenceExpression ) {
605+ HaxeReference leftReference = HaxeResolveUtil .getLeftReference (referenceExpression );
606+ if (leftReference instanceof HaxeReferenceExpression callieReference ) {
607+ ResultHolder callieType = HaxeExpressionEvaluator .evaluate (callieReference ).result ;
608+ if (callieType != null && callieType .getType () instanceof SpecificHaxeClassReference classReference ) {
609+ SpecificTypeReference resolvedType = classReference .fullyResolveTypeDefAndUnwrapNullTypeReference ();
610+ if (resolvedType .isEnumReference ()) return resolvedType .createHolder ();
611+ }
612+ }
613+ return null ;
614+ }
615+
616+
617+
588618 private static @ Nullable HaxeCallExpressionEvaluation cachedHaxeCallExpressionEvaluation (HaxeMethod method , HaxeCallExpression callExpression ) {
589619
590620 HaxeCallExpressionEvaluatorCacheService service = method .getProject ().getService (HaxeCallExpressionEvaluatorCacheService .class );
0 commit comments