@@ -753,19 +753,16 @@ private List<? extends PsiElement> checkEnumMemberHints(HaxeReference reference)
753753 while (expression instanceof HaxeParenthesizedExpression parenthesizedExpression ) {
754754 expression = parenthesizedExpression .getExpression ();
755755 }
756- HaxeSwitchCaseExprArray exprArray = PsiTreeUtil .getParentOfType (reference , HaxeSwitchCaseExprArray .class );
757- // TODO: if necessary support array inside array ?
758- int index = findSwitchArrayIndex (exprArray , reference );
759- if (expression instanceof HaxeArrayLiteral arrayLiteral ) {
760- HaxeExpressionList list = arrayLiteral .getExpressionList ();
761- if (list != null && index > -1 ) {
762- List <HaxeExpression > expressionList = list .getExpressionList ();
763- if (expressionList .size ()> index ) {
764- HaxeExpression haxeExpression = expressionList .get (index );
765- List <HaxeComponentName > components = evaluateAndFindEnumMember (reference , haxeExpression );
766- if (components != null ) return components ;
767- }
756+
757+ PsiElement fromPath = enumMEmberTraverseUsagePath (reference );
758+ if (fromPath instanceof HaxeEnumDeclaration enumDeclaration ) {
759+ HaxeBaseMemberModel member = enumDeclaration .getModel ().getMember (reference .getText (), null );
760+ if (member != null ) {
761+ return List .of (member .getNamedComponentPsi ());
768762 }
763+ } else if (fromPath instanceof HaxeExpression haxeExpression ) {
764+ List <HaxeComponentName > components = evaluateAndFindEnumMember (reference , haxeExpression );
765+ if (components != null ) return components ;
769766 }
770767
771768 List <HaxeComponentName > components = evaluateAndFindEnumMember (reference , expression );
@@ -1630,7 +1627,62 @@ private static List<PsiElement> tryResolveExtractedValue(HaxeReference reference
16301627 }
16311628 if (lastElement != null ) return List .of (lastElement );
16321629 if (pathElement != null ) return List .of (pathElement );
1630+ }
1631+ return null ;
1632+ }
1633+ @ Nullable
1634+ private static PsiElement enumMEmberTraverseUsagePath (HaxeReference reference ) {
1635+ PsiElement parent = reference .getParent ();
1636+ if (parent instanceof HaxeEnumValueReference ) {
1637+ Stack <Object > objectPath = new Stack <>();
1638+
1639+ HaxeSwitchStatement switchStatement = PsiTreeUtil .getParentOfType (reference , HaxeSwitchStatement .class );
1640+ PsiElement pathElement = buildExtractVarPath (parent , true , objectPath , switchStatement );
1641+
1642+ HaxeNamedComponent lastElement = null ;
1643+ Collections .reverse (objectPath );
1644+
1645+ for (int i = 0 ; i < objectPath .size (); i ++) {
1646+ Object path = objectPath .get (i );
1647+ if (pathElement instanceof HaxeReferenceExpression referenceExpression ) {
1648+ pathElement = referenceExpression .resolve ();
1649+ if (pathElement instanceof HaxePsiField psiField ) {
1650+ ResultHolder result = HaxeExpressionEvaluator .evaluate (psiField ).result ;
1651+ if (result != null && result .getClassType () != null ) {
1652+ HaxeClassModel haxeClassModel = result .getClassType ().getHaxeClassModel ();
1653+ if (path instanceof String memberName ) {
1654+ if (haxeClassModel != null ) {
1655+ HaxeBaseMemberModel member = haxeClassModel .getMember (memberName , null );
1656+ if (member != null ) {
1657+ lastElement = member .getNamedComponentPsi ();
1658+ continue ;
1659+ }
1660+ }
1661+ } else if (path instanceof Integer arrayIndex ) {
1662+ SpecificTypeReference fullyResolved = result .getClassType ().fullyResolveTypeDefAndUnwrapNullTypeReference ();
1663+ if (fullyResolved instanceof SpecificHaxeClassReference classReference ) {
1664+ ResultHolder iterableType = classReference .getIterableElementType (null );
1665+ if (iterableType != null && iterableType .getType () instanceof SpecificHaxeClassReference classType )
1666+ lastElement = classType .getHaxeClass ();
1667+ continue ;
1668+ }
1669+ }
1670+ }
1671+ }
1672+ }
1673+ if (pathElement instanceof HaxeArrayLiteral arrayLiteral && path instanceof Integer index ) {
1674+ HaxeExpressionList expressionList = arrayLiteral .getExpressionList ();
1675+ if (expressionList != null ) {
1676+ pathElement = expressionList .getExpressionList ().get (index );
1677+ }
16331678
1679+ } else if (pathElement instanceof HaxeObjectLiteral objectLiteral && path instanceof String member ) {
1680+ List <HaxeNamedComponent > members = objectLiteral .findHaxeMemberByName (member , null );
1681+ lastElement = members .isEmpty () ? null : members .getFirst ();
1682+ }
1683+ }
1684+ if (lastElement != null ) return lastElement ;
1685+ if (pathElement != null ) return pathElement ;
16341686 }
16351687 return null ;
16361688 }
0 commit comments