From 33e9b87562d9309bd33f8d657339a61bd3eef6aa Mon Sep 17 00:00:00 2001 From: "pl@gohorb.ba-horb.de" Date: Sun, 18 Sep 2022 00:19:20 +0200 Subject: [PATCH] Der Returntyp des Konstruktors wurde mit TypePlaceholders als Parameter bestimmt. Korrigiert: TypePlaceholders durch GenericRefType ersetzt modified: ../../../../main/java/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java Methode generateTypeOfThisClass eingefuegt. Macht aus der atuellen Klasse den zugehoerigen RefType In getConstructors in new MethodAssumption den ofType-Parameter (Typeplaceholders) durch cl.generateTypeOfThisClass() ersetzt. Dadurch werden GenericRefType in den Typ eingefuegt. --- .../syntaxtree/ClassOrInterface.java | 14 ++++++++++++ .../typeinference/typeAlgo/TYPEStmt.java | 2 +- src/test/java/AllgemeinTest.java | 5 ++++- src/test/resources/AllgemeinTest/Box.jav | 13 +++++++++++ src/test/resources/AllgemeinTest/Box_Main.jav | 13 +++++++++++ src/test/resources/AllgemeinTest/Pair.java | 6 +++++ .../resources/AllgemeinTest/Wildcard_Andi.jav | 2 +- .../resources/AllgemeinTest/wildcardPair.jav | 22 +++++++++++++++++++ 8 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/AllgemeinTest/Box.jav create mode 100644 src/test/resources/AllgemeinTest/Box_Main.jav create mode 100644 src/test/resources/AllgemeinTest/wildcardPair.jav diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java b/src/main/java/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java index c99caa53..459ae46d 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java @@ -2,8 +2,10 @@ package de.dhbwstuttgart.syntaxtree; import de.dhbwstuttgart.core.IItemWithOffset; import de.dhbwstuttgart.exceptions.DebugException; +import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.syntaxtree.statement.Statement; +import de.dhbwstuttgart.syntaxtree.type.GenericRefType; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.visual.ASTPrinter; @@ -117,6 +119,18 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{ return new RefType(name, params, offset); } + /** + * + * @return die aktuelle Klasse als RefType + */ + public RefType generateTypeOfThisClass(){ + List params = new ArrayList<>(); + for(GenericTypeVar genericTypeVar : this.getGenerics()){ + //params.add(genericTypeVar.getTypePlaceholder()); + params.add(new GenericRefType(genericTypeVar.getName(), new NullToken())); + } + return new RefType(name, params, new NullToken()); + } /** * Die Superklasse im Kontext dieser ClassOrInterface * Das bedeutet, dass generische Variablen als GenericRefTypes dargestellt sind diff --git a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 2860e71b..ddc2dc92 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -687,7 +687,7 @@ public class TYPEStmt implements StatementVisitor{ if(cl.getClassName().equals(ofType.getName())){ for(Method m : cl.getConstructors()){ if(m.getParameterList().getFormalparalist().size() == argList.getArguments().size()){ - ret.add(new MethodAssumption(cl, ofType, convertParams(m.getParameterList(), + ret.add(new MethodAssumption(cl, cl.generateTypeOfThisClass(), convertParams(m.getParameterList(), info), createTypeScope(cl, m), m.isInherited)); } } diff --git a/src/test/java/AllgemeinTest.java b/src/test/java/AllgemeinTest.java index 92b2314a..79d932ad 100644 --- a/src/test/java/AllgemeinTest.java +++ b/src/test/java/AllgemeinTest.java @@ -44,7 +44,10 @@ public class AllgemeinTest { //String className = "TestSubTypless"; //String className = "addList"; //String className = "M"; - String className = "Wildcard_Andi"; + //String className = "Wildcard_Andi"; + //String className = "Box"; + //String className = "Box_Main"; + String className ="wildcardPair"; //PL 2019-10-24: genutzt fuer unterschiedliche Tests path = System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/" + className + ".jav"; //path = System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/Overloading_Generics.jav"; diff --git a/src/test/resources/AllgemeinTest/Box.jav b/src/test/resources/AllgemeinTest/Box.jav new file mode 100644 index 00000000..411f0551 --- /dev/null +++ b/src/test/resources/AllgemeinTest/Box.jav @@ -0,0 +1,13 @@ +class Box{ +void m(A a){} +} + +class B { } + +class Box_Main extends B { + + m(b) { + b.m(new Box_Main()); + b.m(new B()); + } +} diff --git a/src/test/resources/AllgemeinTest/Box_Main.jav b/src/test/resources/AllgemeinTest/Box_Main.jav new file mode 100644 index 00000000..dabf7bf2 --- /dev/null +++ b/src/test/resources/AllgemeinTest/Box_Main.jav @@ -0,0 +1,13 @@ +import java.lang.Object; +import java.lang.Integer; +import java.lang.String; + +class B { } + +class Box_Main extends B {//Fehler Bugzilla Bug 230 + + m(b) { + b.f = new Box_Main(); + b.f = new B(); + } +} diff --git a/src/test/resources/AllgemeinTest/Pair.java b/src/test/resources/AllgemeinTest/Pair.java index b506efa9..b47b1d84 100644 --- a/src/test/resources/AllgemeinTest/Pair.java +++ b/src/test/resources/AllgemeinTest/Pair.java @@ -2,6 +2,12 @@ class Pair { T x; U y; + public Pair() { } + public Pair(T x, U y) { + this.x = x; + this.y = y; + } + public T fst () { return x; } diff --git a/src/test/resources/AllgemeinTest/Wildcard_Andi.jav b/src/test/resources/AllgemeinTest/Wildcard_Andi.jav index 30ef7806..e6160437 100644 --- a/src/test/resources/AllgemeinTest/Wildcard_Andi.jav +++ b/src/test/resources/AllgemeinTest/Wildcard_Andi.jav @@ -3,6 +3,6 @@ class Wildcard_Andi { Test ex = new Test<>(); Test sup = new Test<>(); - } +} diff --git a/src/test/resources/AllgemeinTest/wildcardPair.jav b/src/test/resources/AllgemeinTest/wildcardPair.jav new file mode 100644 index 00000000..73f310f4 --- /dev/null +++ b/src/test/resources/AllgemeinTest/wildcardPair.jav @@ -0,0 +1,22 @@ +import java.util.List; +import java.lang.Integer; +import java.lang.Object; +import java.lang.Boolean; + +class wildcardPair { + + make(l) { + var p = new Pair(l.get(0), l.get(1)); + return p; + } + //Boolean compare(Pair x) { return true; } + void m(l) { + Object o = l.get(0); + + //Pair p; + //List b; + //this.compare(p); //1, type incorrect + make(l); + //this.compare(this.make(b)); //2, OK + } +} \ No newline at end of file