Skip to content

Commit

Permalink
Null-safety(#1186), resolve idempotence fix, argument type as enum re…
Browse files Browse the repository at this point in the history
…solve hints.
  • Loading branch information
m0rkeulv committed Aug 20, 2024
1 parent fb2adee commit 8892703
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 25 deletions.
30 changes: 30 additions & 0 deletions src/main/java/com/intellij/plugins/haxe/lang/psi/HaxeResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,36 @@ private List<? extends PsiElement> checkEnumMemberHints(HaxeReference reference)
}
}
}
// check function argumentList and look for enum hints in argument types
int index;
PsiElement PossibleCallExpression = element;
if (PossibleCallExpression instanceof HaxeCallExpressionList callExpressionList) {
PossibleCallExpression = callExpressionList.getParent();
index = callExpressionList.getExpressionList().indexOf(reference);
}else {
index = 0;
}
if(PossibleCallExpression instanceof HaxeCallExpression callExpression) {
ResultHolder result = HaxeExpressionEvaluator.evaluate(callExpression.getExpression(), new HaxeGenericResolver()).result;
SpecificFunctionReference functionType = result.getFunctionType();
if(functionType != null) {
List<SpecificFunctionReference.Argument> arguments = functionType.getArguments();
if (index > -1) {
while (index < arguments.size()) {
SpecificFunctionReference.Argument argument = arguments.get(index++);
ResultHolder type = argument.getType();
if (type != null && type.isEnum()) {
SpecificHaxeClassReference classType = type.getClassType();
if (classType != null) {
SpecificTypeReference typeReference = classType.fullyResolveTypeDefAndUnwrapNullTypeReference();
return findEnumMember(reference, typeReference);
}
if (!argument.isOptional()) break;
}
}
}
}
}
}
}
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public HaxeResolveResult getTargetClass() {
return targetClass;
}

@Nullable
public SpecificHaxeClassReference getTargetClass(HaxeGenericResolver genericResolver) {

final HaxeTypeOrAnonymous haxeTypeOrAnonymous = getTypeOrAnonymous();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public abstract class HaxeBaseMemberModel implements HaxeModel {
public abstract class HaxeBaseMemberModel implements HaxeNamedComponentModel {
protected PsiElement basePsi;
protected HaxeDocumentModel document = null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.intellij.plugins.haxe.model.type.ResultHolder;
import org.jetbrains.annotations.Nullable;

public interface HaxeEnumValueModel extends HaxeModel {
public interface HaxeEnumValueModel extends HaxeNamedComponentModel {

ResultHolder getResultType(@Nullable HaxeGenericResolver resolver);

Expand Down
18 changes: 12 additions & 6 deletions src/main/java/com/intellij/plugins/haxe/model/HaxeImportModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,11 @@ public List<PsiElement> exposeAllByName(String name) {
if (getReferenceExpression() != null) {
for (HaxeModel member : members) {
if (member.getName().equals(getReferenceExpression().getIdentifier().getText())) {
return List.of(member.getBasePsi());
if (member instanceof HaxeNamedComponentModel componentModel) {
return List.of(componentModel.getNamePsi());
} else {
return List.of(member.getBasePsi());
}
}
}
}
Expand All @@ -148,11 +152,13 @@ public List<PsiElement> exposeAllByName(String name) {
}else {
for (HaxeModel exposedMember : getExposedMembers()) {
if (Objects.equals(exposedMember.getName(), name)) {
if (!(exposedMember instanceof HaxeEnumValueModel)) {
return List.of(exposedMember.getBasePsi());
}
else {
results.add(exposedMember.getBasePsi());
if (exposedMember instanceof HaxeEnumValueModel enumValueModel) {
results.add(enumValueModel.getNamePsi());
} else {
PsiElement element = exposedMember instanceof HaxeNamedComponentModel componentModel
? componentModel.getNamePsi()
: exposedMember.getBasePsi();
return List.of(element);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

package com.intellij.plugins.haxe.model;

import com.intellij.plugins.haxe.lang.psi.HaxeComponentName;

public interface HaxeNamedComponentModel extends HaxeModel {

HaxeComponentName getNamePsi();

}
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ public PsiElement exposeByName(String name) {
if (getReferenceExpression() != null) {
HaxeModel member = getExposedMember(name);
if (member != null) {
return member.getBasePsi();
return member instanceof HaxeNamedComponentModel componentModel
? componentModel.getNamePsi()
: member.getBasePsi();

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -695,25 +695,28 @@ public SpecificTypeReference fullyResolveTypeDefAndUnwrapNullTypeReference(boole
}
}

reference = typeDef.getTargetClass(resolver);
if (reference.isTypeDefOfClass()) {
haxeClass = reference.getHaxeClass();
resolver = reference.getGenericResolver();
}
else if (reference.isNullType()) {
SpecificTypeReference unwrapped = reference.unwrapNullType();
if (unwrapped instanceof SpecificHaxeClassReference haxeClassReference) {
haxeClass = haxeClassReference.getHaxeClass();
resolver = haxeClassReference.getGenericResolver();
reference = haxeClassReference;
SpecificHaxeClassReference targetClass = typeDef.getTargetClass(resolver);
if (targetClass != null) {
reference = targetClass;
if (reference.isTypeDefOfClass()) {
haxeClass = reference.getHaxeClass();
resolver = reference.getGenericResolver();
}
else if (reference.isNullType()) {
SpecificTypeReference unwrapped = reference.unwrapNullType();
if (unwrapped instanceof SpecificHaxeClassReference haxeClassReference) {
haxeClass = haxeClassReference.getHaxeClass();
resolver = haxeClassReference.getGenericResolver();
reference = haxeClassReference;
}
else if (unwrapped instanceof SpecificFunctionReference functionReference) {
return resolver.resolve(functionReference);
}
}
else if (unwrapped instanceof SpecificFunctionReference functionReference) {
return resolver.resolve(functionReference);
else {
break;
}
}
else {
break;
}
}
return reference;
}
Expand Down

0 comments on commit 8892703

Please sign in to comment.