Skip to content

Commit b7bc82a

Browse files
committed
Resolver: perform deeper search for enum member hints.
1 parent 5180bc0 commit b7bc82a

File tree

1 file changed

+64
-12
lines changed

1 file changed

+64
-12
lines changed

src/main/java/com/intellij/plugins/haxe/lang/psi/HaxeResolver.java

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)