diff --git a/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java b/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java index fb39bc7b..3bf42d7e 100644 --- a/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java +++ b/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java @@ -245,7 +245,7 @@ public class ASTToTargetAST { var optMethod = findMethod(owner, methodCall.name, methodCall.getArgumentList()); if (optMethod.isEmpty()) return; var method = optMethod.get(); - var generics = generics(owner, method); + var generics = family(owner, method); // transitive and var all = transitiveClosure(generics); @@ -293,7 +293,6 @@ public class ASTToTargetAST { } } - @Override public void visit(LambdaExpression lambdaExpression) { superType = new Void(new NullToken()); @@ -355,6 +354,8 @@ public class ASTToTargetAST { } }); + System.out.println(method.getName() + " " + result); + var closure = transitiveClosure((Set) simplifiedConstraints); // Type variables with bounds that are also type variables of the class for (var typeVariable : new HashSet<>(typeVariables)) { @@ -454,26 +455,39 @@ public class ASTToTargetAST { abstract void generics(ClassOrInterface owner, Method method, Set> result, HashSet javaTypeVariablesOfClass); - Set> generics(ClassOrInterface owner, Method method) { - if (computedGenericsOfMethods.containsKey(method)) - return computedGenericsOfMethods.get(method); - - Set> result = new HashSet<>(); - computedGenericsOfMethods.put(method, result); - + Set> family(ClassOrInterface owner, Method method) { + var result = new HashSet>(); var classGenerics = generics(owner); - - HashSet javaTypeVariables = new HashSet<>(); HashSet typeVariablesOfClass = new HashSet<>(); for (var pair : classGenerics) { typeVariablesOfClass.add((TypePlaceholder) pair.getLeft()); } + HashSet javaTypeVariables = new HashSet<>(); + methodFindTypeVariables(method, javaTypeVariables); methodFindConstraints(owner, method, javaTypeVariables, typeVariablesOfClass, result); eliminateTransitives(result); + return result; + } + + Set> generics(ClassOrInterface owner, Method method) { + if (computedGenericsOfMethods.containsKey(method)) + return computedGenericsOfMethods.get(method); + + var classGenerics = generics(owner); + + HashSet typeVariablesOfClass = new HashSet<>(); + + for (var pair : classGenerics) { + typeVariablesOfClass.add((TypePlaceholder) pair.getLeft()); + } + + var result = family(owner, method); + computedGenericsOfMethods.put(method, result); + var referenced = new HashSet(); generics(owner, method, result, referenced);