Skip to content

Commit

Permalink
fixing specifics issues and returnType resolver problem
Browse files Browse the repository at this point in the history
  • Loading branch information
m0rkeulv committed Apr 1, 2024
1 parent 89f9f5d commit b878c1c
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,10 @@ private static void handleForEachHints(@NotNull PsiElement element,
HaxeGenericResolver resolver = HaxeGenericResolverUtil.generateResolverFromScopeParents(forStatement);
if (iterable != null && keyValueIterator == null) {
HaxeValueIterator valueIterator = forStatement.getValueIterator();
ResultHolder type = extractIteratorElementType(HaxeTypeResolver.getPsiElementType(iterable, element, resolver));
if (valueIterator!= null) createInlayHint(valueIterator.getComponentName(), sink, type);
if (valueIterator != null) {
ResultHolder type = HaxeTypeResolver.getPsiElementType(valueIterator, element, resolver);
createInlayHint(valueIterator.getComponentName(), sink, type);
}
}
if (keyValueIterator != null) {
HaxeIteratorkey iteratorKey = keyValueIterator.getIteratorkey();
Expand All @@ -57,27 +59,7 @@ private static void handleForEachHints(@NotNull PsiElement element,

}

private static ResultHolder extractKeyValueType(ResultHolder type, boolean key) {
if (!type.isUnknown() && type.getClassType() != null) {
@NotNull ResultHolder[] specifics = type.getClassType().getSpecifics();
if (specifics.length == 2) {
return specifics[key ? 0 : 1];
}
}
PsiElement element = type.getOrigin();
if(element == null) element = type.getElementContext(); // TODO mlo check why type origin is null (probably string missing iterator or smoething?)
return SpecificHaxeClassReference.getUnknown(element).createHolder();
}

private static ResultHolder extractIteratorElementType(ResultHolder type) {
if (!type.isUnknown() && type.getClassType() != null) {
@NotNull ResultHolder[] specifics = type.getClassType().getSpecifics();
if (specifics.length == 1) {
return specifics[0];
}
}
return type;
}

private static void createInlayHint(@NotNull HaxeComponentName componentName,@NotNull InlayTreeSink sink, ResultHolder type ) {
if (!type.isUnknown() && !type.getType().isInvalid()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,9 @@ public static HaxeGenericSpecialization fromGenericResolver(@Nullable PsiElement
}

SpecificHaxeClassReference classType = holder.getClassType();
if (context instanceof HaxeClass haxeClass && classType != null) {
if (classType != null && classType.getHaxeClass() != null) {
HaxeGenericResolver genericResolver = classType.getGenericResolver();
HaxeResolveResult resolved = HaxeResolveResult.create(haxeClass, fromGenericResolver(context, genericResolver));
HaxeResolveResult resolved = HaxeResolveResult.create(classType.getHaxeClass(), fromGenericResolver(context, genericResolver));
specialization.put(element, name, resolved);
} else if (classType != null && !holder.isUnknown()) {
HaxeClass clazz = classType.getHaxeClass();
Expand All @@ -176,11 +176,12 @@ public static HaxeGenericSpecialization fromGenericResolver(@Nullable PsiElement
}
HaxeResolveResult resolved = HaxeResolveResult.create(clazz, fromGenericResolver(clazz, classResolver));
specialization.put(element, name, resolved);
} else if (holder.getFunctionType() != null) {
if (context instanceof HaxeFunctionType functionType){
// functions currently do not have specialization
HaxeResolveResult resolved = HaxeResolveResult.create(functionType, new HaxeGenericSpecialization());
specialization.put(element, name, resolved);
} else {
SpecificFunctionReference typeFunctionReference = holder.getFunctionType();
if (typeFunctionReference != null && typeFunctionReference.functionType != null) {
// functions currently do not have specialization
HaxeResolveResult resolved = HaxeResolveResult.create(typeFunctionReference.functionType, new HaxeGenericSpecialization());
specialization.put(element, name, resolved);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,8 +300,10 @@ static private ResultHolder getFunctionReturnType(HaxeNamedComponent comp, HaxeG
HaxeTypeOrAnonymous typeOrAnonymous = typeTag.getTypeOrAnonymous();
if (typeOrAnonymous != null) {
HaxeClass aClass = (HaxeClass)method.getContainingClass();
HaxeGenericResolver localResolver = HaxeGenericSpecialization.fromGenericResolver(null, resolver).toGenericResolver(aClass).withoutUnknowns();
localResolver.addAssignHint(resolver);
HaxeGenericResolver localResolver = new HaxeGenericResolver();
HaxeGenericResolver classSpecificResolver = HaxeGenericSpecialization.fromGenericResolver(null, resolver).toGenericResolver(aClass).withoutUnknowns();
localResolver.addAll(resolver);
localResolver.addAll(classSpecificResolver); // overwrite any existing typeParameters with specifics for class
ResultHolder resolve = HaxeTypeResolver.getTypeFromTypeOrAnonymous(typeOrAnonymous, localResolver, true);
//TODO mlo: double resolve will cause issues (need another way to get correct typeParameter names)
//ResultHolder resolve = resolver.resolveReturnType(anonymous);
Expand Down
24 changes: 14 additions & 10 deletions src/main/java/com/intellij/plugins/haxe/util/HaxeGenericUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,22 @@ public static ResultHolder[] applyConstraintsToSpecifics(HaxeMethodModel model,
Map<String, ResultHolder> nameAndConstraints = getGenericTypeParametersByName(genericParams);

for (int i = 0; i < specifics.length; i++) {
String name = specifics[i].getClassType().getClassName();
boolean nameFound = genericParams.stream().anyMatch(m -> m.getName().equals(name));
if (nameFound) {
if (nameAndConstraints.containsKey(name)) {
newSpecifics[i] = nameAndConstraints.get(name);
}else {
newSpecifics[i] = SpecificTypeReference.getDynamic(model.getMethodPsi()).createHolder();
SpecificHaxeClassReference classType = specifics[i].getClassType();
if (classType != null) {
String name = classType.getClassName();
boolean nameFound = genericParams.stream().anyMatch(m -> m.getName().equals(name));
if (nameFound) {
if (nameAndConstraints.containsKey(name)) {
newSpecifics[i] = nameAndConstraints.get(name);
continue;
} else {
newSpecifics[i] = SpecificTypeReference.getDynamic(model.getMethodPsi()).createHolder();
continue;
}
}
}else {
// not found, just copy original
newSpecifics[i] = specifics[i];
}
// not found, just copy original
newSpecifics[i] = specifics[i];
}
}
return newSpecifics;
Expand Down

0 comments on commit b878c1c

Please sign in to comment.