Skip to content

Commit

Permalink
work on recursion guards
Browse files Browse the repository at this point in the history
  • Loading branch information
m0rkeulv committed Jan 24, 2024
1 parent cfbf8ca commit aca14fe
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,27 @@ public HaxeGenericResolver() {

public HaxeGenericResolver withoutUnknowns() {
HaxeGenericResolver resolver = new HaxeGenericResolver();
resolvers.stream().filter(entry -> !entry.type().isUnknown()).forEach(resolver.resolvers::add);
constaints.stream().filter(entry -> !entry.type().isUnknown()).forEach(resolver.constaints::add);

for (ResolverEntry resolverEntry : resolvers) {
if (!resolverEntry.type().isUnknown()) {
resolver.resolvers.add(resolverEntry);
}
}
for (ResolverEntry entry : constaints) {
if (!entry.type().isUnknown()) {
resolver.constaints.add(entry);
}
}
return resolver;
}
public HaxeGenericResolver withoutAssignHint() {
HaxeGenericResolver resolver = new HaxeGenericResolver();
resolvers.stream().filter(entry -> entry.resolveSource() != ResolveSource.ASSIGN_TYPE).forEach(resolver.resolvers::add);

for (ResolverEntry entry : resolvers) {
if (entry.resolveSource() != ResolveSource.ASSIGN_TYPE) {
resolver.resolvers.add(entry);
}
}
resolver.constaints.addAll(constaints);
return resolver;
}
Expand Down Expand Up @@ -343,8 +357,16 @@ public HaxeGenericSpecialization getSpecialization(@Nullable PsiElement element)

public HaxeGenericResolver without(String name) {
HaxeGenericResolver resolver = new HaxeGenericResolver();
resolvers.stream().filter(entry -> !entry.name().equals(name)).forEach(resolver.resolvers::add);
constaints.stream().filter(entry -> !entry.name().equals(name)).forEach(resolver.constaints::add);
for (ResolverEntry resolverEntry : resolvers) {
if (!resolverEntry.name().equals(name)) {
resolver.resolvers.add(resolverEntry);
}
}
for (ResolverEntry entry : constaints) {
if (!entry.name().equals(name)) {
resolver.constaints.add(entry);
}
}
return resolver;
}

Expand Down Expand Up @@ -384,4 +406,13 @@ public boolean equals(Object obj) {
public int hashCode() {
return resolvers.hashCode() * constaints.hashCode();
}

public String findNameFor(ResultHolder specific) {
for (ResolverEntry entry : resolvers) {
if (entry.type().equals(specific)) {
return entry.name();
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -683,11 +683,17 @@ public static SpecificHaxeClassReference propagateGenericsToType(@Nullable Speci
}
}
for (ResultHolder specific : type.getSpecifics()) {
// recursive guard
// recursive guard (remove type parameters that has been used)
if (specific.getClassType() != originalType) {
final SpecificTypeReference typeReference = propagateGenericsToType(specific.getType(), genericResolver);
if (null != typeReference) {
specific.setType(typeReference);
String name = genericResolver.findNameFor(specific);
if (name != null) {
genericResolver = genericResolver.without(name);
}
if (!genericResolver.isEmpty()) {
final SpecificTypeReference typeReference = propagateGenericsToType(specific.getType(), genericResolver);
if (null != typeReference) {
specific.setType(typeReference);
}
}
}
else {
Expand Down

0 comments on commit aca14fe

Please sign in to comment.