diff --git a/pom.xml b/pom.xml
index 1b97e501c..6dcac2154 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,8 +83,8 @@
org.apache.maven.plugins
maven-compiler-plugin
-
- 9
+
+ 8
diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java
index 24abec67f..ceb3b8173 100644
--- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java
+++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java
@@ -57,48 +57,55 @@ public class FCGenerator {
params.add(gtvs.get(gtv.getName()));
}
- Optional hasSuperclass = availableClasses.stream().filter(cl -> forType.getSuperClass().getName().equals(cl.getClassName())).findAny();
- ClassOrInterface superClass;
- if(!hasSuperclass.isPresent()) //Wenn es die Klasse in den available Klasses nicht gibt wird sie im Classpath gesucht. Ansonsten Exception
- {
- superClass = ASTFactory.createClass(ClassLoader.getSystemClassLoader().loadClass(forType.getSuperClass().getName().toString()));
- }else{
- superClass = hasSuperclass.get();
- }
- /*
- Die Parameter der superklasse müssen jetzt nach den Angaben in der Subklasse
- modifiziert werden
- Beispie: Matrix extends Vector>
- Den ersten Parameter mit Vector austauschen und dort alle Generics zu den Typplaceholdern in gtvs austauschen
- */
- //Hier vermerken, welche Typen im der Superklasse ausgetauscht werden müssen
- Iterator itGenParams = superClass.getGenerics().iterator();
- Iterator itSetParams = forType.getSuperClass().getParaList().iterator();
- while(itGenParams.hasNext()){
- RefTypeOrTPHOrWildcardOrGeneric setType = itSetParams.next();
- //In diesem Typ die GTVs durch TPHs und Einsetzungen austauschen:
- RefTypeOrTPHOrWildcardOrGeneric setSetType = setType.acceptTV(new TypeExchanger(gtvs));
- newGTVs.put(itGenParams.next().getName(), setSetType);
- }
- RefTypeOrTPHOrWildcardOrGeneric superType = forType.getSuperClass().acceptTV(new TypeExchanger(newGTVs));
-
- RefTypeOrTPHOrWildcardOrGeneric t1 = new RefType(forType.getClassName(), params, new NullToken());
- RefTypeOrTPHOrWildcardOrGeneric t2 = superType;
-
- Pair ret = new Pair(t1, t2, PairOperator.SMALLER);
-
- List superTypes;
- //Rekursiver Aufruf. Abbruchbedingung ist Object als Superklasse:
- if(superClass.getClassName().equals(ASTFactory.createObjectClass().getClassName())){
- superTypes = Arrays.asList(new Pair(ASTFactory.createObjectType(), ASTFactory.createObjectType(), PairOperator.SMALLER));
- }else{
- superTypes = getSuperTypes(superClass, availableClasses, newGTVs);
- }
+ List superClasses = new ArrayList<>();
+ superClasses.add(forType.getSuperClass());
+ superClasses.addAll(forType.getSuperInterfaces());
List retList = new ArrayList<>();
- retList.add(ret);
- retList.addAll(superTypes);
+ for(RefType superType : superClasses){
+ Optional hasSuperclass = availableClasses.stream().filter(cl -> superType.getName().equals(cl.getClassName())).findAny();
+ ClassOrInterface superClass;
+ if(!hasSuperclass.isPresent()) //Wenn es die Klasse in den available Klasses nicht gibt wird sie im Classpath gesucht. Ansonsten Exception
+ {
+ superClass = ASTFactory.createClass(ClassLoader.getSystemClassLoader().loadClass(superType.getName().toString()));
+ }else{
+ superClass = hasSuperclass.get();
+ }
+ /*
+ Die Parameter der superklasse müssen jetzt nach den Angaben in der Subklasse
+ modifiziert werden
+ Beispie: Matrix extends Vector>
+ Den ersten Parameter mit Vector austauschen und dort alle Generics zu den Typplaceholdern in gtvs austauschen
+ */
+ //Hier vermerken, welche Typen im der Superklasse ausgetauscht werden müssen
+ Iterator itGenParams = superClass.getGenerics().iterator();
+ Iterator itSetParams = superType.getParaList().iterator();
+ while(itGenParams.hasNext()){
+ RefTypeOrTPHOrWildcardOrGeneric setType = itSetParams.next();
+ //In diesem Typ die GTVs durch TPHs und Einsetzungen austauschen:
+ RefTypeOrTPHOrWildcardOrGeneric setSetType = setType.acceptTV(new TypeExchanger(gtvs));
+ newGTVs.put(itGenParams.next().getName(), setSetType);
+ }
+
+ RefTypeOrTPHOrWildcardOrGeneric superRefType = superType.acceptTV(new TypeExchanger(newGTVs));
+
+ RefTypeOrTPHOrWildcardOrGeneric t1 = new RefType(forType.getClassName(), params, new NullToken());
+ RefTypeOrTPHOrWildcardOrGeneric t2 = superRefType;
+
+ Pair ret = new Pair(t1, t2, PairOperator.SMALLER);
+
+ List superTypes;
+ //Rekursiver Aufruf. Abbruchbedingung ist Object als Superklasse:
+ if(superClass.getClassName().equals(ASTFactory.createObjectClass().getClassName())){
+ superTypes = Arrays.asList(new Pair(ASTFactory.createObjectType(), ASTFactory.createObjectType(), PairOperator.SMALLER));
+ }else{
+ superTypes = getSuperTypes(superClass, availableClasses, newGTVs);
+ }
+
+ retList.add(ret);
+ retList.addAll(superTypes);
+ }
return retList;
}
diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java
index ed96d2e67..726067132 100644
--- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java
+++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java
@@ -203,20 +203,20 @@ public class SyntaxTreeGenerator{
}
Boolean isInterface = false;
- List implementedInterfaces = convert(ctx.superinterfaces(), generics);
+ List implementedInterfaces = convert(ctx.superinterfaces(), generics);
return new ClassOrInterface(modifiers, name, fielddecl, methods, konstruktoren, genericClassParameters, superClass,
isInterface, implementedInterfaces, offset);
}
- private List convert(Java8Parser.SuperinterfacesContext ctx, GenericsRegistry generics) {
+ private List convert(Java8Parser.SuperinterfacesContext ctx, GenericsRegistry generics) {
if(ctx == null)return new ArrayList<>();
return convert(ctx.interfaceTypeList(), generics);
}
- private List convert(Java8Parser.InterfaceTypeListContext ctx, GenericsRegistry generics) {
- List ret = new ArrayList<>();
+ private List convert(Java8Parser.InterfaceTypeListContext ctx, GenericsRegistry generics) {
+ List ret = new ArrayList<>();
for(Java8Parser.InterfaceTypeContext interfaceType : ctx.interfaceType()){
- ret.add(TypeGenerator.convert(interfaceType.classType(), reg, generics));
+ ret.add((RefType) TypeGenerator.convert(interfaceType.classType(), reg, generics));
}
return ret;
}
@@ -400,7 +400,7 @@ public class SyntaxTreeGenerator{
List fields = convertFields(ctx.interfaceBody());
List methods = convertMethods(ctx.interfaceBody(), name, superClass, generics);
- List extendedInterfaces = convert(ctx.extendsInterfaces(), generics);
+ List extendedInterfaces = convert(ctx.extendsInterfaces(), generics);
return new ClassOrInterface(modifiers, name, fields, methods, new ArrayList<>(),
genericParams, superClass, true, extendedInterfaces, ctx.getStart());
@@ -423,7 +423,7 @@ public class SyntaxTreeGenerator{
return ret;
}
- private List convert(Java8Parser.ExtendsInterfacesContext extendsInterfacesContext, GenericsRegistry generics) {
+ private List convert(Java8Parser.ExtendsInterfacesContext extendsInterfacesContext, GenericsRegistry generics) {
if(extendsInterfacesContext == null)return new ArrayList<>();
return convert(extendsInterfacesContext.interfaceTypeList(), generics);
}
diff --git a/src/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java b/src/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java
index 5d5fc3e2c..72097fc03 100644
--- a/src/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java
+++ b/src/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java
@@ -13,6 +13,7 @@ import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceInformation;
import org.antlr.v4.runtime.Token;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
/**
@@ -26,11 +27,11 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
private GenericDeclarationList genericClassParameters;
private RefType superClass;
protected boolean isInterface;
- private List extends RefTypeOrTPHOrWildcardOrGeneric> implementedInterfaces;
+ private List implementedInterfaces;
private List constructors;
public ClassOrInterface(int modifiers, JavaClassName name, List fielddecl, List methods, List constructors, GenericDeclarationList genericClassParameters,
- RefType superClass, Boolean isInterface, List extends RefTypeOrTPHOrWildcardOrGeneric> implementedInterfaces, Token offset){
+ RefType superClass, Boolean isInterface, List implementedInterfaces, Token offset){
super(offset);
this.modifiers = modifiers;
this.name = name;
@@ -101,4 +102,8 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
public void accept(ASTVisitor visitor) {
visitor.visit(this);
}
+
+ public Collection getSuperInterfaces() {
+ return implementedInterfaces;
+ }
}