Skip to content

Commit

Permalink
enum hint tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
m0rkeulv committed Apr 21, 2024
1 parent ddf43bb commit c308562
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 30 deletions.
49 changes: 24 additions & 25 deletions src/main/java/com/intellij/plugins/haxe/lang/psi/HaxeResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ private List<? extends PsiElement> checkEnumMemberHints(HaxeReference reference)
PsiElement referenceParent = reference.getParent();

if (!(referenceParent instanceof HaxeType)) {
HaxeParameter parameterFromReferenceExpression = null;
HaxePsiField fieldFromReferenceExpression = null;
HaxeAssignExpression assignExpression = PsiTreeUtil.getParentOfType(reference, HaxeAssignExpression.class);
if (assignExpression != null) {
Expand All @@ -327,6 +328,9 @@ private List<? extends PsiElement> checkEnumMemberHints(HaxeReference reference)
if (resolve instanceof HaxePsiField psiField) {
fieldFromReferenceExpression = psiField;
}
if (resolve instanceof HaxeParameter parameter) {
parameterFromReferenceExpression = parameter;
}
}
}
}
Expand All @@ -343,34 +347,29 @@ private List<? extends PsiElement> checkEnumMemberHints(HaxeReference reference)


HaxePsiField field = fieldFromReferenceExpression != null ? fieldFromReferenceExpression : PsiTreeUtil.getParentOfType(reference, HaxePsiField.class);
HaxeParameter parameter = parameterFromReferenceExpression != null ? parameterFromReferenceExpression : PsiTreeUtil.getParentOfType(reference, HaxeParameter.class);
HaxeTypeTag tag = null;
HaxeVarInit init = null;
if (field != null) {
HaxeTypeTag tag = field.getTypeTag();
if (tag != null && tag.getTypeOrAnonymous() != null) {
ResultHolder type = HaxeTypeResolver.getTypeFromTypeOrAnonymous(tag.getTypeOrAnonymous());
if (type.getClassType() != null) {
SpecificTypeReference typeReference = type.getClassType().fullyResolveTypeDefAndUnwrapNullTypeReference();
return findEnumMember(reference, typeReference);
}
}
HaxeVarInit init = field.getVarInit();
if (init != null) {
// check if reference is part of init expression and if so skip to avoid circular resolve
HaxeVarInit referenceInitParent = PsiTreeUtil.getParentOfType(reference, HaxeVarInit.class);
if (referenceInitParent == null || referenceInitParent != init) {
ResultHolder type = HaxeTypeResolver.getPsiElementType(init, null);
if (type.getClassType() != null) {
SpecificTypeReference typeReference = type.getClassType().fullyResolveTypeDefAndUnwrapNullTypeReference();
return findEnumMember(reference, typeReference);
}
}
tag = field.getTypeTag();
init = field.getVarInit();
} else if (parameter != null) {
tag = parameter.getTypeTag();
init = parameter.getVarInit();
}

if (tag != null && tag.getTypeOrAnonymous() != null) {
ResultHolder type = HaxeTypeResolver.getTypeFromTypeOrAnonymous(tag.getTypeOrAnonymous());
if (type.getClassType() != null) {
SpecificTypeReference typeReference = type.getClassType().fullyResolveTypeDefAndUnwrapNullTypeReference();
return findEnumMember(reference, typeReference);
}
}

HaxeParameter parameter = PsiTreeUtil.getParentOfType(reference, HaxeParameter.class);
if (parameter != null) {
HaxeTypeTag tag = parameter.getTypeTag();
if (tag != null && tag.getTypeOrAnonymous() != null) {
ResultHolder type = HaxeTypeResolver.getTypeFromTypeOrAnonymous(tag.getTypeOrAnonymous());
if (init != null) {
// check if reference is part of init expression and if so skip to avoid circular resolve
HaxeVarInit referenceInitParent = PsiTreeUtil.getParentOfType(reference, HaxeVarInit.class);
if (referenceInitParent == null || referenceInitParent != init) {
ResultHolder type = HaxeTypeResolver.getPsiElementType(init, null);
if (type.getClassType() != null) {
SpecificTypeReference typeReference = type.getClassType().fullyResolveTypeDefAndUnwrapNullTypeReference();
return findEnumMember(reference, typeReference);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1422,11 +1422,19 @@ static ResultHolder handleLocalVarDeclaration(
}
}
}

result = tryGetEnumValuesDeclaringClass(result);
context.setLocal(name.getText(), result);
return result != null ? result : createUnknown(varDeclaration);
}

private static @Nullable ResultHolder tryGetEnumValuesDeclaringClass(ResultHolder result) {
if (result != null && result.isEnumValueType()) {
//TODO check if typeParams need to be copied over
result = result.getEnumValueType().getEnumClass().createHolder();
}
return result;
}

private static boolean isUnknownLiteralArray(ResultHolder result) {
SpecificHaxeClassReference classType = result.getClassType();
if (classType != null && result.getClassType().isArray()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@

public class SpecificEnumValueReference extends SpecificTypeReference {

HaxeEnumValueDeclaration declaration;
SpecificHaxeClassReference enumClass;
HaxeGenericResolver resolver;
Object constantValue;
final HaxeEnumValueDeclaration declaration;
final SpecificHaxeClassReference enumClass;
final HaxeGenericResolver resolver;
final Object constantValue;

HaxeEnumValueModel model;

SpecificFunctionReference constructor;
Expand Down Expand Up @@ -68,6 +69,7 @@ public SpecificEnumValueReference clone() {
return new SpecificEnumValueReference(this.declaration, this.context, this.resolver, this.constantValue);
}

@NotNull
public SpecificHaxeClassReference getEnumClass() {
return enumClass;
}
Expand Down

0 comments on commit c308562

Please sign in to comment.