diff --git a/pom.xml b/pom.xml index d9dbc114..120f4204 100644 --- a/pom.xml +++ b/pom.xml @@ -54,8 +54,8 @@ http://maven.apache.org/maven-v4_0_0.xsd"> 3.11.0 --enable-preview - 22 - 22 + 21 + 21 diff --git a/resources/AllgemeinTest/Foo.jav b/resources/AllgemeinTest/Foo.jav new file mode 100644 index 00000000..d8195c0f --- /dev/null +++ b/resources/AllgemeinTest/Foo.jav @@ -0,0 +1,6 @@ +public class Foo{ + + public accept(Bar b){ + b.visit(this); + } +} \ No newline at end of file diff --git a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 4f4474a5..37df41fa 100644 --- a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -158,7 +158,8 @@ public class FCGenerator { } /** - * Tauscht die GTVs in einem Typ gegen die entsprechenden Typen in der übergebenen Map aus. + * Tauscht die GTVs in einem Typ gegen die entsprechenden Typen in der übergebenen Map aus auf der direkten Argumentebene. + * Hier sind keine Wildcards zulässig */ private static class TypeExchanger implements TypeVisitor{ @@ -172,6 +173,7 @@ public class FCGenerator { public RefTypeOrTPHOrWildcardOrGeneric visit(RefType refType) { List params = new ArrayList<>(); for(RefTypeOrTPHOrWildcardOrGeneric param : refType.getParaList()){ + //params.add(param.acceptTV(new TypeExchangerInner(gtvs))); params.add(param.acceptTV(this)); } RefTypeOrTPHOrWildcardOrGeneric ret = new RefType(refType.getName(), params, new NullToken()); @@ -201,4 +203,51 @@ public class FCGenerator { } } + + /** + * Tauscht die GTVs in einem Typ gegen die entsprechenden Typen in der übergebenen Map aus auf den Argumenten der Argumente. + * Hier sind Wildcards zulässig + */ + private static class TypeExchangerInner implements TypeVisitor{ + + private final HashMap gtvs; + + TypeExchangerInner(HashMap gtvs){ + this.gtvs = gtvs; + } + + @Override + public RefTypeOrTPHOrWildcardOrGeneric visit(RefType refType) { + List params = new ArrayList<>(); + for(RefTypeOrTPHOrWildcardOrGeneric param : refType.getParaList()){ + params.add(param.acceptTV(this)); + } + RefTypeOrTPHOrWildcardOrGeneric ret = new RefType(refType.getName(), params, new NullToken()); + return ret; + } + + @Override + public RefTypeOrTPHOrWildcardOrGeneric visit(SuperWildcardType superWildcardType) { + return superWildcardType; + } + + @Override + public RefTypeOrTPHOrWildcardOrGeneric visit(TypePlaceholder typePlaceholder) { + throw new DebugException("Dieser Fall darf nicht auftreten"); + } + + @Override + public RefTypeOrTPHOrWildcardOrGeneric visit(ExtendsWildcardType extendsWildcardType) { + return extendsWildcardType; + } + + @Override + public RefTypeOrTPHOrWildcardOrGeneric visit(GenericRefType genericRefType) { + if(! gtvs.containsKey(genericRefType.getParsedName())) + throw new DebugException("Dieser Fall darf nicht auftreten"); + return gtvs.get(genericRefType.getParsedName()); + } + + } + }