From 58110c474a87f4df10c2acd65552a5ce348c65b7 Mon Sep 17 00:00:00 2001 From: "pl@gohorb.ba-horb.de" Date: Thu, 2 May 2024 00:13:45 +0200 Subject: [PATCH 1/5] mathStrucInteger.jav funktioniert gerade nicht modified: resources/bytecode/javFiles/Matrix.jav modified: src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java modified: src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java modified: src/main/java/de/dhbwstuttgart/syntaxtree/statement/MethodCall.java modified: src/main/java/de/dhbwstuttgart/syntaxtree/statement/NewClass.java modified: src/main/java/de/dhbwstuttgart/syntaxtree/statement/SuperCall.java modified: src/main/java/de/dhbwstuttgart/syntaxtree/statement/ThisCall.java modified: src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java modified: src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java modified: src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java modified: src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java --- resources/bytecode/javFiles/Matrix.jav | 5 +++-- .../parser/SyntaxTreeGenerator/StatementGenerator.java | 8 ++++---- .../parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java | 4 ++-- .../de/dhbwstuttgart/syntaxtree/statement/MethodCall.java | 6 +++--- .../de/dhbwstuttgart/syntaxtree/statement/NewClass.java | 5 +++-- .../de/dhbwstuttgart/syntaxtree/statement/SuperCall.java | 5 +++-- .../de/dhbwstuttgart/syntaxtree/statement/ThisCall.java | 3 ++- .../typeinference/constraints/Constraint.java | 3 ++- .../dhbwstuttgart/typeinference/unify/TypeUnifyTask.java | 5 +++-- .../typeinference/unify/model/FiniteClosure.java | 5 +++++ .../typeinference/unify/model/ReferenceType.java | 6 ++++++ 11 files changed, 36 insertions(+), 19 deletions(-) diff --git a/resources/bytecode/javFiles/Matrix.jav b/resources/bytecode/javFiles/Matrix.jav index 35d65d51..31868108 100644 --- a/resources/bytecode/javFiles/Matrix.jav +++ b/resources/bytecode/javFiles/Matrix.jav @@ -1,3 +1,4 @@ +import java.util.AbstractList; import java.util.Vector; import java.lang.Integer; //import java.lang.Float; @@ -30,8 +31,8 @@ public class Matrix extends Vector> { var erg = 0; var k = 0; while(k < v1.size()) { - erg = erg + v1.elementAt(k) - * m.elementAt(k).elementAt(j); + erg = erg + v1.get(k) + * m.get(k).get(j); k++; } // v2.addElement(new Integer(erg)); v2.addElement(erg); diff --git a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java index b9aae9d3..54f6b680 100644 --- a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java +++ b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java @@ -279,7 +279,7 @@ public class StatementGenerator { if (!Objects.isNull(creator.classCreatorRest())) { ArgumentList args = convertArguments(creator.classCreatorRest().arguments().expressionList()); - ArrayList argTypes = args.getArguments().stream().map(x -> TypePlaceholder.fresh(creator.getStart())).collect(Collectors.toCollection(ArrayList::new)); + ArrayList argTypes = args.getArguments().stream().map(x -> TypePlaceholder.fresh(creator.getStart())).collect(Collectors.toCollection(ArrayList::new)); argTypes.add(TypePlaceholder.fresh(creator.getStart())); // return type Statement ret = new NewClass(newclass, args, null, argTypes, creator.getStart()); ret.setStatement(); @@ -311,7 +311,7 @@ public class StatementGenerator { IdentifierContext identifier = innercreator.identifier(); RefType newclass = (RefType) TypeGenerator.convertTypeName(identifier.getText(), genericArgs, identifier.getStart(), reg, generics); ArgumentList args = convertArguments(innercreator.classCreatorRest().arguments().expressionList()); - ArrayList argTypes = args.getArguments().stream().map(x -> TypePlaceholder.fresh(innercreator.getStart())).collect(Collectors.toCollection(ArrayList::new)); + ArrayList argTypes = args.getArguments().stream().map(x -> TypePlaceholder.fresh(innercreator.getStart())).collect(Collectors.toCollection(ArrayList::new)); Statement ret = new NewClass(newclass, args, null, argTypes, innercreator.getStart()); ret.setStatement(); return ret; @@ -712,7 +712,7 @@ public class StatementGenerator { } ArgumentList argumentList = convertArguments(expr.expressionList()); - ArrayList signature = argumentList.getArguments().stream().map(x -> (RefTypeOrTPHOrWildcardOrGeneric) TypePlaceholder.fresh(offset)).collect(Collectors.toCollection(ArrayList::new)); + ArrayList signature = argumentList.getArguments().stream().map(x -> TypePlaceholder.fresh(offset)).collect(Collectors.toCollection(ArrayList::new)); signature.add(TypePlaceholder.fresh(offset)); // return type MethodCall ret; @@ -737,7 +737,7 @@ public class StatementGenerator { name = expr.SUPER().getText(); } ArgumentList argumentList = convertArguments(expr.expressionList()); - ArrayList signature = argumentList.getArguments().stream().map(x -> (RefTypeOrTPHOrWildcardOrGeneric) TypePlaceholder.fresh(offset)).collect(Collectors.toCollection(ArrayList::new)); + ArrayList signature = argumentList.getArguments().stream().map(x -> TypePlaceholder.fresh(offset)).collect(Collectors.toCollection(ArrayList::new)); signature.add(TypePlaceholder.fresh(offset)); // return type MethodCall ret = new MethodCall(TypePlaceholder.fresh(offset), getReceiver(receiver), name, argumentList, TypePlaceholder.fresh(offset), signature, offset); ret.setStatement(); diff --git a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java index 111bf11c..003f2580 100644 --- a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java +++ b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java @@ -452,8 +452,8 @@ public class SyntaxTreeGenerator { protected static Block prepareBlock(Block constructorBlock, RefType superClass) { List statements = constructorBlock.getStatements(); if (statements.isEmpty() || !(statements.get(0) instanceof SuperCall || statements.get(0) instanceof ThisCall)) { - var signature = new ArrayList(); - signature.add(new Void(new NullToken())); + var signature = new ArrayList(); + signature.add(TypePlaceholder.fresh(new NullToken())); statements.add(0, new SuperCall(superClass, signature, constructorBlock.getOffset())); } /* statements.addAll(fieldInitializations); geloescht PL 2018-11-24 */ diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/MethodCall.java b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/MethodCall.java index e1deca0f..9dab74b2 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/MethodCall.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/MethodCall.java @@ -27,10 +27,10 @@ public class MethodCall extends Statement public RefTypeOrTPHOrWildcardOrGeneric receiverType; //sind Tphs, repraesentieren im Resultset die Signatur der aufgerufenen Methoden, letztes Element ist der Returntyp - public final ArrayList signature; + public final ArrayList signature; public MethodCall(RefTypeOrTPHOrWildcardOrGeneric retType, Receiver receiver, String methodName, ArgumentList argumentList, - RefTypeOrTPHOrWildcardOrGeneric receiverType, ArrayList signature, Token offset){ + RefTypeOrTPHOrWildcardOrGeneric receiverType, ArrayList signature, Token offset){ super(retType,offset); this.arglist = argumentList; this.name = methodName; @@ -40,7 +40,7 @@ public class MethodCall extends Statement if (signature == null) throw new NullPointerException(); } - public List signatureArguments() { + public List signatureArguments() { return signature.subList(0, signature.size() - 1); } diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/NewClass.java b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/NewClass.java index f27bc3e8..005ef001 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/NewClass.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/NewClass.java @@ -11,6 +11,7 @@ import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.StatementVisitor; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption; import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation; import de.dhbwstuttgart.typeinference.constraints.Constraint; @@ -30,9 +31,9 @@ public class NewClass extends MethodCall * @param start */ public NewClass(RefType newClass, ArgumentList args, RefTypeOrTPHOrWildcardOrGeneric receiverType, - ArrayList argTypes, Token start) { + ArrayList signature, Token start) { super(newClass, new ExpressionReceiver(new EmptyStmt(start)), newClass.getName().toString(), - args, receiverType, argTypes, start); + args, receiverType, signature, start); } @Override diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/SuperCall.java b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/SuperCall.java index e4a7ea01..ebd8cf17 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/SuperCall.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/SuperCall.java @@ -4,6 +4,7 @@ import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.syntaxtree.StatementVisitor; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.type.Void; import org.antlr.v4.runtime.Token; @@ -16,12 +17,12 @@ import java.util.List; public class SuperCall extends MethodCall { public SuperCall(RefTypeOrTPHOrWildcardOrGeneric receiverType, - ArrayList argTypes, Token offset){ + ArrayList argTypes, Token offset){ this(new ArgumentList(new ArrayList(), offset), receiverType, argTypes, offset); } public SuperCall(ArgumentList argumentList, RefTypeOrTPHOrWildcardOrGeneric receiverType, - ArrayList argTypes, Token offset){ + ArrayList argTypes, Token offset){ super(new Void(offset), new ExpressionReceiver(new Super(receiverType, offset)), "", argumentList, receiverType, argTypes, offset); } diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/ThisCall.java b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/ThisCall.java index ee4acc96..8739a619 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/statement/ThisCall.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/statement/ThisCall.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.syntaxtree.statement; import de.dhbwstuttgart.syntaxtree.Constructor; import de.dhbwstuttgart.syntaxtree.StatementVisitor; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.type.Void; import org.antlr.v4.runtime.Token; @@ -11,7 +12,7 @@ import java.util.ArrayList; public class ThisCall extends MethodCall { - public ThisCall(ArgumentList argumentList, RefTypeOrTPHOrWildcardOrGeneric receiverType, ArrayList argTypes, Token offset) { + public ThisCall(ArgumentList argumentList, RefTypeOrTPHOrWildcardOrGeneric receiverType, ArrayList argTypes, Token offset) { super(new Void(offset), new ExpressionReceiver(new This(offset)), "", argumentList, receiverType, argTypes, offset); } diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java index ffac994b..07a2e9d2 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java @@ -57,7 +57,8 @@ public class Constraint extends HashSet { } public String toString() { - return super.toString() + "\nisInherited = " + isInherited + return super.toString() + "\nisInherited = " + isInherited + + methodSignatureConstraint //" + extendsContraint: " + (extendConstraint != null ? extendConstraint.toStringBase() : "null" ) + "\n" ; } diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 130658dc..38f47e9e 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -253,13 +253,14 @@ public class TypeUnifyTask extends RecursiveTask>> { one = true; Set neweq = new HashSet<>(eq); /* 1-elementige Oder-Constraints werden in und-Constraints umgewandelt */ + Set methodSignatureConstraint = new HashSet<>(); oderConstraintsField.stream() .filter(x -> x.size()==1) - .map(y -> y.stream().findFirst().get()).forEach(x -> neweq.addAll(x)); + .map(y -> y.stream().findFirst().get()).forEach(x -> { neweq.addAll(x); methodSignatureConstraint.addAll(x.getmethodSignatureConstraint());} ); ArrayList>> remainingOderconstraints = oderConstraintsField.stream() .filter(x -> x.size()>1) .collect(Collectors.toCollection(ArrayList::new)); - Set> res = unify(neweq, remainingOderconstraints, fc, parallel, rekTiefeField, new HashSet<>()); + Set> res = unify(neweq, remainingOderconstraints, fc, parallel, rekTiefeField, methodSignatureConstraint); noOfThread--; try { logFile.close(); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java index 4ef94fba..96bf1bb3 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java @@ -36,6 +36,7 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify; import de.dhbwstuttgart.util.Pair; import org.antlr.v4.runtime.Token; +import org.apache.commons.io.output.NullWriter; /** * The finite closure for the type unification @@ -140,6 +141,10 @@ implements IFiniteClosure { } } + public FiniteClosure(Set constraints, Writer writer) { + this(constraints, writer, null); + } + void testSmaller() { UnifyType tq1, tq2, tq3; tq1 = new ExtendsType(PlaceholderType.freshPlaceholder()); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java index 0b1f50c8..62465b1a 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java @@ -34,6 +34,12 @@ public class ReferenceType extends UnifyType { this.genericTypeVar = genericTypeVar; } + public ReferenceType(String name, UnifyType... params) { + super(name, new TypeParams(params)); + hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode(); + genericTypeVar = false; + } + public ReferenceType(String name, TypeParams params) { super(name, params); hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode(); From 71dfe5d9e1b8e9a7fc60ff4c372cd0080360b520 Mon Sep 17 00:00:00 2001 From: "pl@gohorb.ba-horb.de" Date: Thu, 2 May 2024 16:33:37 +0200 Subject: [PATCH 2/5] Bei diesem und vorigen Commit wurde der Bug #328 https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore/issues/328 geloest. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java in der Methode copute wurden die methodSignatureConstraints der bereits zu Beginn aufegloesten einer Oder Constraints in die Methodconstraints der Unifikation geschrieben 2. Elementtyp der linken Seiten der methodSignatureConstraints wurden von RefTypeOrTPHOrWildcardOrGeneric auf TypePlaceholder geaendert, weil dort nur TypePlaceholder geaendert. 3. src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java in der Methode prepareBlock wurde der Typ des Rückgabewerts des supercalls von Void auf eine Freshtpevar gesetzt. 4. src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java in der unify2-Methode wurde am Ende der Aufruf der Substitution nach Hinzufuegen der Methodconstraints auskommentiert -> hat zu nicht geloesten Constraints gefuehrt. modified: src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java modified: src/test/java/TestComplete.java --- .../de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java | 2 ++ src/test/java/TestComplete.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 38f47e9e..90a1b31b 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -599,11 +599,13 @@ public class TypeUnifyTask extends RecursiveTask>> { eqPrimePrimeSet.forEach(x -> x.addAll(methodSignatureConstraint)); //Substitutionen in methodcontraintsets werdne ausgeführt + /* PL auskommentiert 2024-05-02 eqPrimePrimeSet = eqPrimePrimeSet.stream().map( x -> { Optional> help = rules.subst(x); return help.isPresent() ? help.get(): x; }).collect(Collectors.toSet()); + */ /* * Ende */ diff --git a/src/test/java/TestComplete.java b/src/test/java/TestComplete.java index 160bc5aa..ff42eabc 100644 --- a/src/test/java/TestComplete.java +++ b/src/test/java/TestComplete.java @@ -180,7 +180,7 @@ public class TestComplete { } @Test - @Ignore() + //@Ignore() public void matrixOpTest() throws Exception { var classFiles = generateClassFiles(new ByteArrayClassLoader(), "MatrixOP.jav"); var matrixOP = classFiles.get("MatrixOP"); From 154d4823e43d53edb1e4c72f2f2b56df58f4e1a5 Mon Sep 17 00:00:00 2001 From: "pl@gohorb.ba-horb.de" Date: Wed, 8 May 2024 00:14:21 +0200 Subject: [PATCH 3/5] isOverridden eingefuegt. Problem beim Konvertioeren modified: ../src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java modified: ../src/main/java/de/dhbwstuttgart/syntaxtree/Method.java modified: ../src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java --- .../de/dhbwstuttgart/core/JavaTXCompiler.java | 4 ++-- .../de/dhbwstuttgart/syntaxtree/Method.java | 11 +++++++++- .../syntaxtree/factory/ASTFactory.java | 18 +++++++++++++---- .../assumptions/MethodAssumption.java | 8 +++++++- .../typeinference/constraints/Constraint.java | 15 ++++++++++---- .../constraints/ConstraintSet.java | 1 + .../typeinference/typeAlgo/TYPEStmt.java | 14 ++++++------- .../typeinference/unify/RuleSet.java | 3 ++- .../typeinference/unify/TypeUnifyTask.java | 6 +++++- .../unify/model/FiniteClosure.java | 20 ++++++++++++------- 10 files changed, 72 insertions(+), 28 deletions(-) diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index b1b2aa2f..068f1784 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -66,7 +66,7 @@ public class JavaTXCompiler { Boolean resultmodel = true; public final Map sourceFiles = new HashMap<>(); - Boolean log = false; //gibt an ob ein Log-File nach System.getProperty("user.dir")+""/logFiles/"" geschrieben werden soll? + Boolean log = true; //gibt an ob ein Log-File nach System.getProperty("user.dir")+""/logFiles/"" geschrieben werden soll? public volatile UnifyTaskModel usedTasks = new UnifyTaskModel(); public final DirectoryClassLoader classLoader; @@ -207,7 +207,7 @@ public class JavaTXCompiler { cl.getMethods().add(new Method(m.modifier, m.name, m.getReturnType().acceptTV(new TypeExchanger(gtvs)), newParaList, m.block, // new GenericDeclarationList(newGenericsList, // ((GenericDeclarationList)m.getGenerics()).getOffset()), - (GenericDeclarationList) m.getGenerics(), m.getOffset(), true)); + (GenericDeclarationList) m.getGenerics(), m.getOffset(), true, false)); } } diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java b/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java index 97b18bcd..fff2386a 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java @@ -33,6 +33,7 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope private GenericDeclarationList generics; private final RefTypeOrTPHOrWildcardOrGeneric returnType; public final Boolean isInherited; + public final Boolean isOverridden; /* * its Constraints @@ -50,10 +51,11 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope this.block = block; this.generics = gtvDeclarations; this.isInherited = false; + this.isOverridden = false; } public Method(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, ParameterList parameterList, Block block, - GenericDeclarationList gtvDeclarations, Token offset, Boolean isInherited) { + GenericDeclarationList gtvDeclarations, Token offset, Boolean isInherited, Boolean isOverridden) { super(offset); this.name = name; this.modifier = modifier; @@ -62,6 +64,7 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope this.block = block; this.generics = gtvDeclarations; this.isInherited = isInherited; + this.isOverridden = isOverridden; } public ParameterList getParameterList() { @@ -107,4 +110,10 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope public int hashCode() { return Objects.hash(name, parameterlist, returnType); } + + @Override + public String toString() { + return name; + + } } diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index 020eb6a0..76066d41 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -105,11 +105,21 @@ public class ASTFactory { allInheritedMethods.removeAll(allDeclaredMethods); for (java.lang.reflect.Method method : allDeclaredMethods) { var signature = methodSignatures.get(new Pair<>(method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method))); - methoden.add(createMethod(method, signature, jreClass, false)); + if (jreClass.getSuperclass()==null) { + methoden.add(createMethod(method, signature, jreClass, false, false)); + } + else try { + jreClass.getSuperclass().getDeclaredMethod(method.getName(), method.getParameterTypes()); + methoden.add(createMethod(method, signature, jreClass, false, true)); + } + catch (java.lang.NoSuchMethodException e) + { + methoden.add(createMethod(method, signature, jreClass, false, false)); + } } for (java.lang.reflect.Method method : allInheritedMethods) { var signature = methodSignatures.get(new Pair<>(method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method))); - methoden.add(createMethod(method, signature, jreClass, true)); + methoden.add(createMethod(method, signature, jreClass, true, false)); } List felder = new ArrayList<>(); for (java.lang.reflect.Field field : jreClass.getDeclaredFields()) { @@ -192,7 +202,7 @@ public class ASTFactory { return Optional.of(new de.dhbwstuttgart.syntaxtree.Constructor(modifier, name, returnType, parameterList, block, gtvDeclarations, offset /* , new ArrayList<>() geloescht PL 2018-11-24 */)); } - public static Method createMethod(java.lang.reflect.Method jreMethod, String signature, java.lang.Class inClass, Boolean isInherited) { + public static Method createMethod(java.lang.reflect.Method jreMethod, String signature, java.lang.Class inClass, Boolean isInherited, Boolean isOverridden) { String name = jreMethod.getName(); RefTypeOrTPHOrWildcardOrGeneric returnType; Type jreRetType; @@ -218,7 +228,7 @@ public class ASTFactory { GenericDeclarationList gtvDeclarations = createGenerics(jreMethod.getTypeParameters(), inClass, jreMethod.getName(), signature); Token offset = new NullToken(); - return new Method(jreMethod.getModifiers(), name, returnType, parameterList, block, gtvDeclarations, offset, isInherited); + return new Method(jreMethod.getModifiers(), name, returnType, parameterList, block, gtvDeclarations, offset, isInherited, isOverridden); } public static GenericDeclarationList createGenerics(TypeVariable[] typeParameters, Class context, String methodName, String signature) { diff --git a/src/main/java/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java b/src/main/java/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java index e4a92c02..b03ff1dd 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java @@ -20,14 +20,16 @@ public class MethodAssumption extends Assumption{ private RefTypeOrTPHOrWildcardOrGeneric retType; List params; private final Boolean isInherited; + private final Boolean isOverridden; public MethodAssumption(ClassOrInterface receiver, RefTypeOrTPHOrWildcardOrGeneric retType, - List params, TypeScope scope, Boolean isInherited){ + List params, TypeScope scope, Boolean isInherited, Boolean isOverridden){ super(scope); this.receiver = receiver; this.retType = retType; this.params = params; this.isInherited = isInherited; + this.isOverridden = isOverridden; } /* @@ -74,4 +76,8 @@ public class MethodAssumption extends Assumption{ public Boolean isInherited() { return isInherited; } + + public Boolean isOverridden() { + return isOverridden; + } } diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java index 07a2e9d2..0ac2a84e 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java @@ -8,7 +8,8 @@ import java.util.Set; public class Constraint extends HashSet { private static final long serialVersionUID = 1L; - private Boolean isInherited = false;//wird nur für die Method-Constraints benoetigt + private Boolean isInherited = false;//wird beides nur für die Method-Constraints benoetigt + private Boolean isOverridden = false; /* * wird verwendet um bei der Codegenerierung die richtige Methoden - Signatur @@ -22,12 +23,14 @@ public class Constraint extends HashSet { super(); } - public Constraint(Boolean isInherited) { + public Constraint(Boolean isInherited, Boolean isOverridden) { this.isInherited = isInherited; + this.isOverridden = isOverridden; } - public Constraint(Boolean isInherited, Constraint extendConstraint, Set methodSignatureConstraint) { + public Constraint(Boolean isInherited, Boolean isOverridden, Constraint extendConstraint, Set methodSignatureConstraint) { this.isInherited = isInherited; + this.isOverridden = isOverridden; this.extendConstraint = extendConstraint; this.methodSignatureConstraint = methodSignatureConstraint; } @@ -40,6 +43,10 @@ public class Constraint extends HashSet { return isInherited; } + public Boolean isOverridden() { + return isInherited; + } + public Constraint getExtendConstraint() { return extendConstraint; } @@ -57,7 +64,7 @@ public class Constraint extends HashSet { } public String toString() { - return super.toString() + "\nisInherited = " + isInherited + return super.toString() + "\nisInherited = " + isInherited + " isOveridden = " + isOverridden + methodSignatureConstraint //" + extendsContraint: " + (extendConstraint != null ? extendConstraint.toStringBase() : "null" ) + "\n" ; diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java index f52001b3..f438c664 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java @@ -77,6 +77,7 @@ public class ConstraintSet { .map(o) .collect(Collectors.toCollection(( () -> new Constraint (as.isInherited(), + as.isOverridden(), (as.getExtendConstraint() != null) ? as.getExtendConstraint().stream().map(o).collect(Collectors.toCollection(Constraint::new)) : null, diff --git a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index cabe5f87..722e5e2f 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -591,7 +591,7 @@ public class TYPEStmt implements StatementVisitor { for (var ctor : clazz.getConstructors()) { var params = convertParams(ctor.getParameterList(), info); if (params.size() != superCall.arglist.getArguments().size()) continue; - var assumption = new MethodAssumption(null, new Void(new NullToken()), params, createTypeScope(clazz, ctor), ctor.isInherited); + var assumption = new MethodAssumption(null, new Void(new NullToken()), params, createTypeScope(clazz, ctor), ctor.isInherited, false); GenericsResolver resolver = getResolverInstance(); Set> oneMethodConstraints = generateConstraint(superCall, assumption, info, resolver); @@ -607,7 +607,7 @@ public class TYPEStmt implements StatementVisitor { for (var ctor : info.getCurrentClass().getConstructors()) { var params = convertParams(ctor.getParameterList(), info); if (params.size() != thisCall.arglist.getArguments().size()) continue; - var assumption = new MethodAssumption(null, new Void(new NullToken()), params, createTypeScope(info.getCurrentClass(), ctor), ctor.isInherited); + var assumption = new MethodAssumption(null, new Void(new NullToken()), params, createTypeScope(info.getCurrentClass(), ctor), ctor.isInherited, false); GenericsResolver resolver = getResolverInstance(); Set> oneMethodConstraints = generateConstraint(thisCall, assumption, info, resolver); @@ -640,8 +640,8 @@ public class TYPEStmt implements StatementVisitor { protected Set> generateConstraint(MethodCall forMethod, MethodAssumption assumption, TypeInferenceBlockInformation info, GenericsResolver resolver) { Constraint methodConstraint, extendsMethodConstraint; - methodConstraint = new Constraint<>(assumption.isInherited()); - extendsMethodConstraint = new Constraint<>(assumption.isInherited());// PL 2023-01-24: Ersetzt die Dopplung in visit(MethodCall) + methodConstraint = new Constraint<>(assumption.isInherited(), assumption.isOverridden()); + extendsMethodConstraint = new Constraint<>(assumption.isInherited(), assumption.isOverridden());// PL 2023-01-24: Ersetzt die Dopplung in visit(MethodCall) ClassOrInterface receiverCl = assumption.getReceiver(); /* @@ -746,14 +746,14 @@ public class TYPEStmt implements StatementVisitor { public RefTypeOrTPHOrWildcardOrGeneric getReturnType() { throw new NotImplementedException(); } - }, false)); + }, false, false)); } for (ClassOrInterface cl : info.getAvailableClasses()) { for (Method m : cl.getMethods()) { if (m.getName().equals(name) && m.getParameterList().getFormalparalist().size() == numArgs) { RefTypeOrTPHOrWildcardOrGeneric retType = m.getReturnType();// info.checkGTV(m.getReturnType()); - ret.add(new MethodAssumption(cl, retType, convertParams(m.getParameterList(), info), createTypeScope(cl, m), m.isInherited)); + ret.add(new MethodAssumption(cl, retType, convertParams(m.getParameterList(), info), createTypeScope(cl, m), m.isInherited, m.isOverridden)); } } } @@ -785,7 +785,7 @@ public class TYPEStmt implements StatementVisitor { for (Method m : cl.getConstructors()) { if (m.getParameterList().getFormalparalist().size() == argList.getArguments().size()) { var params = convertParams(m.getParameterList(), info); - ret.add(new MethodAssumption(cl, cl.generateTypeOfThisClass(), params, createTypeScope(cl, m), m.isInherited)); + ret.add(new MethodAssumption(cl, cl.generateTypeOfThisClass(), params, createTypeScope(cl, m), m.isInherited, m.isOverridden)); } } } diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java index a3d2474c..2d2fa758 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java @@ -702,9 +702,10 @@ public class RuleSet implements IRuleSet{ x -> uni.apply(pair,x)).collect(Collectors.toCollection((b.getExtendConstraint() != null) ? () -> new Constraint( b.isInherited(), + b.isOverridden(), b.getExtendConstraint().stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(Constraint::new)), b.getmethodSignatureConstraint().stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(HashSet::new))) - : () -> new Constraint(b.isInherited()) + : () -> new Constraint(b.isInherited(), b.isOverridden()) )); oderConstraints.replaceAll(oc -> oc.stream().map(applyUni).collect(Collectors.toCollection(HashSet::new))); /* diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 90a1b31b..8371477b 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -816,6 +816,7 @@ public class TypeUnifyTask extends RecursiveTask>> { writeLog("nextSetasList: " + nextSetasList.toString()); if (variance == 1) { a = oup.max(nextSetasList.iterator()); + writeLog("Max: a in " + variance + " "+ a); nextSetasList.remove(a); if (oderConstraint) { nextSetasListOderConstraints.add(((Constraint)a).getExtendConstraint()); @@ -1353,12 +1354,15 @@ public class TypeUnifyTask extends RecursiveTask>> { while(aParDefIt.hasNext()) { Set a_new = aParDefIt.next(); List> smallerSetasList = oup.smallerThan(a_new, nextSetasList); + writeLog("smallerSetasList: " + smallerSetasList); List> notInherited = smallerSetasList.stream() - .filter(x -> !((Constraint)x).isInherited()) + .filter(x -> !((Constraint)x).isInherited() && !((Constraint)x).isOverridden()) .collect(Collectors.toCollection(ArrayList::new)); + writeLog("notInherited: " + notInherited+"\n"); List> notErased = new ArrayList<>(); notInherited.stream().forEach(x -> { notErased.addAll(oup.smallerEqThan(x, smallerSetasList)); }); List> erased = new ArrayList<>(smallerSetasList); + writeLog("notErased: " + notErased+"\n"); erased.removeAll(notErased); nextSetasList.removeAll(erased); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java index 96bf1bb3..d6514c67 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java @@ -699,7 +699,7 @@ implements IFiniteClosure { */ public int compare (UnifyType left, UnifyType right, PairOperator pairop) { - //try {logFile.write("left: "+ left + " right: " + right + " pairop: " + pairop);} catch (IOException ie) {} + try {logFile.write("left: "+ left + " right: " + right + " pairop: " + pairop +"\n");} catch (IOException ie) {} if (left.getName().equals("Matrix") || right.getName().equals("Matrix")) System.out.println(""); /* @@ -756,15 +756,15 @@ implements IFiniteClosure { HashSet hs = new HashSet<>(); hs.add(up); Set smallerRes = unifyTask.applyTypeUnificationRules(hs, this); - /* - //if (left.getName().equals("Matrix") || right.getName().equals("Matrix")) + + //if (left.getName().equals("Vector") || right.getName().equals("AbstractList")) {try { logFile.write("\nsmallerRes: " + smallerRes);//"smallerHash: " + greaterHash.toString()); logFile.flush(); } catch (IOException e) { System.err.println("no LogFile");}} - */ + //Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok. Predicate delFun = x -> !((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType) @@ -772,6 +772,12 @@ implements IFiniteClosure { ((WildcardType)x.getLhsType()).getWildcardedType().equals(x.getRhsType())) ); long smallerLen = smallerRes.stream().filter(delFun).count(); + try { + logFile.write("\nsmallerLen: " + smallerLen +"\n"); + logFile.flush(); + } + catch (IOException e) { + System.err.println("no LogFile");} if (smallerLen == 0) return -1; else { up = new UnifyPair(right, left, pairop); @@ -779,15 +785,15 @@ implements IFiniteClosure { hs = new HashSet<>(); hs.add(up); Set greaterRes = unifyTask.applyTypeUnificationRules(hs, this); - /* - //if (left.getName().equals("Matrix") || right.getName().equals("Matrix")) + + //if (left.getName().equals("Vector") || right.getName().equals("AbstractList")) {try { logFile.write("\ngreaterRes: " + greaterRes);//"smallerHash: " + greaterHash.toString()); logFile.flush(); } catch (IOException e) { System.err.println("no LogFile");}} - */ + //Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok. long greaterLen = greaterRes.stream().filter(delFun).count(); if (greaterLen == 0) return 1; From 021b7ec9febc9ec339ffd4d594bc12556ada2588 Mon Sep 17 00:00:00 2001 From: "pl@gohorb.ba-horb.de" Date: Wed, 8 May 2024 09:07:22 +0200 Subject: [PATCH 4/5] Fehler vom vorigen korriert Commit modified: ../resources/bytecode/javFiles/Matrix.jav modified: ../src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java modified: ../src/test/java/TestComplete.java --- resources/bytecode/javFiles/Matrix.jav | 2 +- .../de/dhbwstuttgart/typeinference/constraints/Constraint.java | 2 +- .../dhbwstuttgart/typeinference/constraints/ConstraintSet.java | 2 +- src/test/java/TestComplete.java | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/bytecode/javFiles/Matrix.jav b/resources/bytecode/javFiles/Matrix.jav index 31868108..bac0b88a 100644 --- a/resources/bytecode/javFiles/Matrix.jav +++ b/resources/bytecode/javFiles/Matrix.jav @@ -1,4 +1,4 @@ -import java.util.AbstractList; +import java.util.List; import java.util.Vector; import java.lang.Integer; //import java.lang.Float; diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java index 0ac2a84e..dd5b84da 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java @@ -44,7 +44,7 @@ public class Constraint extends HashSet { } public Boolean isOverridden() { - return isInherited; + return isOverridden; } public Constraint getExtendConstraint() { diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java index f438c664..c3fc5520 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java @@ -71,7 +71,7 @@ public class ConstraintSet { for(Set> oderConstraint : oderConstraints){ newOder.add( - oderConstraint.parallelStream().map((Constraint as) -> { + oderConstraint.stream().map((Constraint as) -> { Constraint newConst = as.stream() .map(o) diff --git a/src/test/java/TestComplete.java b/src/test/java/TestComplete.java index ff42eabc..b121f834 100644 --- a/src/test/java/TestComplete.java +++ b/src/test/java/TestComplete.java @@ -4,6 +4,7 @@ import org.junit.Ignore; import org.junit.Test; import java.lang.reflect.*; +import java.util.AbstractList; import java.util.Arrays; import java.util.List; import java.util.Vector; @@ -263,7 +264,7 @@ public class TestComplete { var instanceOfClass_m2 = matrix.getDeclaredConstructor(Vector.class).newInstance(vv1); - var mul = matrix.getDeclaredMethod("mul", Vector.class); + var mul = matrix.getDeclaredMethod("mul", List.class); var result = mul.invoke(instanceOfClass_m1, instanceOfClass_m2); System.out.println(instanceOfClass_m1.toString() + " * " + instanceOfClass_m2.toString() + " = " + result.toString()); From 2221b559ca9c89293d2cfbbe39d2d6a58fcf0b33 Mon Sep 17 00:00:00 2001 From: "pl@gohorb.ba-horb.de" Date: Fri, 10 May 2024 14:16:23 +0200 Subject: [PATCH 5/5] Implementierungen von Interfaces eingefuegt und Overriding ersetzt durch implementierung modified: ../src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java Overriding ersetzt durch implementierung (Umbennennung) modified: ../resources/bytecode/javFiles/Matrix.jav modified: ../src/main/java/de/dhbwstuttgart/syntaxtree/Method.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java modified: ../src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java --- resources/bytecode/javFiles/Matrix.jav | 1 + .../de/dhbwstuttgart/syntaxtree/Method.java | 6 +-- .../syntaxtree/factory/ASTFactory.java | 47 ++++++++++++++----- .../typeinference/constraints/Constraint.java | 16 +++---- .../constraints/ConstraintSet.java | 2 +- .../typeinference/typeAlgo/TYPEStmt.java | 4 +- .../typeinference/unify/RuleSet.java | 4 +- .../typeinference/unify/TypeUnifyTask.java | 2 +- 8 files changed, 54 insertions(+), 28 deletions(-) diff --git a/resources/bytecode/javFiles/Matrix.jav b/resources/bytecode/javFiles/Matrix.jav index bac0b88a..63bd8bb4 100644 --- a/resources/bytecode/javFiles/Matrix.jav +++ b/resources/bytecode/javFiles/Matrix.jav @@ -1,4 +1,5 @@ import java.util.List; +import java.util.AbstractList; import java.util.Vector; import java.lang.Integer; //import java.lang.Float; diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java b/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java index fff2386a..27c17b2e 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/Method.java @@ -33,7 +33,7 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope private GenericDeclarationList generics; private final RefTypeOrTPHOrWildcardOrGeneric returnType; public final Boolean isInherited; - public final Boolean isOverridden; + public final Boolean isImplemented; /* * its Constraints @@ -51,7 +51,7 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope this.block = block; this.generics = gtvDeclarations; this.isInherited = false; - this.isOverridden = false; + this.isImplemented = false; } public Method(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, ParameterList parameterList, Block block, @@ -64,7 +64,7 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope this.block = block; this.generics = gtvDeclarations; this.isInherited = isInherited; - this.isOverridden = isOverridden; + this.isImplemented = isOverridden; } public ParameterList getParameterList() { diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index 76066d41..63767c4d 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -108,15 +108,40 @@ public class ASTFactory { if (jreClass.getSuperclass()==null) { methoden.add(createMethod(method, signature, jreClass, false, false)); } - else try { - jreClass.getSuperclass().getDeclaredMethod(method.getName(), method.getParameterTypes()); - methoden.add(createMethod(method, signature, jreClass, false, true)); - } - catch (java.lang.NoSuchMethodException e) - { - methoden.add(createMethod(method, signature, jreClass, false, false)); - } - } + else { + Boolean isImplemented = false; + isImplemented = Arrays.stream(jreClass.getInterfaces()). + reduce(false, + (x,y) -> { + try { + y.getDeclaredMethod(method.getName(), method.getParameterTypes()); + return true; + } + catch (java.lang.NoSuchMethodException e) { + return false; + }}, + (x,y) -> (x || y) + ); + + if (isImplemented) { + methoden.add(createMethod(method, signature, jreClass, false, true)); + } + else { + if (Modifier.isAbstract(jreClass.getSuperclass().getModifiers())) { + try { + jreClass.getSuperclass().getDeclaredMethod(method.getName(), method.getParameterTypes()); + methoden.add(createMethod(method, signature, jreClass, false, true)); + } + catch (java.lang.NoSuchMethodException e) { + methoden.add(createMethod(method, signature, jreClass, false, false)); + } + } + else { + methoden.add(createMethod(method, signature, jreClass, false, false)); + } + + } + }} for (java.lang.reflect.Method method : allInheritedMethods) { var signature = methodSignatures.get(new Pair<>(method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method))); methoden.add(createMethod(method, signature, jreClass, true, false)); @@ -202,7 +227,7 @@ public class ASTFactory { return Optional.of(new de.dhbwstuttgart.syntaxtree.Constructor(modifier, name, returnType, parameterList, block, gtvDeclarations, offset /* , new ArrayList<>() geloescht PL 2018-11-24 */)); } - public static Method createMethod(java.lang.reflect.Method jreMethod, String signature, java.lang.Class inClass, Boolean isInherited, Boolean isOverridden) { + public static Method createMethod(java.lang.reflect.Method jreMethod, String signature, java.lang.Class inClass, Boolean isInherited, Boolean isImplemented) { String name = jreMethod.getName(); RefTypeOrTPHOrWildcardOrGeneric returnType; Type jreRetType; @@ -228,7 +253,7 @@ public class ASTFactory { GenericDeclarationList gtvDeclarations = createGenerics(jreMethod.getTypeParameters(), inClass, jreMethod.getName(), signature); Token offset = new NullToken(); - return new Method(jreMethod.getModifiers(), name, returnType, parameterList, block, gtvDeclarations, offset, isInherited, isOverridden); + return new Method(jreMethod.getModifiers(), name, returnType, parameterList, block, gtvDeclarations, offset, isInherited, isImplemented); } public static GenericDeclarationList createGenerics(TypeVariable[] typeParameters, Class context, String methodName, String signature) { diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java index dd5b84da..970cffef 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.java @@ -9,7 +9,7 @@ import java.util.Set; public class Constraint extends HashSet { private static final long serialVersionUID = 1L; private Boolean isInherited = false;//wird beides nur für die Method-Constraints benoetigt - private Boolean isOverridden = false; + private Boolean isImplemented = false; /* * wird verwendet um bei der Codegenerierung die richtige Methoden - Signatur @@ -23,14 +23,14 @@ public class Constraint extends HashSet { super(); } - public Constraint(Boolean isInherited, Boolean isOverridden) { + public Constraint(Boolean isInherited, Boolean isImplemented) { this.isInherited = isInherited; - this.isOverridden = isOverridden; + this.isImplemented = isImplemented; } - public Constraint(Boolean isInherited, Boolean isOverridden, Constraint extendConstraint, Set methodSignatureConstraint) { + public Constraint(Boolean isInherited, Boolean isImplemented, Constraint extendConstraint, Set methodSignatureConstraint) { this.isInherited = isInherited; - this.isOverridden = isOverridden; + this.isImplemented = isImplemented; this.extendConstraint = extendConstraint; this.methodSignatureConstraint = methodSignatureConstraint; } @@ -43,8 +43,8 @@ public class Constraint extends HashSet { return isInherited; } - public Boolean isOverridden() { - return isOverridden; + public Boolean isImplemented() { + return isImplemented; } public Constraint getExtendConstraint() { @@ -64,7 +64,7 @@ public class Constraint extends HashSet { } public String toString() { - return super.toString() + "\nisInherited = " + isInherited + " isOveridden = " + isOverridden + return super.toString() + "\nisInherited = " + isInherited + " isOveridden = " + isImplemented + methodSignatureConstraint //" + extendsContraint: " + (extendConstraint != null ? extendConstraint.toStringBase() : "null" ) + "\n" ; diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java index c3fc5520..14821895 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java @@ -77,7 +77,7 @@ public class ConstraintSet { .map(o) .collect(Collectors.toCollection(( () -> new Constraint (as.isInherited(), - as.isOverridden(), + as.isImplemented(), (as.getExtendConstraint() != null) ? as.getExtendConstraint().stream().map(o).collect(Collectors.toCollection(Constraint::new)) : null, diff --git a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 722e5e2f..be402d08 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -753,7 +753,7 @@ public class TYPEStmt implements StatementVisitor { if (m.getName().equals(name) && m.getParameterList().getFormalparalist().size() == numArgs) { RefTypeOrTPHOrWildcardOrGeneric retType = m.getReturnType();// info.checkGTV(m.getReturnType()); - ret.add(new MethodAssumption(cl, retType, convertParams(m.getParameterList(), info), createTypeScope(cl, m), m.isInherited, m.isOverridden)); + ret.add(new MethodAssumption(cl, retType, convertParams(m.getParameterList(), info), createTypeScope(cl, m), m.isInherited, m.isImplemented)); } } } @@ -785,7 +785,7 @@ public class TYPEStmt implements StatementVisitor { for (Method m : cl.getConstructors()) { if (m.getParameterList().getFormalparalist().size() == argList.getArguments().size()) { var params = convertParams(m.getParameterList(), info); - ret.add(new MethodAssumption(cl, cl.generateTypeOfThisClass(), params, createTypeScope(cl, m), m.isInherited, m.isOverridden)); + ret.add(new MethodAssumption(cl, cl.generateTypeOfThisClass(), params, createTypeScope(cl, m), m.isInherited, m.isImplemented)); } } } diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java index 2d2fa758..275755b2 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java @@ -702,10 +702,10 @@ public class RuleSet implements IRuleSet{ x -> uni.apply(pair,x)).collect(Collectors.toCollection((b.getExtendConstraint() != null) ? () -> new Constraint( b.isInherited(), - b.isOverridden(), + b.isImplemented(), b.getExtendConstraint().stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(Constraint::new)), b.getmethodSignatureConstraint().stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(HashSet::new))) - : () -> new Constraint(b.isInherited(), b.isOverridden()) + : () -> new Constraint(b.isInherited(), b.isImplemented()) )); oderConstraints.replaceAll(oc -> oc.stream().map(applyUni).collect(Collectors.toCollection(HashSet::new))); /* diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 8371477b..6cbfddb0 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -1356,7 +1356,7 @@ public class TypeUnifyTask extends RecursiveTask>> { List> smallerSetasList = oup.smallerThan(a_new, nextSetasList); writeLog("smallerSetasList: " + smallerSetasList); List> notInherited = smallerSetasList.stream() - .filter(x -> !((Constraint)x).isInherited() && !((Constraint)x).isOverridden()) + .filter(x -> !((Constraint)x).isInherited() && !((Constraint)x).isImplemented()) .collect(Collectors.toCollection(ArrayList::new)); writeLog("notInherited: " + notInherited+"\n"); List> notErased = new ArrayList<>();