From 672373fc8d5d0cf1179b5c2ba37853d9ed1e8de2 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 10 Jan 2018 12:11:51 +0100 Subject: [PATCH 01/65] --amend --- .../dhbwstuttgart/syntaxtree/type/RefType.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/de/dhbwstuttgart/syntaxtree/type/RefType.java b/src/de/dhbwstuttgart/syntaxtree/type/RefType.java index 4cf85297..edd0c49f 100644 --- a/src/de/dhbwstuttgart/syntaxtree/type/RefType.java +++ b/src/de/dhbwstuttgart/syntaxtree/type/RefType.java @@ -29,14 +29,16 @@ public class RefType extends RefTypeOrTPHOrWildcardOrGeneric @Override public String toString(){ - String params = "<"; - Iterator it = parameter.iterator(); - while(it.hasNext()){ - RefTypeOrTPHOrWildcardOrGeneric param = it.next(); - params += param.toString(); - if(it.hasNext())params += ", "; + String params = ""; + if(parameter.size()>0){ + Iterator it = parameter.iterator(); + while(it.hasNext()){ + RefTypeOrTPHOrWildcardOrGeneric param = it.next(); + params += param.toString(); + if(it.hasNext())params += ", "; + } + params += ">"; } - params += ">"; return this.name.toString() + params; } From b1b1cfdc54f259d987865f0f9663a88313333323 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 10 Jan 2018 12:14:20 +0100 Subject: [PATCH 02/65] --amend --- src/de/dhbwstuttgart/syntaxtree/type/RefType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/de/dhbwstuttgart/syntaxtree/type/RefType.java b/src/de/dhbwstuttgart/syntaxtree/type/RefType.java index edd0c49f..3c9a5907 100644 --- a/src/de/dhbwstuttgart/syntaxtree/type/RefType.java +++ b/src/de/dhbwstuttgart/syntaxtree/type/RefType.java @@ -31,6 +31,7 @@ public class RefType extends RefTypeOrTPHOrWildcardOrGeneric public String toString(){ String params = ""; if(parameter.size()>0){ + params += "<"; Iterator it = parameter.iterator(); while(it.hasNext()){ RefTypeOrTPHOrWildcardOrGeneric param = it.next(); From 7b24e2d83f0664d71aa0c3bd2067d6b302db783c Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 10 Jan 2018 15:37:50 +0100 Subject: [PATCH 03/65] =?UTF-8?q?bytecode=20f=C3=BCr=20Generics:=20LamAssi?= =?UTF-8?q?gnTest=20funktioniert=20richtig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dhbwstuttgart/bytecode/BytecodeGen.java | 23 ++++---- .../bytecode/BytecodeGenMethod.java | 17 ++++-- src/de/dhbwstuttgart/bytecode/Signature.java | 12 +++-- .../bytecode/TypeToSignature.java | 53 +++++++++++++++++++ test/bytecode/DuMethodTest.java | 7 +++ test/bytecode/Exceptions.jav | 3 ++ test/bytecode/TestIfTest.java | 7 +++ 7 files changed, 101 insertions(+), 21 deletions(-) create mode 100644 src/de/dhbwstuttgart/bytecode/TypeToSignature.java create mode 100644 test/bytecode/DuMethodTest.java create mode 100644 test/bytecode/Exceptions.jav create mode 100644 test/bytecode/TestIfTest.java diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index f1994c20..88bf36c4 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -125,9 +125,13 @@ public class BytecodeGen implements ASTVisitor { String desc = null; boolean hasGen = false; + for(String paramName : methodParamsAndTypes.keySet()) { - genericsAndBounds.containsKey(paramName); - hasGen = true; + String typeOfParam = methodParamsAndTypes.get(paramName).acceptTV(new TypeToDescriptor()); + if(genericsAndBounds.containsKey(typeOfParam)) { + hasGen = true; + break; + } } String sig = null; if(hasGen) { @@ -166,7 +170,8 @@ public class BytecodeGen implements ASTVisitor { boolean hasGenInParameterList = genericsAndBounds.containsKey(method.getReturnType().acceptTV(new TypeToDescriptor())); if(!hasGenInParameterList) { for(String paramName : methodParamsAndTypes.keySet()) { - if(genericsAndBounds.containsKey(paramName)) { + String typeOfParam = methodParamsAndTypes.get(paramName).acceptTV(new TypeToDescriptor()); + if(genericsAndBounds.containsKey(typeOfParam)) { hasGenInParameterList = true; break; } @@ -174,15 +179,9 @@ public class BytecodeGen implements ASTVisitor { } String sig = null; boolean hasGen = method.getGenerics().iterator().hasNext() || hasGenInParameterList; - // Wenn ReturnType has Generics?? Fun1<...> wie testet man das generic hat?? - System.out.println(method.getReturnType().acceptTV(new TypeToString())); -// if(method.getReturnType().acceptTV(new TypeToString()).equals("TPH")) { -// Signature signature = new Signature(method, genericsAndBoundsMethod, methodParamsAndTypes,resultSet); -// sig = signature.toString(); -// System.out.println(sig); -// } - /* if method has generics, create signature */ - if(hasGen) { + + /* if method has generics or return type is TPH, create signature */ + if(hasGen||method.getReturnType().acceptTV(new TypeToString()).equals("TPH")) { // resultset hier zum testen Signature signature = new Signature(method, genericsAndBoundsMethod, methodParamsAndTypes,resultSet); sig = signature.toString(); diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index 5368cf93..ae1bf8b1 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -170,7 +170,7 @@ public class BytecodeGenMethod implements StatementVisitor{ this.lamCounter++; System.out.println("Lam Hs Gens: " + lambdaExpression.getGenerics().iterator().hasNext()); - System.out.println("Lam Hs Gens: " + lambdaExpression.getReturnType().acceptTV(new TypeToString())); + System.out.println("Lam Hs Gens: " + resultSet.resolveType(lambdaExpression.getReturnType()).resolvedType.acceptTV(new TypeToSignature())); Lambda lam = new Lambda(lambdaExpression); String lamDesc = lam.accept(new DescriptorToString(resultSet)); //Call site, which, when invoked, returns an instance of the functional interface to which @@ -182,10 +182,19 @@ public class BytecodeGenMethod implements StatementVisitor{ Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", mt.toMethodDescriptorString(), false); String methodName = "lambda$new$" + this.lamCounter; -// String typeErasure = "(Ljava/lang/Object;)Ljava/lang/Object;"; + + String typeErasure = "("; + Iterator itr = lambdaExpression.params.iterator(); + while(itr.hasNext()) { + itr.next(); + typeErasure += "L"+Type.getInternalName(Object.class) + ";"; + } + + System.out.println("LamReturnType: "+lambdaExpression.getReturnType().acceptTV(new TypeToString())); + typeErasure += ")L"+Type.getInternalName(Object.class) + ";"; // Type erasure -// Type arg1 = Type.getMethodType(typeErasure); - Type arg1 = Type.getMethodType(lamDesc); + Type arg1 = Type.getMethodType(typeErasure); +// Type arg1 = Type.getMethodType(lamDesc); // real Type Type arg3 = Type.getMethodType(lamDesc); diff --git a/src/de/dhbwstuttgart/bytecode/Signature.java b/src/de/dhbwstuttgart/bytecode/Signature.java index 362429a3..1a764afa 100644 --- a/src/de/dhbwstuttgart/bytecode/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/Signature.java @@ -11,6 +11,7 @@ import de.dhbwstuttgart.syntaxtree.Constructor; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.type.GenericRefType; +import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; import de.dhbwstuttgart.typeinference.result.ResultSet; @@ -96,16 +97,17 @@ public class Signature { } switch (type) { case "RT": - sv.visitClassType(t.acceptTV(new TypeToDescriptor())); +// sv.visitClassType(t.acceptTV(new TypeToDescriptor())); + sv.visitClassType(t.acceptTV(new TypeToSignature())); break; case "GRT": GenericRefType g = (GenericRefType) t; - sv.visitTypeVariable(g.getParsedName()); +// sv.visitTypeVariable(g.getParsedName()); + sv.visitTypeVariable(g.acceptTV(new TypeToSignature())); break; case "TPH": - System.out.println(resultSet.resolveType(t).resolvedType.acceptTV(new TypeToDescriptor())); -// sv.visitInterface().visitClassType(resultSet.resolveType(t).resolvedType.acceptTV(new TypeToDescriptor())+";"); - + RefType r = (RefType) resultSet.resolveType(t).resolvedType; + sv.visitInterface().visitClassType(r.acceptTV(new TypeToSignature())); break; default: if(!isParameterType) diff --git a/src/de/dhbwstuttgart/bytecode/TypeToSignature.java b/src/de/dhbwstuttgart/bytecode/TypeToSignature.java new file mode 100644 index 00000000..f40515a1 --- /dev/null +++ b/src/de/dhbwstuttgart/bytecode/TypeToSignature.java @@ -0,0 +1,53 @@ +package de.dhbwstuttgart.bytecode; + +import java.util.Iterator; + +import de.dhbwstuttgart.exceptions.NotImplementedException; +import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType; +import de.dhbwstuttgart.syntaxtree.type.GenericRefType; +import de.dhbwstuttgart.syntaxtree.type.RefType; +import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; +import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; +import de.dhbwstuttgart.syntaxtree.type.TypeVisitor; + +public class TypeToSignature implements TypeVisitor { + + @Override + public String visit(RefType refType) { +// return refType.toString().replace(".", "/"); + String params = ""; + if(refType.getParaList().size()>0){ + params += "<"; + Iterator it = refType.getParaList().iterator(); + while(it.hasNext()){ + RefTypeOrTPHOrWildcardOrGeneric param = it.next(); + params += "L"+param.toString().replace(".", "/"); + if(it.hasNext())params += ";"; + } + params += ";>;"; + } + return refType.getName().toString().replace(".", "/") + params; + } + + @Override + public String visit(SuperWildcardType superWildcardType) { + throw new NotImplementedException(); + } + + @Override + public String visit(TypePlaceholder typePlaceholder) { + return typePlaceholder.toString().replace(".", "/"); + } + + @Override + public String visit(ExtendsWildcardType extendsWildcardType) { + throw new NotImplementedException(); + } + + @Override + public String visit(GenericRefType genericRefType) { + return genericRefType.getParsedName().replace(".", "/"); + } + +} diff --git a/test/bytecode/DuMethodTest.java b/test/bytecode/DuMethodTest.java new file mode 100644 index 00000000..a4c8a226 --- /dev/null +++ b/test/bytecode/DuMethodTest.java @@ -0,0 +1,7 @@ +package bytecode; + +public class DuMethodTest extends JavaTXCompilerTest{ + public DuMethodTest() { + this.fileName = "DuMethod"; + } +} diff --git a/test/bytecode/Exceptions.jav b/test/bytecode/Exceptions.jav new file mode 100644 index 00000000..9903511c --- /dev/null +++ b/test/bytecode/Exceptions.jav @@ -0,0 +1,3 @@ +public class Exceptions { +// m(Integer i) throws +} \ No newline at end of file diff --git a/test/bytecode/TestIfTest.java b/test/bytecode/TestIfTest.java new file mode 100644 index 00000000..804a0616 --- /dev/null +++ b/test/bytecode/TestIfTest.java @@ -0,0 +1,7 @@ +package bytecode; + +public class TestIfTest extends JavaTXCompilerTest{ + public TestIfTest() { + this.fileName = "IfTest"; + } +} From 542f87e8a3c673102f58bb8e1e1b509c1301cac4 Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 17 Jan 2018 13:49:18 +0100 Subject: [PATCH 04/65] =?UTF-8?q?erzeugt=20Klassendatei=20f=C3=BCr=20FunN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dhbwstuttgart/bytecode/BytecodeGen.java | 18 ++- .../bytecode/BytecodeGenMethod.java | 70 +++++++- src/de/dhbwstuttgart/bytecode/ClassFile.java | 14 -- src/de/dhbwstuttgart/bytecode/Lambda.java | 1 + .../bytecode/MethodFromMethodCall.java | 1 + .../bytecode/NormalConstructor.java | 1 + .../dhbwstuttgart/bytecode/NormalMethod.java | 1 + src/de/dhbwstuttgart/bytecode/SamMethod.java | 1 + src/de/dhbwstuttgart/bytecode/Test.java | 150 ------------------ src/de/dhbwstuttgart/bytecode/TestClass.java | 8 - src/de/dhbwstuttgart/bytecode/TestFields.java | 59 ------- src/de/dhbwstuttgart/bytecode/TestIf.java | 11 -- src/de/dhbwstuttgart/bytecode/TestMeth.java | 18 --- src/de/dhbwstuttgart/bytecode/TetsF.java | 6 - .../{ => descriptor}/DescriptorToString.java | 8 +- .../{ => descriptor}/DescriptorVisitor.java | 8 +- .../{ => descriptor}/TypeToDescriptor.java | 2 +- .../bytecode/{ => signature}/Signature.java | 38 ++++- .../{ => signature}/TypeToSignature.java | 2 +- .../{ => signature}/TypeToString.java | 2 +- test/bytecode/LamAssign.jav | 6 +- 21 files changed, 134 insertions(+), 291 deletions(-) delete mode 100644 src/de/dhbwstuttgart/bytecode/ClassFile.java delete mode 100644 src/de/dhbwstuttgart/bytecode/Test.java delete mode 100644 src/de/dhbwstuttgart/bytecode/TestClass.java delete mode 100644 src/de/dhbwstuttgart/bytecode/TestFields.java delete mode 100644 src/de/dhbwstuttgart/bytecode/TestIf.java delete mode 100644 src/de/dhbwstuttgart/bytecode/TestMeth.java delete mode 100644 src/de/dhbwstuttgart/bytecode/TetsF.java rename src/de/dhbwstuttgart/bytecode/{ => descriptor}/DescriptorToString.java (95%) rename src/de/dhbwstuttgart/bytecode/{ => descriptor}/DescriptorVisitor.java (50%) rename src/de/dhbwstuttgart/bytecode/{ => descriptor}/TypeToDescriptor.java (95%) rename src/de/dhbwstuttgart/bytecode/{ => signature}/Signature.java (78%) rename src/de/dhbwstuttgart/bytecode/{ => signature}/TypeToSignature.java (97%) rename src/de/dhbwstuttgart/bytecode/{ => signature}/TypeToString.java (95%) diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index 88bf36c4..f6f14b4c 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -1,6 +1,5 @@ package de.dhbwstuttgart.bytecode; -import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -9,10 +8,11 @@ import org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; -import org.objectweb.asm.signature.SignatureVisitor; -import org.objectweb.asm.signature.SignatureWriter; +import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString; +import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor; +import de.dhbwstuttgart.bytecode.signature.Signature; +import de.dhbwstuttgart.bytecode.signature.TypeToString; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal; import de.dhbwstuttgart.syntaxtree.*; import de.dhbwstuttgart.syntaxtree.statement.literal.Literal; @@ -56,8 +56,8 @@ public class BytecodeGen implements ASTVisitor { public void visit(SourceFile sourceFile) { for(ClassOrInterface cl : sourceFile.getClasses()) { BytecodeGen classGen = new BytecodeGen(classFiles, resultSet); - cl.accept(classGen); System.out.println("In CLASS: "+(cl.getClassName().toString())); + cl.accept(classGen); classGen.writeClass(cl.getClassName().toString()); } } @@ -83,6 +83,8 @@ public class BytecodeGen implements ASTVisitor { public void visit(ClassOrInterface classOrInterface) { className = classOrInterface.getClassName().toString(); + cw.visitSource(className +".jav", null); + isInterface = (classOrInterface.getModifiers()&512)==512; System.out.println("IS Interface = "+"modifiers= "+classOrInterface.getModifiers()+" ->"+(classOrInterface.getModifiers()&512) + isInterface); @@ -116,7 +118,6 @@ public class BytecodeGen implements ASTVisitor { for(Method m : classOrInterface.getMethods()) { m.accept(this); } - cw.visitSource(classOrInterface.getClassName().toString()+".jav", null); } @Override @@ -146,7 +147,7 @@ public class BytecodeGen implements ASTVisitor { mv.visitCode(); System.out.println("-----Constructor-----"); BytecodeGenMethod gen = new BytecodeGenMethod(className,resultSet,field, mv,paramsAndLocals,cw, - genericsAndBoundsMethod,genericsAndBounds,isInterface); + genericsAndBoundsMethod,genericsAndBounds,isInterface,classFiles); if(!field.getParameterList().iterator().hasNext()) { mv.visitInsn(Opcodes.RETURN); } @@ -196,7 +197,8 @@ public class BytecodeGen implements ASTVisitor { mv.visitCode(); - BytecodeGenMethod gen = new BytecodeGenMethod(className,resultSet,method, mv,paramsAndLocals,cw,genericsAndBounds,genericsAndBounds,isInterface); + BytecodeGenMethod gen = new BytecodeGenMethod(className,resultSet,method, mv,paramsAndLocals,cw, + genericsAndBounds,genericsAndBounds,isInterface,classFiles); mv.visitMaxs(0, 0); mv.visitEnd(); } diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index ae1bf8b1..756837b0 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -1,5 +1,9 @@ package de.dhbwstuttgart.bytecode; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; import java.lang.invoke.CallSite; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -14,7 +18,14 @@ import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import org.objectweb.asm.signature.SignatureVisitor; +import org.objectweb.asm.signature.SignatureWriter; +import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString; +import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor; +import de.dhbwstuttgart.bytecode.signature.Signature; +import de.dhbwstuttgart.bytecode.signature.TypeToSignature; +import de.dhbwstuttgart.bytecode.signature.TypeToString; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal; import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.Method; @@ -45,12 +56,13 @@ public class BytecodeGenMethod implements StatementVisitor{ private String where; private boolean isRightSideALambda = false; private KindOfLambda kindOfLambda; + private HashMap classFiles; private ArrayList varsFunInterface; public BytecodeGenMethod(String className,ResultSet resultSet, Method m, MethodVisitor mv, - HashMap paramsAndLocals, ClassWriter cw, - HashMap genericsAndBoundsMethod, HashMap genericsAndBounds, boolean isInterface) { + HashMap paramsAndLocals, ClassWriter cw, HashMap genericsAndBoundsMethod, + HashMap genericsAndBounds, boolean isInterface, HashMap classFiles) { this.where = "<<<<<< NORMAL METHOD >>>>>>"; @@ -63,6 +75,7 @@ public class BytecodeGenMethod implements StatementVisitor{ this.genericsAndBoundsMethod = genericsAndBoundsMethod; this.genericsAndBounds = genericsAndBounds; this.isInterface = isInterface; + this.classFiles = classFiles; this.lamCounter = -1; this.varsFunInterface = new ArrayList<>(); @@ -79,13 +92,14 @@ public class BytecodeGenMethod implements StatementVisitor{ } public BytecodeGenMethod(LambdaExpression lambdaExpression,ResultSet resultSet ,MethodVisitor mv, - int indexOfFirstParamLam, boolean isInterface) { + int indexOfFirstParamLam, boolean isInterface, HashMap classFiles) { System.out.println("\t\t++++++IN LAMBDA -------"); this.where = "<<<<<< LAMBDA METHOD >>>>>>"; this.resultSet = resultSet; this.mv = mv; this.isInterface = isInterface; + this.classFiles = classFiles; this.lamCounter = -1; this.varsFunInterface = new ArrayList<>(); @@ -183,6 +197,8 @@ public class BytecodeGenMethod implements StatementVisitor{ "metafactory", mt.toMethodDescriptorString(), false); String methodName = "lambda$new$" + this.lamCounter; + // Für die Parameter-Typen und Return-Typ braucht man die Bounds (für die Typlöschung) + String typeErasure = "("; Iterator itr = lambdaExpression.params.iterator(); while(itr.hasNext()) { @@ -225,14 +241,60 @@ public class BytecodeGenMethod implements StatementVisitor{ MethodVisitor mvLambdaBody = cw.visitMethod(Opcodes.ACC_PRIVATE+ staticOrInstance + Opcodes.ACC_SYNTHETIC, methodName, arg3.toString(), null, null); - new BytecodeGenMethod(lambdaExpression,this.resultSet,mvLambdaBody,indexOfFirstParamLam,isInterface); + new BytecodeGenMethod(lambdaExpression,this.resultSet,mvLambdaBody,indexOfFirstParamLam,isInterface, + classFiles); mvLambdaBody.visitMaxs(0, 0); mvLambdaBody.visitEnd(); cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL); + + generateBCForFunN(lambdaExpression); } + private void generateBCForFunN(LambdaExpression lambdaExpression) { + ClassWriter classWriter =new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS); + + SignatureWriter methSig = new SignatureWriter(); + String methDesc = "("; + int numberOfParams = 0; + SignatureVisitor paramVisitor = methSig.visitParameterType(); + Iterator itr = lambdaExpression.params.iterator(); + while(itr.hasNext()) { + numberOfParams++; + // getBounds + methDesc += "L"+Type.getInternalName(Object.class)+";"; + paramVisitor.visitTypeVariable("T"+numberOfParams); + itr.next(); + } + methSig.visitReturnType().visitTypeVariable("R"); + // ")"+lam.getReturn.getBounds + methDesc += ")L"+Type.getInternalName(Object.class)+";"; + Signature sig = new Signature(lambdaExpression,numberOfParams); + String name = "Fun"+numberOfParams; + classWriter.visit(Opcodes.V1_8, Opcodes.ACC_INTERFACE+Opcodes.ACC_ABSTRACT, name, + sig.toString(), Type.getInternalName(Object.class), null); + MethodVisitor mvApply = classWriter.visitMethod(Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT, "apply", methDesc, methSig.toString(), null); + mvApply.visitEnd(); + writeClassFile(classWriter.toByteArray(),name); + } + + public void writeClassFile(byte[] bytecode, String name) { + FileOutputStream output; + try { + System.out.println("generating"+name+ ".class file"); + output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/" +name+".class")); + output.write(bytecode); + output.close(); + System.out.println(name+".class file generated"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + +} + @Override public void visit(CastExpr castExpr) { // TODO Auto-generated method stub diff --git a/src/de/dhbwstuttgart/bytecode/ClassFile.java b/src/de/dhbwstuttgart/bytecode/ClassFile.java deleted file mode 100644 index fcbad90b..00000000 --- a/src/de/dhbwstuttgart/bytecode/ClassFile.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.dhbwstuttgart.bytecode; - -public class ClassFile { - - String name; - byte[] bytecode; - - public ClassFile(String name, byte[] bytecode) { - this.name = name; - this.bytecode = bytecode; - } - - -} diff --git a/src/de/dhbwstuttgart/bytecode/Lambda.java b/src/de/dhbwstuttgart/bytecode/Lambda.java index 283b7393..c3b4e8f5 100644 --- a/src/de/dhbwstuttgart/bytecode/Lambda.java +++ b/src/de/dhbwstuttgart/bytecode/Lambda.java @@ -1,5 +1,6 @@ package de.dhbwstuttgart.bytecode; +import de.dhbwstuttgart.bytecode.descriptor.DescriptorVisitor; import de.dhbwstuttgart.syntaxtree.ParameterList; import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; diff --git a/src/de/dhbwstuttgart/bytecode/MethodFromMethodCall.java b/src/de/dhbwstuttgart/bytecode/MethodFromMethodCall.java index 330b0666..0f781b46 100644 --- a/src/de/dhbwstuttgart/bytecode/MethodFromMethodCall.java +++ b/src/de/dhbwstuttgart/bytecode/MethodFromMethodCall.java @@ -2,6 +2,7 @@ package de.dhbwstuttgart.bytecode; import java.util.HashMap; +import de.dhbwstuttgart.bytecode.descriptor.DescriptorVisitor; import de.dhbwstuttgart.syntaxtree.statement.ArgumentList; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; diff --git a/src/de/dhbwstuttgart/bytecode/NormalConstructor.java b/src/de/dhbwstuttgart/bytecode/NormalConstructor.java index d2174fd4..a9aa482a 100644 --- a/src/de/dhbwstuttgart/bytecode/NormalConstructor.java +++ b/src/de/dhbwstuttgart/bytecode/NormalConstructor.java @@ -2,6 +2,7 @@ package de.dhbwstuttgart.bytecode; import java.util.HashMap; +import de.dhbwstuttgart.bytecode.descriptor.DescriptorVisitor; import de.dhbwstuttgart.syntaxtree.Constructor; import de.dhbwstuttgart.syntaxtree.ParameterList; diff --git a/src/de/dhbwstuttgart/bytecode/NormalMethod.java b/src/de/dhbwstuttgart/bytecode/NormalMethod.java index 3f6bf2b4..b7320479 100644 --- a/src/de/dhbwstuttgart/bytecode/NormalMethod.java +++ b/src/de/dhbwstuttgart/bytecode/NormalMethod.java @@ -2,6 +2,7 @@ package de.dhbwstuttgart.bytecode; import java.util.HashMap; +import de.dhbwstuttgart.bytecode.descriptor.DescriptorVisitor; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.ParameterList; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; diff --git a/src/de/dhbwstuttgart/bytecode/SamMethod.java b/src/de/dhbwstuttgart/bytecode/SamMethod.java index 9cf039a2..f14d5407 100644 --- a/src/de/dhbwstuttgart/bytecode/SamMethod.java +++ b/src/de/dhbwstuttgart/bytecode/SamMethod.java @@ -2,6 +2,7 @@ package de.dhbwstuttgart.bytecode; import java.util.List; +import de.dhbwstuttgart.bytecode.descriptor.DescriptorVisitor; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; public class SamMethod { diff --git a/src/de/dhbwstuttgart/bytecode/Test.java b/src/de/dhbwstuttgart/bytecode/Test.java deleted file mode 100644 index 333ec41f..00000000 --- a/src/de/dhbwstuttgart/bytecode/Test.java +++ /dev/null @@ -1,150 +0,0 @@ -package de.dhbwstuttgart.bytecode; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.invoke.CallSite; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Handle; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; - - -public class Test { - private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/"; - - protected static ClassLoader getClassLoader() throws Exception { - File file = new File(rootDirectory); - URL url = file.toURI().toURL(); - URL[] urls = new URL[] { url }; - System.out.println(urls[0]); - return new URLClassLoader(urls); - } - - public static void main(String[] args) { - // Test Lambda - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); - cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TestClass", null, "java/lang/Object", null); - - cw.visitSource("TestClass.java", null); - - // Create Constructor - MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null); - mv.visitVarInsn(Opcodes.ALOAD, 0); - - mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V"); - - // mv.visitMethodInsn(INVOKEDYNAMIC, "#0", "run", "()Ljava/lang/Runnable"); - //Call site, which, when invoked, returns an instance of the functional interface to which - //the lambda is being converted - MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class, - MethodType.class, MethodType.class, MethodHandle.class, MethodType.class); - - Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", - mt.toMethodDescriptorString()); - Handle arg2 = new Handle(Opcodes.H_INVOKESTATIC, "TestClass", "lambda$0", "()V"); - - mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap, - Type.getMethodType("()V"), arg2, - Type.getMethodType("()V")); - - mv.visitVarInsn(Opcodes.ASTORE, 1); - mv.visitVarInsn(Opcodes.ALOAD, 1); - mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V"); - mv.visitInsn(Opcodes.RETURN); - - // creates bridge method, contains lambdas body - MethodVisitor mvl = cw.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC, "lambda$0", - "()V", null, null); - mvl.visitCode(); - mvl.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); - mvl.visitLdcInsn("lambda"); - mvl.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); - mvl.visitInsn(Opcodes.RETURN); - mvl.visitMaxs(2, 0); - mvl.visitEnd(); - - mv.visitMaxs(1, 2); - mv.visitEnd(); - - - cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", - Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL); - cw.visitEnd(); - - byte[] b = cw.toByteArray(); - - // Test if statement - /* - * ClassWriter cw = new - * ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS); - * - * cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+Opcodes.ACC_SUPER, "TestIf", null, - * "java/lang/Object", null); MethodVisitor mv = - * cw.visitMethod(Opcodes.ACC_PUBLIC, "", "(Ljava/lang/Boolean;)V", null, - * null); mv.visitCode(); - * - * // Label l0 = new Label(); // mv.visitLabel(l0); - * - * mv.visitVarInsn(Opcodes.ALOAD, 0); - * - * mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", - * "()V"); - * - * // Label l1 = new Label(); // mv.visitLabel(l1); - * mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - * "java/lang/Boolean", "booleanValue", "()Z"); - * - * Label label = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, label); - * - * mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", - * "Ljava/io/PrintStream;"); mv.visitLdcInsn("1"); - * mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", - * "(Ljava/lang/String;)V"); - * - * Label endLabel = new Label(); mv.visitJumpInsn(Opcodes.GOTO, endLabel); - * - * mv.visitLabel(label); mv.visitFieldInsn(Opcodes.GETSTATIC, - * "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("0"); - * mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", - * "(Ljava/lang/String;)V"); - * - * - * - * mv.visitLabel(endLabel); mv.visitInsn(Opcodes.RETURN); - * - * // Label l2 = new Label(); // mv.visitLabel(l2); - * - * // mv.visitLocalVariable("this", "LTestIf;", null, l0, l2, 0); // - * mv.visitLocalVariable("b", "Ljava/lang/Boolean;", null, l0, l2, 1); - * mv.visitMaxs(2, 2); mv.visitEnd(); - * - * cw.visitEnd(); byte[] b = cw.toByteArray(); - */ - FileOutputStream output; - - try { - output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TestClass.class")); - output.write(b); - output.close(); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } -} diff --git a/src/de/dhbwstuttgart/bytecode/TestClass.java b/src/de/dhbwstuttgart/bytecode/TestClass.java deleted file mode 100644 index 168447af..00000000 --- a/src/de/dhbwstuttgart/bytecode/TestClass.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.dhbwstuttgart.bytecode; - -public class TestClass { - public TestClass() { - Runnable lam = () -> System.out.println("lambda"); - lam.run(); - } -} diff --git a/src/de/dhbwstuttgart/bytecode/TestFields.java b/src/de/dhbwstuttgart/bytecode/TestFields.java deleted file mode 100644 index 652b8d19..00000000 --- a/src/de/dhbwstuttgart/bytecode/TestFields.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.dhbwstuttgart.bytecode; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; - -public class TestFields { - private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/"; - - public static void main(String[] args) { - // TODO Auto-generated method stub - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS); - cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TetsF", null, "java/lang/Object", null); - - cw.visitSource("TetsF.java", null); - - FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, "z", Type.INT_TYPE.getDescriptor(), null, null); - fv.visitEnd(); - - FieldVisitor fvS = cw.visitField(Opcodes.ACC_PUBLIC, "s", "Ljava/lang/String;", null, null); - fvS.visitEnd(); - // Create Constructor - MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null); - mv.visitCode(); - - mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V"); - mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitLdcInsn(""); - mv.visitFieldInsn(Opcodes.PUTFIELD, "TetsF", "s", "Ljava/lang/String;"); - mv.visitInsn(Opcodes.RETURN); - mv.visitMaxs(2, 1); - mv.visitEnd(); - - byte[] b = cw.toByteArray(); - - FileOutputStream output; - - try { - output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TetsF.class")); - output.write(b); - output.close(); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - -} diff --git a/src/de/dhbwstuttgart/bytecode/TestIf.java b/src/de/dhbwstuttgart/bytecode/TestIf.java deleted file mode 100644 index 36e3c706..00000000 --- a/src/de/dhbwstuttgart/bytecode/TestIf.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.dhbwstuttgart.bytecode; - -public class TestIf { - public TestIf(Boolean b) { - if(b) { - System.out.println("1"); - }else { - System.out.println("0"); - } - } -} diff --git a/src/de/dhbwstuttgart/bytecode/TestMeth.java b/src/de/dhbwstuttgart/bytecode/TestMeth.java deleted file mode 100644 index 51223ea1..00000000 --- a/src/de/dhbwstuttgart/bytecode/TestMeth.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.dhbwstuttgart.bytecode; - -public class TestMeth { - private int z; - public String s; - public TestMeth(int temp) { - this.z = temp; - } - public void m1(int a, int b) { - int y = m2(1,2,3,4); - } - - public int m2(int a, int b, int x, int y) { - Integer c = 55; - Integer g; - return a+b+y+c; - } -} diff --git a/src/de/dhbwstuttgart/bytecode/TetsF.java b/src/de/dhbwstuttgart/bytecode/TetsF.java deleted file mode 100644 index af72a8d3..00000000 --- a/src/de/dhbwstuttgart/bytecode/TetsF.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.dhbwstuttgart.bytecode; - -public class TetsF { - private int z; - public String s = ""; -} diff --git a/src/de/dhbwstuttgart/bytecode/DescriptorToString.java b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java similarity index 95% rename from src/de/dhbwstuttgart/bytecode/DescriptorToString.java rename to src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java index 481dbc5d..2ed48867 100644 --- a/src/de/dhbwstuttgart/bytecode/DescriptorToString.java +++ b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java @@ -1,7 +1,12 @@ -package de.dhbwstuttgart.bytecode; +package de.dhbwstuttgart.bytecode.descriptor; import java.util.Iterator; +import de.dhbwstuttgart.bytecode.Lambda; +import de.dhbwstuttgart.bytecode.MethodFromMethodCall; +import de.dhbwstuttgart.bytecode.NormalConstructor; +import de.dhbwstuttgart.bytecode.NormalMethod; +import de.dhbwstuttgart.bytecode.SamMethod; import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.statement.Expression; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; @@ -96,7 +101,6 @@ public class DescriptorToString implements DescriptorVisitor{ FormalParameter fp = itr.next(); desc = desc + "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()) + ";"; } - System.out.println("LamReturnType: "+lambdaExpression.getReturnType().acceptTV(new TypeToString())); desc = addReturnType(desc, lambdaExpression.getReturnType(), resultSet); return desc; } diff --git a/src/de/dhbwstuttgart/bytecode/DescriptorVisitor.java b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorVisitor.java similarity index 50% rename from src/de/dhbwstuttgart/bytecode/DescriptorVisitor.java rename to src/de/dhbwstuttgart/bytecode/descriptor/DescriptorVisitor.java index 63198828..6bc57f21 100644 --- a/src/de/dhbwstuttgart/bytecode/DescriptorVisitor.java +++ b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorVisitor.java @@ -1,4 +1,10 @@ -package de.dhbwstuttgart.bytecode; +package de.dhbwstuttgart.bytecode.descriptor; + +import de.dhbwstuttgart.bytecode.Lambda; +import de.dhbwstuttgart.bytecode.MethodFromMethodCall; +import de.dhbwstuttgart.bytecode.NormalConstructor; +import de.dhbwstuttgart.bytecode.NormalMethod; +import de.dhbwstuttgart.bytecode.SamMethod; public interface DescriptorVisitor { public String visit(NormalMethod method); diff --git a/src/de/dhbwstuttgart/bytecode/TypeToDescriptor.java b/src/de/dhbwstuttgart/bytecode/descriptor/TypeToDescriptor.java similarity index 95% rename from src/de/dhbwstuttgart/bytecode/TypeToDescriptor.java rename to src/de/dhbwstuttgart/bytecode/descriptor/TypeToDescriptor.java index 5271e63d..e374bb93 100644 --- a/src/de/dhbwstuttgart/bytecode/TypeToDescriptor.java +++ b/src/de/dhbwstuttgart/bytecode/descriptor/TypeToDescriptor.java @@ -1,4 +1,4 @@ -package de.dhbwstuttgart.bytecode; +package de.dhbwstuttgart.bytecode.descriptor; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType; diff --git a/src/de/dhbwstuttgart/bytecode/Signature.java b/src/de/dhbwstuttgart/bytecode/signature/Signature.java similarity index 78% rename from src/de/dhbwstuttgart/bytecode/Signature.java rename to src/de/dhbwstuttgart/bytecode/signature/Signature.java index 1a764afa..1c208b85 100644 --- a/src/de/dhbwstuttgart/bytecode/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -1,15 +1,19 @@ -package de.dhbwstuttgart.bytecode; +package de.dhbwstuttgart.bytecode.signature; import java.util.HashMap; import java.util.Iterator; +import org.objectweb.asm.Type; import org.objectweb.asm.signature.SignatureVisitor; import org.objectweb.asm.signature.SignatureWriter; +import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.Constructor; +import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.Method; +import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression; import de.dhbwstuttgart.syntaxtree.type.GenericRefType; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; @@ -50,6 +54,31 @@ public class Signature { createSignatureForConsOrMethod(this.method,false); } + public Signature(LambdaExpression lambdaExpression,int numberOfParams) { + sw = new SignatureWriter(); + createSignatureForFunN(lambdaExpression, numberOfParams); + } + + private void createSignatureForFunN(LambdaExpression lambdaExpression, int numberOfParams) { + +// sw.visitReturnType().visitTypeVariable("R"); + sw.visitFormalTypeParameter("R"); + // getBounds vom Return-Type + sw.visitClassBound().visitClassType(Type.getInternalName(Object.class)); + sw.visitClassBound().visitEnd(); + for(int i = 0;i extends java.lang.Object OR ... sw.visitClassBound().visitClassType(boundDesc); genAndBounds.put(g.getParsedName(), boundDesc); diff --git a/src/de/dhbwstuttgart/bytecode/TypeToSignature.java b/src/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java similarity index 97% rename from src/de/dhbwstuttgart/bytecode/TypeToSignature.java rename to src/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java index f40515a1..bbc19c37 100644 --- a/src/de/dhbwstuttgart/bytecode/TypeToSignature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java @@ -1,4 +1,4 @@ -package de.dhbwstuttgart.bytecode; +package de.dhbwstuttgart.bytecode.signature; import java.util.Iterator; diff --git a/src/de/dhbwstuttgart/bytecode/TypeToString.java b/src/de/dhbwstuttgart/bytecode/signature/TypeToString.java similarity index 95% rename from src/de/dhbwstuttgart/bytecode/TypeToString.java rename to src/de/dhbwstuttgart/bytecode/signature/TypeToString.java index 86d4124a..94314afe 100644 --- a/src/de/dhbwstuttgart/bytecode/TypeToString.java +++ b/src/de/dhbwstuttgart/bytecode/signature/TypeToString.java @@ -1,4 +1,4 @@ -package de.dhbwstuttgart.bytecode; +package de.dhbwstuttgart.bytecode.signature; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType; diff --git a/test/bytecode/LamAssign.jav b/test/bytecode/LamAssign.jav index 3df81780..8f42d5ea 100644 --- a/test/bytecode/LamAssign.jav +++ b/test/bytecode/LamAssign.jav @@ -8,6 +8,6 @@ class LamAssign { } } -interface Fun1{ - A apply(B b); -} +//interface Fun1{ +// A apply(B b); +//} From 9a94ba2114e2bfa369c91fddf09b8a143ac4a521 Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 31 Jan 2018 14:16:20 +0100 Subject: [PATCH 05/65] =?UTF-8?q?unn=C3=B6tige=20Kommentare=20wurden=20ent?= =?UTF-8?q?fernt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dhbwstuttgart/bytecode/BytecodeGen.java | 26 ++---- .../bytecode/BytecodeGenMethod.java | 83 ++++++------------- .../descriptor/DescriptorToString.java | 12 ++- .../bytecode/signature/Signature.java | 6 +- test/bytecode/ATest.java | 8 ++ test/bytecode/DuMethod.jav | 2 +- test/bytecode/Example.jav | 7 ++ test/bytecode/Import.jav | 8 ++ test/bytecode/ImportTest.java | 7 ++ test/bytecode/JavaTXCompilerTest.java | 13 ++- test/bytecode/LamAssign.jav | 4 - test/bytecode/OverlaodGen.jav | 11 +++ test/bytecode/OverlaodGenTest.java | 7 ++ 13 files changed, 100 insertions(+), 94 deletions(-) create mode 100644 test/bytecode/ATest.java create mode 100644 test/bytecode/Example.jav create mode 100644 test/bytecode/Import.jav create mode 100644 test/bytecode/ImportTest.java create mode 100644 test/bytecode/OverlaodGen.jav create mode 100644 test/bytecode/OverlaodGenTest.java diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index f6f14b4c..25c06024 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -56,7 +56,6 @@ public class BytecodeGen implements ASTVisitor { public void visit(SourceFile sourceFile) { for(ClassOrInterface cl : sourceFile.getClasses()) { BytecodeGen classGen = new BytecodeGen(classFiles, resultSet); - System.out.println("In CLASS: "+(cl.getClassName().toString())); cl.accept(classGen); classGen.writeClass(cl.getClassName().toString()); } @@ -86,8 +85,7 @@ public class BytecodeGen implements ASTVisitor { cw.visitSource(className +".jav", null); isInterface = (classOrInterface.getModifiers()&512)==512; - System.out.println("IS Interface = "+"modifiers= "+classOrInterface.getModifiers()+" ->"+(classOrInterface.getModifiers()&512) + isInterface); - + int acc = isInterface?classOrInterface.getModifiers()+Opcodes.ACC_ABSTRACT:classOrInterface.getModifiers()+Opcodes.ACC_SUPER; String sig = null; /* if class has generics then creates signature @@ -96,8 +94,6 @@ public class BytecodeGen implements ASTVisitor { */ if(classOrInterface.getGenerics().iterator().hasNext()) { Signature signature = new Signature(classOrInterface, genericsAndBounds); - - System.out.println(signature.toString()); sig = signature.toString(); } // needs implemented Interfaces? @@ -106,8 +102,6 @@ public class BytecodeGen implements ASTVisitor { // for each field in the class for(Field f : classOrInterface.getFieldDecl()) { - System.out.println("get Fields"); - System.out.println(f.getName()); f.accept(this); } @@ -136,16 +130,13 @@ public class BytecodeGen implements ASTVisitor { } String sig = null; if(hasGen) { - System.out.println("IM IN CONST HAS Gens"); Signature signature = new Signature(field, genericsAndBounds,methodParamsAndTypes); sig = signature.toString(); - System.out.println(sig); } NormalConstructor constructor = new NormalConstructor(field,genericsAndBounds,hasGen); desc = constructor.accept(new DescriptorToString(resultSet)); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", desc, sig, null); mv.visitCode(); - System.out.println("-----Constructor-----"); BytecodeGenMethod gen = new BytecodeGenMethod(className,resultSet,field, mv,paramsAndLocals,cw, genericsAndBoundsMethod,genericsAndBounds,isInterface,classFiles); if(!field.getParameterList().iterator().hasNext()) { @@ -166,9 +157,7 @@ public class BytecodeGen implements ASTVisitor { // Method getModifiers() ? int acc = isInterface?Opcodes.ACC_ABSTRACT:0; - System.out.println("-----Method-----"); - - boolean hasGenInParameterList = genericsAndBounds.containsKey(method.getReturnType().acceptTV(new TypeToDescriptor())); + boolean hasGenInParameterList = genericsAndBounds.containsKey(resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor())); if(!hasGenInParameterList) { for(String paramName : methodParamsAndTypes.keySet()) { String typeOfParam = methodParamsAndTypes.get(paramName).acceptTV(new TypeToDescriptor()); @@ -178,6 +167,10 @@ public class BytecodeGen implements ASTVisitor { } } } + + //TODO: Test if the return-type or any of the parameter is a parameterized type. (VP) + //than create the descriptor with the new syntax. + String sig = null; boolean hasGen = method.getGenerics().iterator().hasNext() || hasGenInParameterList; @@ -186,13 +179,10 @@ public class BytecodeGen implements ASTVisitor { // resultset hier zum testen Signature signature = new Signature(method, genericsAndBoundsMethod, methodParamsAndTypes,resultSet); sig = signature.toString(); - System.out.println(sig); - } NormalMethod meth = new NormalMethod(method,genericsAndBounds,genericsAndBoundsMethod,hasGen); methDesc = meth.accept(new DescriptorToString(resultSet)); - System.out.println("methDesc" + methDesc); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC+acc, method.getName(), methDesc, sig, null); mv.visitCode(); @@ -212,7 +202,7 @@ public class BytecodeGen implements ASTVisitor { while(itr.hasNext()) { FormalParameter fp = itr.next(); paramsAndLocals.put(fp.getName(), i); - methodParamsAndTypes.put(fp.getName(), fp.getType()); + methodParamsAndTypes.put(fp.getName(), resultSet.resolveType(fp.getType()).resolvedType); fp.accept(this); i++; } @@ -255,7 +245,6 @@ public class BytecodeGen implements ASTVisitor { // ?? @Override public void visit(FieldVar fieldVar) { - System.out.println("in fieldvar"); // cw.newField(fieldVar.receiver.toString(), fieldVar.fieldVarName.toString(), fieldVar.getType().toString()); FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, fieldVar.fieldVarName, "L"+fieldVar.getType()+";", null, null); fv.visitEnd(); @@ -264,7 +253,6 @@ public class BytecodeGen implements ASTVisitor { // access flages?? modifiers @Override public void visit(Field field) { - System.out.println("in field"); FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, field.getName(), "L"+field.getType().toString().replace(".", "/")+";", null, null); fv.visitEnd(); } diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index 756837b0..c19315e8 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -32,7 +32,6 @@ import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.StatementVisitor; import de.dhbwstuttgart.syntaxtree.statement.literal.Literal; import de.dhbwstuttgart.syntaxtree.statement.literal.Null; -import de.dhbwstuttgart.syntaxtree.type.FunN; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; import de.dhbwstuttgart.typeinference.result.ResultSet; @@ -53,7 +52,7 @@ public class BytecodeGenMethod implements StatementVisitor{ private String fieldName; private String fieldDesc; private Expression rightSideTemp; - private String where; +// private String where; private boolean isRightSideALambda = false; private KindOfLambda kindOfLambda; private HashMap classFiles; @@ -64,7 +63,7 @@ public class BytecodeGenMethod implements StatementVisitor{ HashMap paramsAndLocals, ClassWriter cw, HashMap genericsAndBoundsMethod, HashMap genericsAndBounds, boolean isInterface, HashMap classFiles) { - this.where = "<<<<<< NORMAL METHOD >>>>>>"; +// this.where = "<<<<<< NORMAL METHOD >>>>>>"; this.className = className; this.resultSet = resultSet; @@ -79,23 +78,16 @@ public class BytecodeGenMethod implements StatementVisitor{ this.lamCounter = -1; this.varsFunInterface = new ArrayList<>(); - System.out.println("PARAMS = "+this.paramsAndLocals.size()); if(!isInterface) this.m.block.accept(this); -// System.out.println("PARAMS = "+this.paramsAndLocals.size()); -// for(int i = 0; i classFiles) { - System.out.println("\t\t++++++IN LAMBDA -------"); - this.where = "<<<<<< LAMBDA METHOD >>>>>>"; +// this.where = "<<<<<< LAMBDA METHOD >>>>>>"; this.resultSet = resultSet; this.mv = mv; this.isInterface = isInterface; @@ -114,7 +106,6 @@ public class BytecodeGenMethod implements StatementVisitor{ } private String getResolvedType(RefTypeOrTPHOrWildcardOrGeneric type) { -// return resultSet.resolveType(type).resolvedType.toString().replace(".", "/"); return resultSet.resolveType(type).resolvedType.acceptTV(new TypeToDescriptor()); } @@ -122,10 +113,8 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(Block block) { for(Statement stmt : block.getStatements()) { - System.out.println(where); - System.out.println("Stmt : " + stmt.toString()); +// System.out.println(where); stmt.accept(this); - System.out.println("--------------------------\n"); } } @@ -140,7 +129,7 @@ public class BytecodeGenMethod implements StatementVisitor{ // ?? @Override public void visit(LocalVar localVar) { - System.out.println("in Local Var: " + localVar.name); +// System.out.println("in Local Var: " + localVar.name); mv.visitVarInsn(Opcodes.ALOAD, paramsAndLocals.get(localVar.name)); } // ?? @@ -148,12 +137,12 @@ public class BytecodeGenMethod implements StatementVisitor{ public void visit(LocalVarDecl localVarDecl) { // Integer i; // paramsAndLocals.put(localVarDecl.getName(), paramsAndLocals.size()+1); - System.out.println("In localVarDecl :: "+localVarDecl.getName()); +// System.out.println("In localVarDecl :: "+localVarDecl.getName()); } @Override public void visit(Assign assign) { - System.out.println("Assign : \nright = "+assign.rightSide + "\nLeft = " + assign.lefSide); +// System.out.println("Assign : \nright = "+assign.rightSide + "\nLeft = " + assign.lefSide); // if the right side is a lambda => the left side must be a functional interface if(assign.rightSide.getClass().equals(LambdaExpression.class)) { @@ -162,7 +151,6 @@ public class BytecodeGenMethod implements StatementVisitor{ isRightSideALambda = false; } - System.out.println("\t isRight Side lambda: " + isRightSideALambda); if(assign.lefSide.getClass().equals(AssignToField.class)) { // load_0, ldc or .. then putfield this.rightSideTemp = assign.rightSide; @@ -175,16 +163,13 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(Binary binary) { - System.out.println("\t++ In Binary: "); + } @Override public void visit(LambdaExpression lambdaExpression) { - System.out.println("\n++ In Lambda: "); this.lamCounter++; - System.out.println("Lam Hs Gens: " + lambdaExpression.getGenerics().iterator().hasNext()); - System.out.println("Lam Hs Gens: " + resultSet.resolveType(lambdaExpression.getReturnType()).resolvedType.acceptTV(new TypeToSignature())); Lambda lam = new Lambda(lambdaExpression); String lamDesc = lam.accept(new DescriptorToString(resultSet)); //Call site, which, when invoked, returns an instance of the functional interface to which @@ -206,7 +191,6 @@ public class BytecodeGenMethod implements StatementVisitor{ typeErasure += "L"+Type.getInternalName(Object.class) + ";"; } - System.out.println("LamReturnType: "+lambdaExpression.getReturnType().acceptTV(new TypeToString())); typeErasure += ")L"+Type.getInternalName(Object.class) + ";"; // Type erasure Type arg1 = Type.getMethodType(typeErasure); @@ -235,8 +219,7 @@ public class BytecodeGenMethod implements StatementVisitor{ SamMethod samMethod = new SamMethod(kindOfLambda.getArgumentList(), lambdaExpression.getType()); // Desc: (this/nothing)TargetType String fiMethodDesc = samMethod.accept(new DescriptorToString(resultSet)); - mv.visitInvokeDynamicInsn("apply", fiMethodDesc, bootstrap, - arg1, arg2,arg3); + mv.visitInvokeDynamicInsn("apply", fiMethodDesc, bootstrap, arg1, arg2,arg3); MethodVisitor mvLambdaBody = cw.visitMethod(Opcodes.ACC_PRIVATE+ staticOrInstance + Opcodes.ACC_SYNTHETIC, methodName, arg3.toString(), null, null); @@ -249,32 +232,31 @@ public class BytecodeGenMethod implements StatementVisitor{ cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL); - generateBCForFunN(lambdaExpression); + generateBCForFunN(lambdaExpression,typeErasure); } - private void generateBCForFunN(LambdaExpression lambdaExpression) { + private void generateBCForFunN(LambdaExpression lambdaExpression, String methDesc) { ClassWriter classWriter =new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS); SignatureWriter methSig = new SignatureWriter(); - String methDesc = "("; + int numberOfParams = 0; SignatureVisitor paramVisitor = methSig.visitParameterType(); Iterator itr = lambdaExpression.params.iterator(); while(itr.hasNext()) { numberOfParams++; // getBounds - methDesc += "L"+Type.getInternalName(Object.class)+";"; paramVisitor.visitTypeVariable("T"+numberOfParams); itr.next(); } methSig.visitReturnType().visitTypeVariable("R"); // ")"+lam.getReturn.getBounds - methDesc += ")L"+Type.getInternalName(Object.class)+";"; Signature sig = new Signature(lambdaExpression,numberOfParams); String name = "Fun"+numberOfParams; classWriter.visit(Opcodes.V1_8, Opcodes.ACC_INTERFACE+Opcodes.ACC_ABSTRACT, name, sig.toString(), Type.getInternalName(Object.class), null); - MethodVisitor mvApply = classWriter.visitMethod(Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT, "apply", methDesc, methSig.toString(), null); + MethodVisitor mvApply = classWriter.visitMethod(Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT, "apply", + methDesc, methSig.toString(), null); mvApply.visitEnd(); writeClassFile(classWriter.toByteArray(),name); } @@ -282,8 +264,8 @@ public class BytecodeGenMethod implements StatementVisitor{ public void writeClassFile(byte[] bytecode, String name) { FileOutputStream output; try { - System.out.println("generating"+name+ ".class file"); - output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/" +name+".class")); + System.out.println("generating "+name+ ".class file..."); + output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/examples/" +name+".class")); output.write(bytecode); output.close(); System.out.println(name+".class file generated"); @@ -309,7 +291,6 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(FieldVar fieldVar) { - System.out.println("in fieldVar " + fieldVar.fieldVarName + " ** receiver: "+fieldVar.receiver); fieldName = fieldVar.fieldVarName; fieldDesc = "L"+getResolvedType(fieldVar.getType())+";"; @@ -333,7 +314,7 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(IfStmt ifStmt) { - System.out.println("++ IF-Statment: "); + } @Override @@ -344,13 +325,11 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(MethodCall methodCall) { - System.out.println(" In Methodcall: (" +methodCall.name+")" ); - System.out.print("\t\tMethod-Receiver: "); - if(methodCall.receiver instanceof ExpressionReceiver){ - System.out.print(((ExpressionReceiver) methodCall.receiver).expr + "\n"); - }else{ - System.out.print(((StaticClassName) methodCall.receiver).getType().toString() + "\n"); - } +// if(methodCall.receiver instanceof ExpressionReceiver){ +// System.out.print(((ExpressionReceiver) methodCall.receiver).expr + "\n"); +// }else{ +// System.out.print(((StaticClassName) methodCall.receiver).getType().toString() + "\n"); +// } methodCall.receiver.accept(this); methodCall.arglist.accept(this); @@ -359,14 +338,13 @@ public class BytecodeGenMethod implements StatementVisitor{ genericsAndBoundsMethod,genericsAndBounds); String mDesc = method.accept(new DescriptorToString(resultSet)); - System.out.println("is Vars empty: "+varsFunInterface.isEmpty()); +// System.out.println("is Vars empty: "+varsFunInterface.isEmpty()); // is methodCall.receiver functional Interface)? if(varsFunInterface.contains(methodCall.receiver.getType())) { mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, getResolvedType(methodCall.receiver.getType()), methodCall.name, mDesc, false); }else { - System.out.println("mDesc = " + mDesc); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getResolvedType(methodCall.receiver.getType()), methodCall.name, mDesc, isInterface); } @@ -378,8 +356,8 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(NewClass methodCall) { - System.out.println("In NewClass: "); - System.out.println("\t\tname: " + methodCall.name + " *** " + "Receiver: " + methodCall.receiver); +// System.out.println("In NewClass: "); +// System.out.println("\t\tname: " + methodCall.name + " *** " + "Receiver: " + methodCall.receiver); mv.visitTypeInsn(Opcodes.NEW, methodCall.name.replace(".", "/")); mv.visitInsn(Opcodes.DUP); @@ -402,8 +380,6 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(ExpressionReceiver receiver) { - System.out.println(" in Receiver"); - System.out.println(" expr : " + receiver.expr); receiver.expr.accept(this); } @@ -420,7 +396,6 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(StaticClassName staticClassName) { - System.out.println("In StaticClassName: "); // mv.visitMethodInsn(Opcodes.INVOKESTATIC, staticClassName.getType().toString().replace(".", "/"), // staticClassName.toString(), staticClassName.getType().toString(), false); mv.visitFieldInsn(Opcodes.GETSTATIC, getResolvedType(staticClassName.getType()), @@ -429,18 +404,17 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(Super aSuper) { - System.out.println(">> In Super: "); + } @Override public void visit(This aThis) { - System.out.println("-> IN This"); mv.visitVarInsn(Opcodes.ALOAD, 0); } @Override public void visit(UnaryPlus unaryPlus) { - System.out.println("++ In UnaryPlus: "); + } @Override @@ -468,11 +442,9 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(ArgumentList argumentList) { - System.out.println("in ArgumentList: "); for(Expression al : argumentList.getArguments()) { al.accept(this); } - System.out.println("out from Argumentlist"); } @Override @@ -491,7 +463,6 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(AssignToLocal assignLeftSide) { - System.out.println("In Assign To Local: "); if(isRightSideALambda) varsFunInterface.add(assignLeftSide.localVar.getType()); paramsAndLocals.put(assignLeftSide.localVar.name, paramsAndLocals.size()+1); diff --git a/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java index 2ed48867..c7c623b6 100644 --- a/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java +++ b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java @@ -7,8 +7,10 @@ import de.dhbwstuttgart.bytecode.MethodFromMethodCall; import de.dhbwstuttgart.bytecode.NormalConstructor; import de.dhbwstuttgart.bytecode.NormalMethod; import de.dhbwstuttgart.bytecode.SamMethod; +import de.dhbwstuttgart.bytecode.signature.TypeToSignature; import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.statement.Expression; +import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; import de.dhbwstuttgart.typeinference.result.ResultSet; @@ -35,6 +37,8 @@ public class DescriptorToString implements DescriptorVisitor{ Iterator itr = method.getParameterList().iterator(); while(itr.hasNext()) { FormalParameter fp = itr.next(); +// System.out.println(resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToSignature())); +// System.out.println("Parmetrisierte typ ? "+ ((RefType) fp.getType()).getParaList().size()); if(method.hasGen()) { String fpDesc = fp.getType().acceptTV(new TypeToDescriptor()); if(method.getGenericsAndBoundsMethod().containsKey(fpDesc)) { @@ -44,6 +48,8 @@ public class DescriptorToString implements DescriptorVisitor{ }else { desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";"; } + }else if(((RefType) fp.getType()).getParaList().size() > 0){ + desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "%").replace("<", "%%").replace(">", "%%")+ ";"; }else { desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";"; } @@ -76,16 +82,16 @@ public class DescriptorToString implements DescriptorVisitor{ while(itr.hasNext()) { FormalParameter fp = itr.next(); if(constructor.hasGen()) { - System.out.println("Cons has Gens"); +// System.out.println("Cons has Gens"); String fpDesc = fp.getType().acceptTV(new TypeToDescriptor()); - System.out.println(fpDesc); +// System.out.println(fpDesc); if(constructor.getGenericsAndBounds().containsKey(fpDesc)){ desc += "L"+constructor.getGenericsAndBounds().get(fpDesc)+ ";"; }else { desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";"; } }else { - System.out.println("Cons has NOT Gens"); +// System.out.println("Cons has NOT Gens"); desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";"; } } diff --git a/src/de/dhbwstuttgart/bytecode/signature/Signature.java b/src/de/dhbwstuttgart/bytecode/signature/Signature.java index 1c208b85..fc9e2191 100644 --- a/src/de/dhbwstuttgart/bytecode/signature/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -61,7 +61,6 @@ public class Signature { private void createSignatureForFunN(LambdaExpression lambdaExpression, int numberOfParams) { -// sw.visitReturnType().visitTypeVariable("R"); sw.visitFormalTypeParameter("R"); // getBounds vom Return-Type sw.visitClassBound().visitClassType(Type.getInternalName(Object.class)); @@ -73,7 +72,6 @@ public class Signature { sw.visitClassBound().visitClassType(Type.getInternalName(Object.class)); sw.visitClassBound().visitEnd(); } -// sw.visitClassBound().visitEnd(); // TODO: prüfe ob Return-Type = void, sw.visitSuperclass().visitClassType(Type.getInternalName(Object.class));; sw.visitEnd(); @@ -136,7 +134,7 @@ public class Signature { RefTypeOrTPHOrWildcardOrGeneric r = resultSet.resolveType(t).resolvedType; sv.visitInterface().visitClassType(r.acceptTV(new TypeToSignature())); // sv.visitClassType(r.acceptTV(new TypeToSignature())); - System.out.println(r.getClass()+" Signature TPH: "+r.acceptTV(new TypeToSignature())); +// System.out.println(r.getClass()+" Signature TPH: "+r.acceptTV(new TypeToSignature())); break; default: if(!isParameterType) @@ -172,7 +170,7 @@ public class Signature { while(bItr.hasNext()) { RefTypeOrTPHOrWildcardOrGeneric b =bItr.next(); String boundDesc = b.acceptTV(new TypeToDescriptor()); - System.out.println("GetBounds: " + boundDesc); +// System.out.println("GetBounds: " + boundDesc); // Ensure that <...> extends java.lang.Object OR ... sw.visitClassBound().visitClassType(boundDesc); genAndBounds.put(g.getParsedName(), boundDesc); diff --git a/test/bytecode/ATest.java b/test/bytecode/ATest.java new file mode 100644 index 00000000..9865825e --- /dev/null +++ b/test/bytecode/ATest.java @@ -0,0 +1,8 @@ +package bytecode; + +public class ATest extends JavaTXCompilerTest { + public ATest() { + fileName = "A"; + } + +} diff --git a/test/bytecode/DuMethod.jav b/test/bytecode/DuMethod.jav index b56f6c55..3898a7ba 100644 --- a/test/bytecode/DuMethod.jav +++ b/test/bytecode/DuMethod.jav @@ -1,7 +1,7 @@ public class DuMethod{ method(a){ - return a; + return a+a; } method(a){ diff --git a/test/bytecode/Example.jav b/test/bytecode/Example.jav new file mode 100644 index 00000000..451803ea --- /dev/null +++ b/test/bytecode/Example.jav @@ -0,0 +1,7 @@ +public class Example { + + public m() { + String x = "X"; + return x; + } +} \ No newline at end of file diff --git a/test/bytecode/Import.jav b/test/bytecode/Import.jav new file mode 100644 index 00000000..c658568f --- /dev/null +++ b/test/bytecode/Import.jav @@ -0,0 +1,8 @@ +import java.util.Vector; + +class Import { + void methode(){ + Vector v = new Vector<>(); + v.add("X"); + } +} \ No newline at end of file diff --git a/test/bytecode/ImportTest.java b/test/bytecode/ImportTest.java new file mode 100644 index 00000000..b7244e15 --- /dev/null +++ b/test/bytecode/ImportTest.java @@ -0,0 +1,7 @@ +package bytecode; + +public class ImportTest extends JavaTXCompilerTest{ + public ImportTest() { + this.fileName = "Import"; + } +} diff --git a/test/bytecode/JavaTXCompilerTest.java b/test/bytecode/JavaTXCompilerTest.java index f017e23e..2f832962 100644 --- a/test/bytecode/JavaTXCompilerTest.java +++ b/test/bytecode/JavaTXCompilerTest.java @@ -34,17 +34,16 @@ public class JavaTXCompilerTest { filesToTest.add(new File(rootDirectory+fileName+".jav")); System.out.println(rootDirectory+fileName+".jav"); JavaTXCompiler compiler = new JavaTXCompiler(filesToTest); - System.out.println("test"); for(File f : filesToTest){ String content = readFile(f.getPath(), StandardCharsets.UTF_8); List typeinferenceResult = compiler.typeInference(); HashMap bytecode = this.getBytecode(compiler.sourceFiles.get(f), typeinferenceResult.get(0)); - for(ResultPair ep : typeinferenceResult.get(0).results) { - System.out.println(ep.getLeft() + " ->" + ep.getRight()); - } +// for(ResultPair ep : typeinferenceResult.get(0).results) { +// System.out.println(ep.getLeft() + " ->" + ep.getRight()); +// } - String name = ""; + String name; int pos = f.getName().lastIndexOf("."); if(pos != -1) { name = f.getName().substring(0, pos); @@ -67,8 +66,8 @@ public class JavaTXCompilerTest { for(String name : classFiles.keySet()) { byte[] bytecode = classFiles.get(name); try { - System.out.println("generating"+name+ ".class file"); - output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/" +name+".class")); + System.out.println("generating "+name+ ".class file ..."); + output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/examples/" +name+".class")); output.write(bytecode); output.close(); System.out.println(name+".class file generated"); diff --git a/test/bytecode/LamAssign.jav b/test/bytecode/LamAssign.jav index 8f42d5ea..e522bd3b 100644 --- a/test/bytecode/LamAssign.jav +++ b/test/bytecode/LamAssign.jav @@ -7,7 +7,3 @@ class LamAssign { return lam1; } } - -//interface Fun1{ -// A apply(B b); -//} diff --git a/test/bytecode/OverlaodGen.jav b/test/bytecode/OverlaodGen.jav new file mode 100644 index 00000000..d5946496 --- /dev/null +++ b/test/bytecode/OverlaodGen.jav @@ -0,0 +1,11 @@ +import java.util.Vector; + +class OverlaodGen { + void method(Vector v) { +// Integer i = v.get(0); + } + + void method(Vector v) { +// String s = v.get(0); + } +} \ No newline at end of file diff --git a/test/bytecode/OverlaodGenTest.java b/test/bytecode/OverlaodGenTest.java new file mode 100644 index 00000000..72bde4f9 --- /dev/null +++ b/test/bytecode/OverlaodGenTest.java @@ -0,0 +1,7 @@ +package bytecode; + +public class OverlaodGenTest extends JavaTXCompilerTest { + public OverlaodGenTest() { + this.fileName = "OverlaodGen"; + } +} From 56d919f446216cd19ec8a5c55d9adf50d474a3af Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 31 Jan 2018 15:55:02 +0100 Subject: [PATCH 06/65] bug fix --- src/de/dhbwstuttgart/bytecode/BytecodeGen.java | 2 +- src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java | 6 +++--- .../bytecode/descriptor/DescriptorToString.java | 8 +++++--- .../dhbwstuttgart/bytecode/signature/TypeToSignature.java | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index d4fee65f..8aa4c9e2 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -181,7 +181,7 @@ public class BytecodeGen implements ASTVisitor { Signature signature = new Signature(method, genericsAndBoundsMethod, methodParamsAndTypes,resultSet); sig = signature.toString(); } - + System.out.println(sig); NormalMethod meth = new NormalMethod(method,genericsAndBounds,genericsAndBoundsMethod,hasGen); methDesc = meth.accept(new DescriptorToString(resultSet)); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC+acc, method.getName(), methDesc, sig, null); diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index 65834125..b2c38397 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -31,6 +31,7 @@ import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal; import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.StatementVisitor; +import de.dhbwstuttgart.syntaxtree.statement.literal.BoolLiteral; import de.dhbwstuttgart.syntaxtree.statement.literal.Literal; import de.dhbwstuttgart.syntaxtree.statement.literal.Null; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; @@ -420,8 +421,8 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(WhileStmt whileStmt) { - // TODO Auto-generated method stub - + whileStmt.expr.accept(this); + whileStmt.loopBlock.accept(this); } @Override @@ -437,7 +438,6 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(Literal literal) { - // value? mv.visitLdcInsn(getResolvedType(literal.getType())); } diff --git a/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java index c7c623b6..c9725a82 100644 --- a/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java +++ b/src/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java @@ -48,9 +48,11 @@ public class DescriptorToString implements DescriptorVisitor{ }else { desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";"; } - }else if(((RefType) fp.getType()).getParaList().size() > 0){ - desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "%").replace("<", "%%").replace(">", "%%")+ ";"; - }else { + } +// else if(((RefType) fp.getType()).getParaList().size() > 0){ +// desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "%").replace("<", "%%").replace(">", "%%")+ ";"; +// } + else { desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";"; } } diff --git a/src/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java b/src/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java index bbc19c37..78b2fb22 100644 --- a/src/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java @@ -25,9 +25,9 @@ public class TypeToSignature implements TypeVisitor { params += "L"+param.toString().replace(".", "/"); if(it.hasNext())params += ";"; } - params += ";>;"; + params += ";>"; } - return refType.getName().toString().replace(".", "/") + params; + return refType.getName().toString().replace(".", "/") + params+";"; } @Override From b32e437a05fffc852dd303c6df68753cdadfab3d Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 31 Jan 2018 16:16:05 +0100 Subject: [PATCH 07/65] Fehler --- src/de/dhbwstuttgart/bytecode/BytecodeGen.java | 4 ++-- test/bytecode/ATest.java | 2 +- test/bytecode/Example.jav | 4 ++-- test/bytecode/For.jav | 13 +++++++++++++ test/bytecode/ForTest.java | 9 +++++++++ test/bytecode/LamAssign.jav | 1 + 6 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 test/bytecode/For.jav create mode 100644 test/bytecode/ForTest.java diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index 8ec49b8b..57aeecc3 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -155,7 +155,7 @@ public class BytecodeGen implements ASTVisitor { String methDesc = null; // Method getModifiers() ? - int acc = isInterface?Opcodes.ACC_ABSTRACT:0; + int acc = isInterface?Opcodes.ACC_ABSTRACT:method.modifier; boolean hasGenInParameterList = genericsAndBounds.containsKey(resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor())); if(!hasGenInParameterList) { @@ -183,7 +183,7 @@ public class BytecodeGen implements ASTVisitor { System.out.println(sig); NormalMethod meth = new NormalMethod(method,genericsAndBounds,genericsAndBoundsMethod,hasGen); methDesc = meth.accept(new DescriptorToString(resultSet)); - MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC+acc, method.getName(), methDesc, sig, null); + MethodVisitor mv = cw.visitMethod(acc, method.getName(), methDesc, sig, null); mv.visitCode(); diff --git a/test/bytecode/ATest.java b/test/bytecode/ATest.java index 9865825e..14dbacbf 100644 --- a/test/bytecode/ATest.java +++ b/test/bytecode/ATest.java @@ -2,7 +2,7 @@ package bytecode; public class ATest extends JavaTXCompilerTest { public ATest() { - fileName = "A"; + fileName = "Example"; } } diff --git a/test/bytecode/Example.jav b/test/bytecode/Example.jav index 451803ea..8fc7a0a7 100644 --- a/test/bytecode/Example.jav +++ b/test/bytecode/Example.jav @@ -1,7 +1,7 @@ public class Example { - public m() { - String x = "X"; + public m(Integer x) { +// String x = "X"; return x; } } \ No newline at end of file diff --git a/test/bytecode/For.jav b/test/bytecode/For.jav new file mode 100644 index 00000000..c93b34c4 --- /dev/null +++ b/test/bytecode/For.jav @@ -0,0 +1,13 @@ +class For{ + m(Integer x){ + Boolean b = true; + while(x<2){ + x = x +1; + b = false; + } + return x; +// for(int i = 0;i<10;i++) { +// x = x + 5; +// } + } +} \ No newline at end of file diff --git a/test/bytecode/ForTest.java b/test/bytecode/ForTest.java new file mode 100644 index 00000000..7df68665 --- /dev/null +++ b/test/bytecode/ForTest.java @@ -0,0 +1,9 @@ +package bytecode; + +public class ForTest extends JavaTXCompilerTest { + + public ForTest() { + this.fileName = "For"; + } + +} diff --git a/test/bytecode/LamAssign.jav b/test/bytecode/LamAssign.jav index e522bd3b..7fd5bc64 100644 --- a/test/bytecode/LamAssign.jav +++ b/test/bytecode/LamAssign.jav @@ -1,3 +1,4 @@ + class LamAssign { m () { From 9c4f763c9af94761a682e7148d5540fb47abfd49 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 31 Jan 2018 16:42:25 +0100 Subject: [PATCH 08/65] =?UTF-8?q?java.lang.=20nicht=20standardm=C3=A4?= =?UTF-8?q?=C3=9Fig=20importieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/dhbwstuttgart/parser/scope/GatherNames.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/parser/scope/GatherNames.java b/src/de/dhbwstuttgart/parser/scope/GatherNames.java index cd508cde..69481508 100644 --- a/src/de/dhbwstuttgart/parser/scope/GatherNames.java +++ b/src/de/dhbwstuttgart/parser/scope/GatherNames.java @@ -72,7 +72,7 @@ public class GatherNames { public static Map getImports(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages) throws ClassNotFoundException { Map ret = new HashMap<>(); ClassLoader classLoader = ClassLoader.getSystemClassLoader(); - ret.putAll(packages.getClassNames("java.lang")); + //ret.putAll(packages.getClassNames("java.lang")); for(Java8Parser.ImportDeclarationContext importDeclCtx : ctx.importDeclaration()){ if(importDeclCtx.singleTypeImportDeclaration() != null){ Class cl = classLoader.loadClass(importDeclCtx.singleTypeImportDeclaration().typeName().getText()); From 52487f3389431512294c244a1982a1a9400ce75a Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 31 Jan 2018 16:47:08 +0100 Subject: [PATCH 09/65] test LamAssign --- test/bytecode/LamAssign.jav | 1 - 1 file changed, 1 deletion(-) diff --git a/test/bytecode/LamAssign.jav b/test/bytecode/LamAssign.jav index 7fd5bc64..e522bd3b 100644 --- a/test/bytecode/LamAssign.jav +++ b/test/bytecode/LamAssign.jav @@ -1,4 +1,3 @@ - class LamAssign { m () { From 1f89238fe4572bb81f706ca8cdb8156842e78407 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 31 Jan 2018 18:38:52 +0100 Subject: [PATCH 10/65] Kleiner Bug beseitigt. Ungetesteter Stand --- .../parser/SyntaxTreeGenerator/TypeGenerator.java | 4 +++- test/javFiles/Faculty.jav | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java index 1dd259d0..ccc7b327 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java @@ -114,7 +114,9 @@ public class TypeGenerator { if(referenceTypeContext.classOrInterfaceType() != null){ if(referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType()!= null){ Java8Parser.ClassType_lfno_classOrInterfaceTypeContext ctx = referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType(); - return convertTypeName(ctx.Identifier().toString(), ctx.typeArguments(),referenceTypeContext.getStart(), reg, generics); + //return convertTypeName(ctx.Identifier().toString(), ctx.typeArguments(),referenceTypeContext.getStart(), reg, generics); + if(ctx.typeArguments() != null)throw new NotImplementedException(); + return convertTypeName(referenceTypeContext.getText(), null,referenceTypeContext.getStart(), reg, generics); }else{ throw new NotImplementedException(); } diff --git a/test/javFiles/Faculty.jav b/test/javFiles/Faculty.jav index 50bd7e78..089d2f33 100644 --- a/test/javFiles/Faculty.jav +++ b/test/javFiles/Faculty.jav @@ -6,10 +6,14 @@ class Faculty { return x; } - m () { + Fun1 m () { var fact = (Integer x) -> { return mul(x, fact.apply(x)); }; return fact; } } + +interface Fun1{ + B apply(A a); +} \ No newline at end of file From 22499f09e850adff3f020f66c3663b647dfecf6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Thu, 1 Feb 2018 00:17:12 +0100 Subject: [PATCH 11/65] modified: src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java Zeile 101 Dangling-else Problematik behoben War Fehler im Occurs-Cheeck von Montanari-Martelli. --- src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java b/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java index dc90847b..482155fc 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java +++ b/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java @@ -98,9 +98,10 @@ public final class TypeParams implements Iterable{ */ public boolean occurs(PlaceholderType t) { for(UnifyType p : typeParams) - if(p instanceof PlaceholderType) + if(p instanceof PlaceholderType) {//PL 2018-01-31 dangeling else Problem { ... } eingefuegt. if(p.equals(t)) return true; + } else if(p.getTypeParams().occurs(t)) return true; From 2d5c86300861da604de50345d90f713ff41022cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Wed, 7 Feb 2018 14:38:45 +0100 Subject: [PATCH 12/65] HEAD detached at 2f994cdf Changes to be committed: Aenderungen am Unify: Fehler behoben und Vereinfachung modified: src/de/dhbwstuttgart/core/JavaTXCompiler.java new file: src/de/dhbwstuttgart/typeinference/unify/Match.java modified: src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java new file: src/de/dhbwstuttgart/typeinference/unify/interfaces/IMatch.java modified: src/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java modified: src/de/dhbwstuttgart/typeinference/unify/model/Node.java modified: src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java modified: src/de/dhbwstuttgart/typeinference/unify/model/Unifier.java modified: test/javFiles/Matrix.jav --- src/de/dhbwstuttgart/core/JavaTXCompiler.java | 4 +- .../typeinference/unify/Match.java | 89 +++++++++++++++++++ .../typeinference/unify/TypeUnifyTask.java | 53 ++++++++--- .../unify/interfaces/IMatch.java | 35 ++++++++ .../unify/model/FiniteClosure.java | 25 +++++- .../typeinference/unify/model/Node.java | 3 +- .../typeinference/unify/model/TypeParams.java | 8 +- .../typeinference/unify/model/Unifier.java | 8 ++ test/javFiles/Matrix.jav | 28 +++--- 9 files changed, 218 insertions(+), 35 deletions(-) create mode 100644 src/de/dhbwstuttgart/typeinference/unify/Match.java create mode 100644 src/de/dhbwstuttgart/typeinference/unify/interfaces/IMatch.java diff --git a/src/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/de/dhbwstuttgart/core/JavaTXCompiler.java index e8d74cb6..8d381e37 100644 --- a/src/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -102,8 +102,8 @@ public class JavaTXCompiler { System.out.println(xConsSet); Set> result = unify.unify(xConsSet, finiteClosure); - System.out.println("RESULT: " + result); - results.addAll(result); + System.out.println("RESULT: " + result.size()); + //results.addAll(result); } return results.stream().map((unifyPairs -> new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList()); diff --git a/src/de/dhbwstuttgart/typeinference/unify/Match.java b/src/de/dhbwstuttgart/typeinference/unify/Match.java new file mode 100644 index 00000000..78f7360f --- /dev/null +++ b/src/de/dhbwstuttgart/typeinference/unify/Match.java @@ -0,0 +1,89 @@ +package de.dhbwstuttgart.typeinference.unify; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import de.dhbwstuttgart.typeinference.unify.interfaces.IMatch; +import de.dhbwstuttgart.typeinference.unify.model.PairOperator; +import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType; +import de.dhbwstuttgart.typeinference.unify.model.TypeParams; +import de.dhbwstuttgart.typeinference.unify.model.Unifier; +import de.dhbwstuttgart.typeinference.unify.model.UnifyPair; +import de.dhbwstuttgart.typeinference.unify.model.UnifyType; + +/** + * Implementation of match derived from unification algorithm. + * @author Martin Pluemicke + */ +public class Match implements IMatch { + + @Override + public Optional match(ArrayList termsList) { + + // Start with the identity unifier. Substitutions will be added later. + Unifier mgu = Unifier.identity(); + + // Apply rules while possible + int idx = 0; + while(idx < termsList.size()) { + UnifyPair pair = termsList.get(idx); + UnifyType rhsType = pair.getRhsType(); + UnifyType lhsType = pair.getLhsType(); + TypeParams rhsTypeParams = rhsType.getTypeParams(); + TypeParams lhsTypeParams = lhsType.getTypeParams(); + + // REDUCE - Rule + if(!(rhsType instanceof PlaceholderType) && !(lhsType instanceof PlaceholderType)) { + Set result = new HashSet<>(); + + // f<...> = g<...> with f != g are not unifiable + if(!rhsType.getName().equals(lhsType.getName())) + return Optional.empty(); // conflict + // f = f are not unifiable + if(rhsTypeParams.size() != lhsTypeParams.size()) + return Optional.empty(); // conflict + // f = g is not unifiable (cannot be f = f because erase rule would have been applied) + //if(rhsTypeParams.size() == 0) + //return Optional.empty(); + + // Unpack the arguments + for(int i = 0; i < rhsTypeParams.size(); i++) + result.add(new UnifyPair(lhsTypeParams.get(i), rhsTypeParams.get(i), PairOperator.EQUALSDOT)); + + termsList.remove(idx); + termsList.addAll(result); + continue; + } + + // DELETE - Rule + if(pair.getRhsType().equals(pair.getLhsType())) { + termsList.remove(idx); + continue; + } + + // SWAP - Rule + if(!(lhsType instanceof PlaceholderType) && (rhsType instanceof PlaceholderType)) { + return Optional.empty(); // conflict + } + + // OCCURS-CHECK + //deleted + + // SUBST - Rule + if(lhsType instanceof PlaceholderType) { + mgu.add((PlaceholderType) lhsType, rhsType); + termsList = termsList.stream().map(mgu::applyleft).collect(Collectors.toCollection(ArrayList::new)); + idx = idx+1 == termsList.size() ? 0 : idx+1; + continue; + } + + idx++; + } + + return Optional.of(mgu); + } +} diff --git a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 2005a387..e51679e2 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -34,6 +34,7 @@ import de.dhbwstuttgart.typeinference.unify.model.UnifyType; public class TypeUnifyTask extends RecursiveTask>> { private static final long serialVersionUID = 1L; + private static int i = 0; /** * The implementation of setOps that will be used during the unification @@ -77,6 +78,7 @@ public class TypeUnifyTask extends RecursiveTask>> { /* * Step 1: Repeated application of reduce, adapt, erase, swap */ + //System.out.println("Unifikation: " + eq); Set eq0 = applyTypeUnificationRules(eq, fc); /* @@ -97,6 +99,8 @@ public class TypeUnifyTask extends RecursiveTask>> { // cartesian product of the sets created by pattern matching. List>> topLevelSets = new ArrayList<>(); + System.out.println(eq2s); + if(eq1s.size() != 0) { // Do not add empty sets or the cartesian product will always be empty. Set> wrap = new HashSet<>(); wrap.add(eq1s); @@ -134,12 +138,16 @@ public class TypeUnifyTask extends RecursiveTask>> { // Sub cartesian products of the second level (pattern matched) sets // "the big (x)" for(Set>> secondLevelSet : secondLevelSets) { + //System.out.println("secondLevelSet "+secondLevelSet.size()); List>> secondLevelSetList = new ArrayList<>(secondLevelSet); Set>> cartResult = setOps.cartesianProduct(secondLevelSetList); - + //System.out.println("CardResult: "+cartResult.size()); // Flatten and add to top level sets Set> flat = new HashSet<>(); + int j = 0; for(List> s : cartResult) { + j++; + //System.out.println("s from CardResult: "+cartResult.size() + " " + j); Set flat1 = new HashSet<>(); for(Set s1 : s) flat1.addAll(s1); @@ -164,6 +172,7 @@ public class TypeUnifyTask extends RecursiveTask>> { /* * Step 5: Substitution */ + System.out.println("vor Subst: " + eqPrime); Optional> eqPrimePrime = rules.subst(eqPrime); /* @@ -176,11 +185,13 @@ public class TypeUnifyTask extends RecursiveTask>> { //(!eqPrimePrime.isPresent()) erfolgt ist, ist das Ergebnis erzielt. eqPrimePrimeSet.add(eqPrime); else if(eqPrimePrime.isPresent()) { + System.out.println("nextStep: " + eqPrimePrime.get()); TypeUnifyTask fork = new TypeUnifyTask(eqPrimePrime.get(), fc, true); forks.add(fork); fork.fork(); } else { + System.out.println("nextStep: " + eqPrime); TypeUnifyTask fork = new TypeUnifyTask(eqPrime, fc, true); forks.add(fork); fork.fork(); @@ -381,9 +392,12 @@ public class TypeUnifyTask extends RecursiveTask>> { UnifyType rhsType = pair.getRhsType(); // Case 1: (a <. Theta') - if(pairOp == PairOperator.SMALLERDOT && lhsType instanceof PlaceholderType) - result.get(0).add(unifyCase1((PlaceholderType) pair.getLhsType(), pair.getRhsType(), fc)); - + if(pairOp == PairOperator.SMALLERDOT && lhsType instanceof PlaceholderType) { + System.out.println(pair); + Set> x1 = unifyCase1((PlaceholderType) pair.getLhsType(), pair.getRhsType(), fc); + System.out.println(x1); + result.get(0).add(x1); + } // Case 2: (a <.? ? ext Theta') else if(pairOp == PairOperator.SMALLERDOTWC && lhsType instanceof PlaceholderType && rhsType instanceof ExtendsType) result.get(1).add(unifyCase2((PlaceholderType) pair.getLhsType(), (ExtendsType) pair.getRhsType(), fc)); @@ -442,13 +456,24 @@ public class TypeUnifyTask extends RecursiveTask>> { break; } - Set cs = fc.getAllTypesByName(thetaPrime.getName()); - cs.add(thetaPrime); + Set cs = fc.getAllTypesByName(thetaPrime.getName());//cs= [java.util.Vector, java.util.Vector>, ????java.util.Vector???] + + //PL 18-02-06 entfernt, kommt durch unify wieder rein + //cs.add(thetaPrime); + //PL 18-02-06 entfernt for(UnifyType c : cs) { - Set thetaQs = fc.getChildren(c).stream().collect(Collectors.toCollection(HashSet::new)); - thetaQs.add(thetaPrime); //PL 2017-10-03: War auskommentiert habe ich wieder einkommentiert, - //da children offensichtlich ein echtes kleiner und kein kleinergleich ist + //PL 18-02-05 getChildren durch smaller ersetzt in getChildren werden die Varianlen nicht ersetzt. + Set thetaQs = fc.smaller(c).stream().collect(Collectors.toCollection(HashSet::new)); + //Set thetaQs = fc.getChildren(c).stream().collect(Collectors.toCollection(HashSet::new)); + //thetaQs.add(thetaPrime); //PL 18-02-05 wieder geloescht + //PL 2017-10-03: War auskommentiert habe ich wieder einkommentiert, + //da children offensichtlich ein echtes kleiner und kein kleinergleich ist + + //PL 18-02-06: eingefuegt, thetaQs der Form V> <. V'> werden entfernt + thetaQs = thetaQs.stream().filter(ut -> ut.getTypeParams().arePlaceholders()).collect(Collectors.toCollection(HashSet::new)); + //PL 18-02-06: eingefuegt + Set thetaQPrimes = new HashSet<>(); TypeParams cParams = c.getTypeParams(); if(cParams.size() == 0) @@ -464,6 +489,11 @@ public class TypeUnifyTask extends RecursiveTask>> { } for(UnifyType tqp : thetaQPrimes) { + //System.out.println(tqp.toString()); + //i++; + //System.out.println(i); + //if (i == 62) + // System.out.println(tqp.toString()); Optional opt = stdUnify.unify(tqp, thetaPrime); if (!opt.isPresent()) continue; @@ -474,10 +504,11 @@ public class TypeUnifyTask extends RecursiveTask>> { for (Entry sigma : unifier) substitutionSet.add(new UnifyPair(sigma.getKey(), sigma.getValue(), PairOperator.EQUALSDOT)); - List freshTphs = new ArrayList<>(); + //List freshTphs = new ArrayList<>(); PL 18-02-06 in die For-Schleife verschoben for (UnifyType tq : thetaQs) { - Set smaller = fc.smaller(unifier.apply(tq)); + Set smaller = fc.smaller(unifier.apply(tq)); for(UnifyType theta : smaller) { + List freshTphs = new ArrayList<>(); Set resultPrime = new HashSet<>(); for(int i = 0; !allGen && i < theta.getTypeParams().size(); i++) { diff --git a/src/de/dhbwstuttgart/typeinference/unify/interfaces/IMatch.java b/src/de/dhbwstuttgart/typeinference/unify/interfaces/IMatch.java new file mode 100644 index 00000000..5e201dd7 --- /dev/null +++ b/src/de/dhbwstuttgart/typeinference/unify/interfaces/IMatch.java @@ -0,0 +1,35 @@ +package de.dhbwstuttgart.typeinference.unify.interfaces; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import de.dhbwstuttgart.typeinference.unify.model.UnifyType; +import de.dhbwstuttgart.typeinference.unify.model.Unifier; +import de.dhbwstuttgart.typeinference.unify.model.UnifyPair; + +/** + * Match + * @author Martin Pluemicke + */ +public interface IMatch { + + /** + * Finds the most general unifier sigma of the set {t1,...,tn} so that + * sigma(t1) = sigma(t2) = ... = sigma(tn). + * @param terms The set of terms to be unified + * @return An optional of the most general unifier if it exists or an empty optional if there is no unifier. + */ + public Optional match(ArrayList termsList); + + /** + * Finds the most general unifier sigma of the set {t1,...,tn} so that + * sigma(t1) = sigma(t2) = ... = sigma(tn). + * @param terms The set of terms to be unified + * @return An optional of the most general unifier if it exists or an empty optional if there is no unifier. + */ + + +} diff --git a/src/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java b/src/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java index aba3d3f6..dcffbee6 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java +++ b/src/de/dhbwstuttgart/typeinference/unify/model/FiniteClosure.java @@ -8,7 +8,11 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +//PL 18-02-05 Unifier durch Matcher ersetzt +//mus greater noch erstezt werden import de.dhbwstuttgart.typeinference.unify.MartelliMontanariUnify; + +import de.dhbwstuttgart.typeinference.unify.Match; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify; @@ -46,6 +50,13 @@ public class FiniteClosure implements IFiniteClosure { if(pair.getPairOp() != PairOperator.SMALLER) continue; + //VERSUCH PL 18-02-06 + //koennte ggf. die FC reduzieren + //TO DO: Ueberpruefen, ob das sinnvll und korrekt ist + //if (!pair.getLhsType().getTypeParams().arePlaceholders() + // && !pair.getRhsType().getTypeParams().arePlaceholders()) + // continue; +; // Add nodes if not already in the graph if(!inheritanceGraph.containsKey(pair.getLhsType())) inheritanceGraph.put(pair.getLhsType(), new Node(pair.getLhsType())); @@ -93,7 +104,9 @@ public class FiniteClosure implements IFiniteClosure { private Set computeSmaller(Set types) { HashSet result = new HashSet<>(); - IUnify unify = new MartelliMontanariUnify(); + //PL 18-02-05 Unifier durch Matcher ersetzt + //IUnify unify = new MartelliMontanariUnify(); + Match match = new Match(); for(UnifyType t : types) { @@ -112,10 +125,16 @@ public class FiniteClosure implements IFiniteClosure { continue; // if T <* T' then sigma(T) <* sigma(T') - Set> candidates = strInheritanceGraph.get(t.getName()); + Set> candidates = strInheritanceGraph.get(t.getName()); //cadidates= [???Node(java.util.Vector>)??? + // , Node(java.util.Vector) + //] for(Node candidate : candidates) { UnifyType theta2 = candidate.getContent(); - Optional optSigma = unify.unify(theta2, t); + //PL 18-02-05 Unifier durch Matcher ersetzt ANFANG + ArrayList termList= new ArrayList(); + termList.add(new UnifyPair(theta2,t, PairOperator.EQUALSDOT)); + Optional optSigma = match.match(termList); + //PL 18-02-05 Unifier durch Matcher ersetzt ENDE if(!optSigma.isPresent()) continue; diff --git a/src/de/dhbwstuttgart/typeinference/unify/model/Node.java b/src/de/dhbwstuttgart/typeinference/unify/model/Node.java index c6aa9b3e..aa375c09 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/model/Node.java +++ b/src/de/dhbwstuttgart/typeinference/unify/model/Node.java @@ -94,6 +94,7 @@ class Node { @Override public String toString() { - return "Node(" + content.toString() + ")\n"; + return "Elem: Node(" + content.toString() + ")\nPrec: " + getContentOfPredecessors().toString() + + "\nDesc: " + getContentOfDescendants().toString() + "\n\n"; } } diff --git a/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java b/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java index dc90847b..34501716 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java +++ b/src/de/dhbwstuttgart/typeinference/unify/model/TypeParams.java @@ -98,12 +98,12 @@ public final class TypeParams implements Iterable{ */ public boolean occurs(PlaceholderType t) { for(UnifyType p : typeParams) - if(p instanceof PlaceholderType) + if(p instanceof PlaceholderType) { if(p.equals(t)) - return true; - else + return true; } + else { if(p.getTypeParams().occurs(t)) - return true; + return true; } return false; } diff --git a/src/de/dhbwstuttgart/typeinference/unify/model/Unifier.java b/src/de/dhbwstuttgart/typeinference/unify/model/Unifier.java index 2dd7c83f..061ba588 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/model/Unifier.java +++ b/src/de/dhbwstuttgart/typeinference/unify/model/Unifier.java @@ -66,6 +66,14 @@ public class Unifier implements Function, Iterable> { mul(m) { var ret = new Matrix(); var i = 0; - while(i < size()) { + //while(i < size()) { var v1 = this.elementAt(i); - var v2 = new Vector(); - var j = 0; - while(j < v1.size()) { - var erg = 0; - var k = 0; - while(k < v1.size()) { - erg = erg + v1.elementAt(k) - * m.elementAt(k).elementAt(j); - k++; } - v2.addElement(new Integer(erg)); - j++; } - ret.addElement(v2); - i++; } + //var v2 = new Vector(); + //var j = 0; + //while(j < v1.size()) { + //var erg = 0; + //var k = 0; + //while(k < v1.size()) { + //erg = erg + v1.elementAt(k) + // * m.elementAt(k).elementAt(j); + //k++; } + //v2.addElement(new Integer(erg)); + //j++; } + //ret.addElement(v2); + //i++; } return ret; } } From 6e770b5ec5dc5cd4b601545e6367ba931654b508 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Mon, 12 Feb 2018 22:32:03 +0100 Subject: [PATCH 13/65] =?UTF-8?q?Java=209:=20Classloader=20=C3=A4ndern=20*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +++++++ .../environment/CompilationEnvironment.java | 21 +++++++++++-------- src/de/dhbwstuttgart/parser/JavaTXParser.java | 2 +- .../dhbwstuttgart/sat/asp/model/ASPRule.java | 3 ++- .../sat/asp/writer/ASPGenerator.java | 6 +++--- .../sat/asp/writer/model/ASPFCType.java | 17 +++++++++++++++ .../sat/asp/writer/model/ASPPairSmaller.java | 2 +- .../sat/asp/writer/model/ASPRefType.java | 4 ++-- .../typeinference/assumptions/FunNClass.java | 1 - 9 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java diff --git a/pom.xml b/pom.xml index 9cce2d99..ea7be6b3 100644 --- a/pom.xml +++ b/pom.xml @@ -73,6 +73,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + diff --git a/src/de/dhbwstuttgart/environment/CompilationEnvironment.java b/src/de/dhbwstuttgart/environment/CompilationEnvironment.java index 7044da6b..5f294130 100644 --- a/src/de/dhbwstuttgart/environment/CompilationEnvironment.java +++ b/src/de/dhbwstuttgart/environment/CompilationEnvironment.java @@ -40,15 +40,18 @@ public class CompilationEnvironment { * @param sourceFiles die zu kompilierenden Dateien */ public CompilationEnvironment(List sourceFiles) { - String bootClassPath = System.getProperty("sun.boot.class.path"); - librarys = new ArrayList<>(); - for(String path : bootClassPath.split(File.pathSeparator)) { - try { - librarys.add(new URL("file:"+path)); - } catch (MalformedURLException e) { - new DebugException("Fehler im Classpath auf diesem System"); - } - } + /** + * Java 9 bringt einige Änderungen am Classloader + * So funktioniert der BootClassLoader nicht mehr. + * hier gibts ein paar Quellen zum nachlesen: + * http://java9.wtf/class-loading/ + * https://stackoverflow.com/questions/46494112/classloaders-hierarchy-in-java-9 + * + */ + //String bootClassPath = System.getProperty("sun.boot.class.path"); + ClassLoader cl = ClassLoader.getPlatformClassLoader(); + URLClassLoader loader = new URLClassLoader(new URL[0], cl); + librarys = Arrays.asList(loader.getURLs()); this.sourceFiles = sourceFiles; this.packageCrawler = new PackageCrawler(librarys); } diff --git a/src/de/dhbwstuttgart/parser/JavaTXParser.java b/src/de/dhbwstuttgart/parser/JavaTXParser.java index c860a6a7..aad0a575 100644 --- a/src/de/dhbwstuttgart/parser/JavaTXParser.java +++ b/src/de/dhbwstuttgart/parser/JavaTXParser.java @@ -29,7 +29,7 @@ public class JavaTXParser { */ } - /* Für das Typsystem ist es notwendig, dass sich der Source in einer Datei befindet: + /* Für das Typsystem ist es notwendig, dass sich der Source in einer Datei befindet: public SourceFile parse(String fileContent) throws IOException, java.lang.ClassNotFoundException { return this.parse(new ByteArrayInputStream(fileContent.getBytes(StandardCharsets.UTF_8))); } diff --git a/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java b/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java index 41237547..8d4d73f9 100644 --- a/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java +++ b/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java @@ -8,7 +8,8 @@ public enum ASPRule { ASP_PARAMLIST_NAME("param"), ASP_PARAMLISTNUMERATION_NAME("paramNum"), ASP_PARAMLIST_END_POINTER("null"), - ASP_TYPE("type") + ASP_TYPE("type"), + ASP_FCTYPE("type") ; private final String text; diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java index 002e3c7f..66c206e1 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java @@ -36,8 +36,8 @@ public class ASPGenerator { private String toASP(List constraintSet, Collection fcClasses){ TypeConverter converter = new TypeConverter(); for(ClassOrInterface cl : fcClasses){ - ASPType superClass = cl.getSuperClass().acceptTV(converter); - ASPPairSmaller fcEntry = new ASPPairSmaller(convert(cl), superClass); + ASPRefType superClass = (ASPRefType) cl.getSuperClass().acceptTV(converter); + ASPPairSmaller fcEntry = new ASPPairSmaller(new ASPFCType(convert(cl)), new ASPFCType(superClass)); writer.add(new ASPStatement(fcEntry.toASP())); } for(Pair cons : constraintSet){ @@ -58,7 +58,7 @@ public class ASPGenerator { }else throw new NotImplementedException(); } - private ASPType convert(ClassOrInterface cl){ + private ASPRefType convert(ClassOrInterface cl){ List paramList = new ArrayList<>(); for(GenericTypeVar gtv : cl.getGenerics()){ paramList.add(new ASPGenericType(toConstant(gtv.getName()))); diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java new file mode 100644 index 00000000..777a34a7 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java @@ -0,0 +1,17 @@ +package de.dhbwstuttgart.sat.asp.writer.model; + +import de.dhbwstuttgart.sat.asp.model.ASPRule; + +public class ASPFCType extends ASPRefType { + public ASPFCType(String name, ASPParameterList params){ + super(name, params); + } + + public ASPFCType(ASPRefType refType){ + super(refType.name, refType.params); + } + + public String toString(){ + return ASPRule.ASP_FCTYPE + "(" + name +"," + params.name + ")"; + } +} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java index f57170f6..928acb49 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java @@ -5,7 +5,7 @@ import de.dhbwstuttgart.sat.asp.model.ASPRule; import java.util.Map; public class ASPPairSmaller extends ASPPair{ - public ASPPairSmaller(ASPType ls, ASPType rs){ + public ASPPairSmaller(ASPFCType ls, ASPFCType rs){ super(ls, rs); } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java index 6491ff33..bfbf27a0 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java @@ -3,8 +3,8 @@ package de.dhbwstuttgart.sat.asp.writer.model; import de.dhbwstuttgart.sat.asp.model.ASPRule; public class ASPRefType implements ASPType { - private final ASPParameterList params; - private final String name; + protected final ASPParameterList params; + protected final String name; public ASPRefType(String name, ASPParameterList params){ this.name = name; diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java b/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java index 0eba225d..a04ce9bb 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java @@ -1,6 +1,5 @@ package de.dhbwstuttgart.typeinference.assumptions; -import com.sun.org.apache.regexp.internal.RE; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.GenericContext; import de.dhbwstuttgart.parser.scope.GenericTypeName; From 191a1166b9282eeadeaace5f3def6c16e5782432 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 13 Feb 2018 05:25:18 +0100 Subject: [PATCH 14/65] ASP Generator auf neues Format anpassen --- src/de/dhbwstuttgart/core/JavaTXCompiler.java | 2 +- .../environment/CompilationEnvironment.java | 16 +++++++++++++--- .../sat/asp/writer/ASPGenerator.java | 6 +++--- .../sat/asp/writer/model/ASPFCType.java | 5 +---- .../sat/asp/writer/model/ASPGenericType.java | 10 ++++++++++ .../sat/asp/writer/model/ASPPair.java | 8 ++++++-- .../sat/asp/writer/model/ASPPairEquals.java | 5 +++-- .../sat/asp/writer/model/ASPPairSmaller.java | 5 +++-- .../sat/asp/writer/model/ASPPairSmallerDot.java | 5 +++-- .../sat/asp/writer/model/ASPRefType.java | 10 ++++++++++ .../sat/asp/writer/model/ASPType.java | 3 +++ .../sat/asp/writer/model/ASPTypeVar.java | 10 ++++++++++ test/javFiles/Vector.jav | 1 + 13 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/de/dhbwstuttgart/core/JavaTXCompiler.java index 86666a49..e8d74cb6 100644 --- a/src/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -82,7 +82,7 @@ public class JavaTXCompiler { List allClasses = new ArrayList<>();//environment.getAllAvailableClasses(); //Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC for(SourceFile sf : this.sourceFiles.values()) { - //allClasses.addAll(getAvailableClasses(sf)); + allClasses.addAll(getAvailableClasses(sf)); allClasses.addAll(sf.getClasses()); } diff --git a/src/de/dhbwstuttgart/environment/CompilationEnvironment.java b/src/de/dhbwstuttgart/environment/CompilationEnvironment.java index 5f294130..8a6976d6 100644 --- a/src/de/dhbwstuttgart/environment/CompilationEnvironment.java +++ b/src/de/dhbwstuttgart/environment/CompilationEnvironment.java @@ -49,9 +49,19 @@ public class CompilationEnvironment { * */ //String bootClassPath = System.getProperty("sun.boot.class.path"); - ClassLoader cl = ClassLoader.getPlatformClassLoader(); - URLClassLoader loader = new URLClassLoader(new URL[0], cl); - librarys = Arrays.asList(loader.getURLs()); + // ClassLoader cl = ClassLoader.getPlatformClassLoader(); + ClassLoader cl = ClassLoader.getSystemClassLoader(); + String bootClassPath = System.getProperty("java.class.path"); + librarys = new ArrayList<>(); + for(String path : bootClassPath.split(File.pathSeparator)) { + try { + librarys.add(new URL("file:"+path)); + } catch (MalformedURLException e) { + new DebugException("Fehler im Classpath auf diesem System"); + } + } + //URLClassLoader loader = new URLClassLoader(new URL[0], cl); + //librarys = Arrays.asList(loader.getURLs()); this.sourceFiles = sourceFiles; this.packageCrawler = new PackageCrawler(librarys); } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java index 66c206e1..ea162c11 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java @@ -37,7 +37,7 @@ public class ASPGenerator { TypeConverter converter = new TypeConverter(); for(ClassOrInterface cl : fcClasses){ ASPRefType superClass = (ASPRefType) cl.getSuperClass().acceptTV(converter); - ASPPairSmaller fcEntry = new ASPPairSmaller(new ASPFCType(convert(cl)), new ASPFCType(superClass)); + ASPPairSmaller fcEntry = new ASPPairSmaller(new ASPFCType(convert(cl)), new ASPFCType(superClass), writer); writer.add(new ASPStatement(fcEntry.toASP())); } for(Pair cons : constraintSet){ @@ -52,9 +52,9 @@ public class ASPGenerator { ASPType ls = pair.TA1.acceptTV(converter); ASPType rs = pair.TA2.acceptTV(converter); if(pair.OperatorEqual()){ - return new ASPPairEquals(ls, rs); + return new ASPPairEquals(ls, rs,writer); }else if(pair.OperatorSmallerDot()){ - return new ASPPairSmallerDot(ls, rs); + return new ASPPairSmallerDot(ls, rs, writer); }else throw new NotImplementedException(); } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java index 777a34a7..790fd5af 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java @@ -1,12 +1,9 @@ package de.dhbwstuttgart.sat.asp.writer.model; import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.writer.ASPWriter; public class ASPFCType extends ASPRefType { - public ASPFCType(String name, ASPParameterList params){ - super(name, params); - } - public ASPFCType(ASPRefType refType){ super(refType.name, refType.params); } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java index 57619edf..8e732d64 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java @@ -12,4 +12,14 @@ public class ASPGenericType implements ASPType{ public String toString(){ return ASPRule.ASP_GENERIC_TYPE_NAME + "(" + name + ")"; } + + @Override + public String toASP() { + return toString(); + } + + @Override + public String getPointer() { + return name; + } } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java index 662f995c..19730639 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java @@ -1,16 +1,20 @@ package de.dhbwstuttgart.sat.asp.writer.model; +import de.dhbwstuttgart.sat.asp.writer.ASPWriter; + public abstract class ASPPair { public final ASPType leftSide; public final ASPType rightSide; - public ASPPair(ASPType ls, ASPType rs){ + public ASPPair(ASPType ls, ASPType rs, ASPWriter writer){ this.leftSide = ls; this.rightSide = rs; + writer.add(new ASPStatement(ls.toASP())); + writer.add(new ASPStatement(rs.toASP())); } public String toASP(){ - return this.getRuleName() + "(" + leftSide + ","+ rightSide + ")"; + return this.getRuleName() + "(" + leftSide.getPointer() + ","+ rightSide.getPointer() + ")"; } public String toString(){ diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java index 8806f2ce..bf6e2485 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java @@ -1,10 +1,11 @@ package de.dhbwstuttgart.sat.asp.writer.model; import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.writer.ASPWriter; public class ASPPairEquals extends ASPPair{ - public ASPPairEquals(ASPType ls, ASPType rs){ - super(ls, rs); + public ASPPairEquals(ASPType ls, ASPType rs, ASPWriter writer){ + super(ls, rs, writer); } @Override diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java index 928acb49..610e5c56 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java @@ -1,12 +1,13 @@ package de.dhbwstuttgart.sat.asp.writer.model; import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.writer.ASPWriter; import java.util.Map; public class ASPPairSmaller extends ASPPair{ - public ASPPairSmaller(ASPFCType ls, ASPFCType rs){ - super(ls, rs); + public ASPPairSmaller(ASPFCType ls, ASPFCType rs, ASPWriter writer){ + super(ls, rs, writer); } @Override diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java index e8482bfc..b572ed99 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java @@ -1,10 +1,11 @@ package de.dhbwstuttgart.sat.asp.writer.model; import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.writer.ASPWriter; public class ASPPairSmallerDot extends ASPPair{ - public ASPPairSmallerDot(ASPType ls, ASPType rs){ - super(ls, rs); + public ASPPairSmallerDot(ASPType ls, ASPType rs, ASPWriter writer){ + super(ls, rs, writer); } @Override diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java index bfbf27a0..5eab65be 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java @@ -18,4 +18,14 @@ public class ASPRefType implements ASPType { public String toString(){ return ASPRule.ASP_TYPE + "(" + name +"," + params.name + ")"; } + + @Override + public String toASP() { + return toString(); + } + + @Override + public String getPointer() { + return name; + } } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java index da694218..6e715dba 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java @@ -1,4 +1,7 @@ package de.dhbwstuttgart.sat.asp.writer.model; public interface ASPType { + String toASP(); + + String getPointer(); } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java index 4b07d30b..8b3c1af6 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java @@ -11,4 +11,14 @@ public class ASPTypeVar implements ASPType{ public String toString() { return "typeVar("+ name +")"; } + + @Override + public String toASP() { + return toString(); + } + + @Override + public String getPointer() { + return name; + } } diff --git a/test/javFiles/Vector.jav b/test/javFiles/Vector.jav index f2a9cdae..1ea1ac41 100644 --- a/test/javFiles/Vector.jav +++ b/test/javFiles/Vector.jav @@ -1,3 +1,4 @@ +import java.util.Vector; class Vector{ From a45aa5057452d8e888dbeb0adaa692a694084741 Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 14 Feb 2018 14:37:36 +0100 Subject: [PATCH 15/65] =?UTF-8?q?erzeugt=20bytecode=20f=C3=BCr=20Zuweisung?= =?UTF-8?q?=20von=20Literale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dhbwstuttgart/bytecode/BytecodeGen.java | 4 +- .../bytecode/BytecodeGenMethod.java | 123 +++++++++++++++++- .../bytecode/signature/Signature.java | 2 +- test/bytecode/AssignToLit.jav | 30 +++++ test/bytecode/AssignToLitTest.java | 7 + test/bytecode/Example.jav | 6 +- test/bytecode/For.jav | 3 + test/bytecode/ForTest.java | 2 + test/bytecode/JavaTXCompilerTest.java | 2 +- test/bytecode/LamAssign.jav | 4 + 10 files changed, 176 insertions(+), 7 deletions(-) create mode 100644 test/bytecode/AssignToLit.jav create mode 100644 test/bytecode/AssignToLitTest.java diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index 57aeecc3..f24bb3fd 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -55,6 +55,7 @@ public class BytecodeGen implements ASTVisitor { @Override public void visit(SourceFile sourceFile) { for(ClassOrInterface cl : sourceFile.getClasses()) { + System.out.println("in Class: " + cl.getClassName().toString()); BytecodeGen classGen = new BytecodeGen(classFiles, resultSet); cl.accept(classGen); classGen.writeClass(cl.getClassName().toString()); @@ -183,7 +184,8 @@ public class BytecodeGen implements ASTVisitor { System.out.println(sig); NormalMethod meth = new NormalMethod(method,genericsAndBounds,genericsAndBoundsMethod,hasGen); methDesc = meth.accept(new DescriptorToString(resultSet)); - MethodVisitor mv = cw.visitMethod(acc, method.getName(), methDesc, sig, null); + System.out.println(methDesc); + MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC+acc, method.getName(), methDesc, sig, null); mv.visitCode(); diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index c5480ac0..f04711e8 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -236,7 +236,7 @@ public class BytecodeGenMethod implements StatementVisitor{ cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL); - generateBCForFunN(lambdaExpression,typeErasure); +// generateBCForFunN(lambdaExpression,typeErasure); } private void generateBCForFunN(LambdaExpression lambdaExpression, String methDesc) { @@ -435,7 +435,126 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(Literal literal) { - mv.visitLdcInsn(getResolvedType(literal.getType())); + System.out.println(resultSet.resolveType(literal.getType()).resolvedType.acceptTV(new TypeToDescriptor())); + Object value = literal.value; + switch (resultSet.resolveType(literal.getType()).resolvedType.acceptTV(new TypeToDescriptor())) { + case "java/lang/String": + mv.visitLdcInsn((String) value); + break; + case "java/lang/Boolean": + visitBooleanLiteral((Boolean) value); + break; + case "java/lang/Byte": + visitByteLiteral(((Double) value).byteValue(),false); + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Byte", "valueOf", + "(B)Ljava/lang/Byte;", false); + break; + case "java/lang/Short": + visitShortLiteral(((Double) value).shortValue(),false); + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Short", "valueOf", + "(S)Ljava/lang/Short;", false); + break; + case "java/lang/Integer": + //zweite Argument isLong + visitIntegerLiteral(((Double) value).intValue(), false); + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", + "(I)Ljava/lang/Integer;", false); + break; + case "java/lang/Long": + visitLongLiteral(((Double) value).longValue(), true); + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", + "(J)Ljava/lang/Long;", false); + break; + case "java/lang/Float": + visitFloatLiteral(((Double) value).floatValue()); + break; + case "java/lang/Double": + visitDoubleLiteral((Double) value); + break; + case "java/lang/Character": + visitCharLiteral((Character) value); + break; + default: + break; + } + } + + private void visitCharLiteral(Character value) { + mv.visitIntInsn(Opcodes.BIPUSH, Character.getNumericValue(value.charValue())); + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Character", "valueOf", + "(C)Ljava/lang/Character;", false); + } + + private void visitDoubleLiteral(Double value) { + if(value == 0) { + mv.visitInsn(Opcodes.DCONST_0); + }else if(value == 1) { + mv.visitInsn(Opcodes.DCONST_1); + }else { + mv.visitLdcInsn(value); + } + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Double", "valueOf", + "(D)Ljava/lang/Double;", false); + } + + private void visitFloatLiteral(Float value) { + if(value.intValue()>-1 && value.intValue() < 3) { + //Opcodes.FCONST_0 = 11, Opcodes.FCONST_1 = 12, usw + mv.visitInsn(value.intValue()+11); + }else { + mv.visitLdcInsn(value); + } + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Float", "valueOf", + "(F)Ljava/lang/Float;", false); + } + + private void visitLongLiteral(Long value, boolean isLong) { + if(value=-Math.pow(2, 15))&&value<-128) { + visitShortLiteral(value.shortValue(),isLong); + }else { + mv.visitLdcInsn(value); + } + } + + private void visitShortLiteral(Short value,boolean isLong) { + if(value< 128 || (value>-129 && value<-1)) { + visitByteLiteral(value.byteValue(), isLong); + }else if(value=-Math.pow(2, 15))&&value<-128) { + mv.visitIntInsn(Opcodes.SIPUSH, value); + } + } + + private void visitByteLiteral(Byte value, boolean isLong) { + + if(!isLong && value<6 && value>-1) { + //Opcodes.ICONST_0 = 3, Opcodes.ICONST_1 = 4, usw + mv.visitInsn(value+3); + }else if(isLong && value>-1 && value<2){ + //Opcodes.LCONST_0 = 9, Opcodes.LCONST_1 = 10 + mv.visitInsn(value+9); + }else { + mv.visitIntInsn(Opcodes.BIPUSH, value); + } + + } + + private void visitIntegerLiteral(Integer value, boolean isLong) { + + if(value=-Math.pow(2, 15))&&value<-128) { + visitShortLiteral(value.shortValue(),isLong); + }else { + mv.visitLdcInsn(value); + } + } + + private void visitBooleanLiteral(Boolean b) { + if(b) { + mv.visitInsn(Opcodes.ICONST_1); + }else { + mv.visitInsn(Opcodes.ICONST_0); + } + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Boolean", "valueOf", + "(Z)Ljava/lang/Boolean;", false); } @Override diff --git a/src/de/dhbwstuttgart/bytecode/signature/Signature.java b/src/de/dhbwstuttgart/bytecode/signature/Signature.java index fc9e2191..cc4a6a13 100644 --- a/src/de/dhbwstuttgart/bytecode/signature/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -134,7 +134,7 @@ public class Signature { RefTypeOrTPHOrWildcardOrGeneric r = resultSet.resolveType(t).resolvedType; sv.visitInterface().visitClassType(r.acceptTV(new TypeToSignature())); // sv.visitClassType(r.acceptTV(new TypeToSignature())); -// System.out.println(r.getClass()+" Signature TPH: "+r.acceptTV(new TypeToSignature())); + System.out.println(r.getClass()+" Signature TPH: "+r.acceptTV(new TypeToSignature())); break; default: if(!isParameterType) diff --git a/test/bytecode/AssignToLit.jav b/test/bytecode/AssignToLit.jav new file mode 100644 index 00000000..4691a5da --- /dev/null +++ b/test/bytecode/AssignToLit.jav @@ -0,0 +1,30 @@ +import java.lang.Integer; +import java.lang.Boolean; +import java.lang.String; +import java.lang.Byte; +import java.lang.Short; +import java.lang.Long; +import java.lang.Float; +import java.lang.Double; +import java.lang.Character; + +class AssignToLit { + void m(){ + String s = "String"; + Boolean b = false; + Byte byte1 = 5; + Byte byte2 = 55; + Short short1 = 5; + Short short2 = 55; + Integer int1 = 5; + Integer int2 = 8888888; + Long long1 = 1; + Long long2 = 5; + Long long3 = 89989898; + Float float1 = 1; + Float float2 = 55; + Double d1 = 1; + Double d2 = 55; + Character c = 'A'; + } +} \ No newline at end of file diff --git a/test/bytecode/AssignToLitTest.java b/test/bytecode/AssignToLitTest.java new file mode 100644 index 00000000..dc5d397b --- /dev/null +++ b/test/bytecode/AssignToLitTest.java @@ -0,0 +1,7 @@ +package bytecode; + +public class AssignToLitTest extends JavaTXCompilerTest { + public AssignToLitTest() { + this.fileName = "AssignToLit"; + } +} diff --git a/test/bytecode/Example.jav b/test/bytecode/Example.jav index 8fc7a0a7..b7455a3f 100644 --- a/test/bytecode/Example.jav +++ b/test/bytecode/Example.jav @@ -1,7 +1,9 @@ +import java.lang.String; + public class Example { - public m(Integer x) { -// String x = "X"; + public m() { + String x = "X"; return x; } } \ No newline at end of file diff --git a/test/bytecode/For.jav b/test/bytecode/For.jav index c93b34c4..e14c62f8 100644 --- a/test/bytecode/For.jav +++ b/test/bytecode/For.jav @@ -1,3 +1,6 @@ +import java.lang.Integer; +import java.lang.Boolean; + class For{ m(Integer x){ Boolean b = true; diff --git a/test/bytecode/ForTest.java b/test/bytecode/ForTest.java index 7df68665..c95138d3 100644 --- a/test/bytecode/ForTest.java +++ b/test/bytecode/ForTest.java @@ -1,5 +1,7 @@ package bytecode; +import org.objectweb.asm.Opcodes; + public class ForTest extends JavaTXCompilerTest { public ForTest() { diff --git a/test/bytecode/JavaTXCompilerTest.java b/test/bytecode/JavaTXCompilerTest.java index 2f832962..623fc96e 100644 --- a/test/bytecode/JavaTXCompilerTest.java +++ b/test/bytecode/JavaTXCompilerTest.java @@ -67,7 +67,7 @@ public class JavaTXCompilerTest { byte[] bytecode = classFiles.get(name); try { System.out.println("generating "+name+ ".class file ..."); - output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/examples/" +name+".class")); + output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/" +name+".class")); output.write(bytecode); output.close(); System.out.println(name+".class file generated"); diff --git a/test/bytecode/LamAssign.jav b/test/bytecode/LamAssign.jav index 4a4f4f73..82bb31b1 100644 --- a/test/bytecode/LamAssign.jav +++ b/test/bytecode/LamAssign.jav @@ -9,3 +9,7 @@ class LamAssign { return lam1; } } + +interface Fun1{ + public A apply(B b); +} \ No newline at end of file From b7bb0fa1c454858b34e786b1651764a11b9177c2 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Mon, 19 Feb 2018 04:47:10 +0100 Subject: [PATCH 16/65] Vector Test Fehler beheben --- .../dhbwstuttgart/environment/CompilationEnvironment.java | 2 +- .../parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java | 7 ++++++- test/javFiles/Vector.jav | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/de/dhbwstuttgart/environment/CompilationEnvironment.java b/src/de/dhbwstuttgart/environment/CompilationEnvironment.java index 44754e7c..3d450183 100644 --- a/src/de/dhbwstuttgart/environment/CompilationEnvironment.java +++ b/src/de/dhbwstuttgart/environment/CompilationEnvironment.java @@ -62,7 +62,7 @@ public class CompilationEnvironment { } //URLClassLoader loader = new URLClassLoader(new URL[0], cl); //librarys = Arrays.asList(loader.getURLs()); - + this.sourceFiles = sourceFiles; this.packageCrawler = new PackageCrawler(librarys); } diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java index b681d9c3..ed96d2e6 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java @@ -164,7 +164,12 @@ public class SyntaxTreeGenerator{ modifiers += newModifier; } } - JavaClassName name = reg.getName(ctx.Identifier().getText()); + String className = this.pkgName + (this.pkgName.length()>0?".":"") + ctx.Identifier().getText(); + JavaClassName name = reg.getName(className); + if(! name.toString().equals(className)){ + throw new TypeinferenceException("Name " + className + " bereits vorhanden in " + reg.getName(className).toString() + ,ctx.getStart()); + } GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "", reg, new GenericsRegistry(globalGenerics)); Token offset = ctx.getStart(); GenericDeclarationList genericClassParameters; diff --git a/test/javFiles/Vector.jav b/test/javFiles/Vector.jav index 1ea1ac41..ef3533a6 100644 --- a/test/javFiles/Vector.jav +++ b/test/javFiles/Vector.jav @@ -1,6 +1,6 @@ import java.util.Vector; -class Vector{ +class MyVector{ id(x){ return id2(x); From d53faa0c86f393edcc9f47200866ab844ccecefe Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Mon, 19 Feb 2018 11:33:08 +0100 Subject: [PATCH 17/65] FiniteClosure korrekt generieren --- .../SyntaxTreeGenerator/FCGenerator.java | 61 ++++++++++--------- .../sat/asp/writer/ASPGenerator.java | 16 +++-- .../syntaxtree/factory/UnifyTypeFactory.java | 4 +- test/asp/ClingoTest.java | 2 +- test/asp/typeinference/ASPTest.java | 6 +- 5 files changed, 48 insertions(+), 41 deletions(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 7863c8ed..ea2b17a6 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -2,6 +2,7 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator; import de.dhbwstuttgart.exceptions.DebugException; import de.dhbwstuttgart.exceptions.NotImplementedException; +import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; @@ -11,6 +12,7 @@ import de.dhbwstuttgart.typeinference.constraints.Pair; import de.dhbwstuttgart.typeinference.unify.model.*; import java.util.*; +import java.util.stream.Collectors; public class FCGenerator { /** @@ -19,12 +21,15 @@ public class FCGenerator { * * @param availableClasses - Alle geparsten Klassen */ - public static Set toFC(Collection availableClasses) throws ClassNotFoundException { - HashSet pairs = new HashSet<>(); + public static Set toUnifyFC(Collection availableClasses) throws ClassNotFoundException { + return toFC(availableClasses).stream().map(t -> UnifyTypeFactory.convert(t)).collect(Collectors.toSet()); + } + + public static Set toFC(Collection availableClasses) throws ClassNotFoundException { + HashSet pairs = new HashSet<>(); for(ClassOrInterface cly : availableClasses){ pairs.addAll(getSuperTypes(cly, availableClasses)); } - System.out.println(pairs); return pairs; } @@ -35,20 +40,20 @@ public class FCGenerator { * @param forType * @return */ - private static List getSuperTypes(ClassOrInterface forType, Collection availableClasses) throws ClassNotFoundException { + private static List getSuperTypes(ClassOrInterface forType, Collection availableClasses) throws ClassNotFoundException { return getSuperTypes(forType, availableClasses, new HashMap<>()); } //TODO: implements Interface auch als superklassen beachten - private static List getSuperTypes(ClassOrInterface forType, Collection availableClasses, HashMap gtvs) throws ClassNotFoundException { - List params = new ArrayList<>(); + private static List getSuperTypes(ClassOrInterface forType, Collection availableClasses, HashMap gtvs) throws ClassNotFoundException { + List params = new ArrayList<>(); //Die GTVs, die in forType hinzukommen: - HashMap newGTVs = new HashMap<>(); + HashMap newGTVs = new HashMap<>(); //Generics mit gleichem Namen müssen den selben TPH bekommen for(GenericTypeVar gtv : forType.getGenerics()){ if(!gtvs.containsKey(gtv.getParsedName())){ - gtvs.put(gtv.getParsedName(), PlaceholderType.freshPlaceholder()); - newGTVs.put(gtv.getParsedName(), PlaceholderType.freshPlaceholder()); + gtvs.put(gtv.getParsedName(), TypePlaceholder.fresh(new NullToken())); + newGTVs.put(gtv.getParsedName(), TypePlaceholder.fresh(new NullToken())); } params.add(gtvs.get(gtv.getParsedName())); } @@ -73,27 +78,26 @@ public class FCGenerator { while(itGenParams.hasNext()){ RefTypeOrTPHOrWildcardOrGeneric setType = itSetParams.next(); //In diesem Typ die GTVs durch TPHs und Einsetzungen austauschen: - UnifyType setSetType = setType.acceptTV(new TypeExchanger(gtvs)); + RefTypeOrTPHOrWildcardOrGeneric setSetType = setType.acceptTV(new TypeExchanger(gtvs)); newGTVs.put(itGenParams.next().getParsedName(), setSetType); } - UnifyType superType = forType.getSuperClass().acceptTV(new TypeExchanger(newGTVs)); + RefTypeOrTPHOrWildcardOrGeneric superType = forType.getSuperClass().acceptTV(new TypeExchanger(newGTVs)); - TypeParams paramList = new TypeParams(params); - UnifyType t1 = new ReferenceType(forType.getClassName().toString(), paramList); - UnifyType t2 = superType; + RefTypeOrTPHOrWildcardOrGeneric t1 = new RefType(forType.getClassName(), params, new NullToken()); + RefTypeOrTPHOrWildcardOrGeneric t2 = superType; - UnifyPair ret = UnifyTypeFactory.generateSmallerPair(t1, t2); + Pair ret = new Pair(t1, t2, PairOperator.SMALLER); - List superTypes; + List superTypes; //Rekursiver Aufruf. Abbruchbedingung ist Object als Superklasse: if(superClass.getClassName().equals(ASTFactory.createObjectClass().getClassName())){ - superTypes = Arrays.asList(UnifyTypeFactory.generateSmallerPair(UnifyTypeFactory.convert(ASTFactory.createObjectType()), UnifyTypeFactory.convert(ASTFactory.createObjectType()))); + superTypes = Arrays.asList(new Pair(ASTFactory.createObjectType(), ASTFactory.createObjectType(), PairOperator.SMALLER)); }else{ superTypes = getSuperTypes(superClass, availableClasses, newGTVs); } - List retList = new ArrayList<>(); + List retList = new ArrayList<>(); retList.add(ret); retList.addAll(superTypes); @@ -103,42 +107,41 @@ public class FCGenerator { /** * Tauscht die GTVs in einem Typ gegen die entsprechenden Typen in der übergebenen Map aus. */ - private static class TypeExchanger implements TypeVisitor{ + private static class TypeExchanger implements TypeVisitor{ - private final HashMap gtvs; + private final HashMap gtvs; - TypeExchanger(HashMap gtvs){ + TypeExchanger(HashMap gtvs){ this.gtvs = gtvs; } @Override - public UnifyType visit(RefType refType) { - List params = new ArrayList<>(); + public RefTypeOrTPHOrWildcardOrGeneric visit(RefType refType) { + List params = new ArrayList<>(); for(RefTypeOrTPHOrWildcardOrGeneric param : refType.getParaList()){ params.add(param.acceptTV(this)); } - TypeParams paramList = new TypeParams(params); - UnifyType ret = new ReferenceType(refType.getName().toString(), paramList); + RefTypeOrTPHOrWildcardOrGeneric ret = new RefType(refType.getName(), params, new NullToken()); return ret; } @Override - public UnifyType visit(SuperWildcardType superWildcardType) { + public RefTypeOrTPHOrWildcardOrGeneric visit(SuperWildcardType superWildcardType) { throw new DebugException("Dieser Fall darf nicht auftreten"); } @Override - public UnifyType visit(TypePlaceholder typePlaceholder) { + public RefTypeOrTPHOrWildcardOrGeneric visit(TypePlaceholder typePlaceholder) { throw new DebugException("Dieser Fall darf nicht auftreten"); } @Override - public UnifyType visit(ExtendsWildcardType extendsWildcardType) { + public RefTypeOrTPHOrWildcardOrGeneric visit(ExtendsWildcardType extendsWildcardType) { throw new DebugException("Dieser Fall darf nicht auftreten"); } @Override - public UnifyType visit(GenericRefType genericRefType) { + public RefTypeOrTPHOrWildcardOrGeneric visit(GenericRefType genericRefType) { if(! gtvs.containsKey(genericRefType.getParsedName())) throw new DebugException("Dieser Fall darf nicht auftreten"); //TODO: Diesen Dirty-Hack beseitigen. Fehler tritt bei java.lang.invoke.LambdaFormEditor$Transform$Kind auf. diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java index ea162c11..38652b43 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java @@ -1,6 +1,7 @@ package de.dhbwstuttgart.sat.asp.writer; import de.dhbwstuttgart.exceptions.NotImplementedException; +import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.sat.asp.writer.model.*; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; @@ -19,25 +20,25 @@ public class ASPGenerator { ASPWriter writer = new ASPWriter(); private final String asp; - public ASPGenerator(ConstraintSet constraints, Collection fcClasses){ + public ASPGenerator(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException { List> constraints1 = constraints.cartesianProduct().iterator().next(); List constraintPairs = new ArrayList<>(); for(Constraint constraint : constraints1){ System.out.println(UnifyTypeFactory.convert(constraint)); constraintPairs.addAll(constraint); } - asp = toASP(constraintPairs, fcClasses); + asp = toASP(constraintPairs, FCGenerator.toFC(fcClasses)); } public String getASP(){ return asp; } - private String toASP(List constraintSet, Collection fcClasses){ + private String toASP(List constraintSet, Collection fc){ TypeConverter converter = new TypeConverter(); - for(ClassOrInterface cl : fcClasses){ - ASPRefType superClass = (ASPRefType) cl.getSuperClass().acceptTV(converter); - ASPPairSmaller fcEntry = new ASPPairSmaller(new ASPFCType(convert(cl)), new ASPFCType(superClass), writer); + for(Pair fcp : fc){ + //Wenn dieser Cast fehlschlägt stimmt etwas nicht. Alle Paare in der FC müssen smaller Operatoren haen + ASPPairSmaller fcEntry = (ASPPairSmaller) convert(fcp); writer.add(new ASPStatement(fcEntry.toASP())); } for(Pair cons : constraintSet){ @@ -55,6 +56,9 @@ public class ASPGenerator { return new ASPPairEquals(ls, rs,writer); }else if(pair.OperatorSmallerDot()){ return new ASPPairSmallerDot(ls, rs, writer); + }else if(pair.OperatorSmaller()){ + //Diese Cast müssen auch immer funktionieren, da in smaller Constraints nur RefTypes vorkommen + return new ASPPairSmaller(new ASPFCType((ASPRefType) ls), new ASPFCType((ASPRefType) rs), writer); }else throw new NotImplementedException(); } diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java index a962c2bc..4ecaa136 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java @@ -3,13 +3,11 @@ package de.dhbwstuttgart.syntaxtree.factory; import java.util.*; import java.util.stream.Collectors; -import de.dhbwstuttgart.exceptions.DebugException; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; -import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.syntaxtree.type.Void; import de.dhbwstuttgart.syntaxtree.type.WildcardType; @@ -35,7 +33,7 @@ public class UnifyTypeFactory { Generell dürfen sie immer die gleichen Namen haben. TODO: die transitive Hülle bilden */ - return new FiniteClosure(FCGenerator.toFC(fromClasses)); + return new FiniteClosure(FCGenerator.toUnifyFC(fromClasses)); } public static UnifyPair generateSmallerPair(UnifyType tl, UnifyType tr){ diff --git a/test/asp/ClingoTest.java b/test/asp/ClingoTest.java index dbfa70d8..83f3a26f 100644 --- a/test/asp/ClingoTest.java +++ b/test/asp/ClingoTest.java @@ -19,7 +19,7 @@ public class ClingoTest { public static final String tempDirectory = "/tmp/"; @Test - public void test() throws IOException, InterruptedException { + public void test() throws IOException, InterruptedException, ClassNotFoundException { String content = ""; content = new ASPGenerator(this.getPairs(), this.getFC()).getASP(); diff --git a/test/asp/typeinference/ASPTest.java b/test/asp/typeinference/ASPTest.java index b41d9405..cea141f9 100644 --- a/test/asp/typeinference/ASPTest.java +++ b/test/asp/typeinference/ASPTest.java @@ -14,7 +14,9 @@ import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class ASPTest { @@ -44,9 +46,9 @@ public class ASPTest { //filesToTest.add(new File(rootDirectory+"Matrix.jav")); //filesToTest.add(new File(rootDirectory+"Import.jav")); JavaTXCompiler compiler = new JavaTXCompiler(fileToTest); - List allClasses = new ArrayList<>(); + Set allClasses = new HashSet<>(); for(SourceFile sf : compiler.sourceFiles.values()) { - //allClasses.addAll(compiler.getAvailableClasses(sf)); + allClasses.addAll(compiler.getAvailableClasses(sf)); } for(SourceFile sf : compiler.sourceFiles.values()) { allClasses.addAll(sf.getClasses()); From c747ab08850989bc52048df8ea78a820be7dd92f Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Feb 2018 11:40:54 +0100 Subject: [PATCH 18/65] Additive Expression implementieren --- .../SyntaxTreeGenerator/StatementGenerator.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java index 1586ba3f..679b23df 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java @@ -599,8 +599,8 @@ public class StatementGenerator { } private BinaryExpr.Operator convertBinaryOperator(String operator) { - - return null; + //return BinaryExpr.Operator.ADD; + throw new NotImplementedException(); } private Expression convert(Java8Parser.ShiftExpressionContext expression) { @@ -612,12 +612,15 @@ public class StatementGenerator { } private Expression convert(Java8Parser.AdditiveExpressionContext expression) { - if(expression.additiveExpression() != null){ - return convert(expression.additiveExpression()); - }else if(expression.multiplicativeExpression() != null){ + + if(expression.additiveExpression() == null){ return convert(expression.multiplicativeExpression()); - }else{ - throw new NotImplementedException(); + }else { + Expression leftSide = convert(expression.additiveExpression()); + Expression rightSide = convert(expression.multiplicativeExpression()); + BinaryExpr.Operator op = convertBinaryOperator(expression.getChild(1).getText()); + Token offset = expression.getStart(); + return new BinaryExpr(op, TypePlaceholder.fresh(expression.getStart()), leftSide, rightSide, offset); } } From 7c2f7c54ddfaaf23c6895551a43aba99129df63c Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 21 Feb 2018 11:44:03 +0100 Subject: [PATCH 19/65] =?UTF-8?q?Kleine=20=C3=84nderung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dhbwstuttgart/bytecode/BytecodeGenMethod.java | 3 +-- .../bytecode/signature/Signature.java | 3 ++- test/bytecode/AssignToLit.jav | 2 +- test/bytecode/Methods.jav | 14 ++++++++++++++ test/bytecode/MethodsTest.java | 7 +++++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 test/bytecode/Methods.jav create mode 100644 test/bytecode/MethodsTest.java diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index f04711e8..402f578d 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -435,11 +435,10 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(Literal literal) { - System.out.println(resultSet.resolveType(literal.getType()).resolvedType.acceptTV(new TypeToDescriptor())); Object value = literal.value; switch (resultSet.resolveType(literal.getType()).resolvedType.acceptTV(new TypeToDescriptor())) { case "java/lang/String": - mv.visitLdcInsn((String) value); + mv.visitLdcInsn(value); break; case "java/lang/Boolean": visitBooleanLiteral((Boolean) value); diff --git a/src/de/dhbwstuttgart/bytecode/signature/Signature.java b/src/de/dhbwstuttgart/bytecode/signature/Signature.java index cc4a6a13..f9bcb369 100644 --- a/src/de/dhbwstuttgart/bytecode/signature/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -132,7 +132,8 @@ public class Signature { break; case "TPH": RefTypeOrTPHOrWildcardOrGeneric r = resultSet.resolveType(t).resolvedType; - sv.visitInterface().visitClassType(r.acceptTV(new TypeToSignature())); + if(!r.acceptTV(new TypeToSignature()).substring(0, 4).equals("TPH ")) + sv.visitInterface().visitClassType(r.acceptTV(new TypeToSignature())); // sv.visitClassType(r.acceptTV(new TypeToSignature())); System.out.println(r.getClass()+" Signature TPH: "+r.acceptTV(new TypeToSignature())); break; diff --git a/test/bytecode/AssignToLit.jav b/test/bytecode/AssignToLit.jav index 4691a5da..46ec2b91 100644 --- a/test/bytecode/AssignToLit.jav +++ b/test/bytecode/AssignToLit.jav @@ -10,7 +10,7 @@ import java.lang.Character; class AssignToLit { void m(){ - String s = "String"; + String s = "Test"; Boolean b = false; Byte byte1 = 5; Byte byte2 = 55; diff --git a/test/bytecode/Methods.jav b/test/bytecode/Methods.jav new file mode 100644 index 00000000..3c46739d --- /dev/null +++ b/test/bytecode/Methods.jav @@ -0,0 +1,14 @@ +import java.lang.Integer; + +class Methods { + + m(a,b){ + var c=a+b; + return c; + } + + method2(x){ + Integer i = this.m(x,2); + return i; + } +} \ No newline at end of file diff --git a/test/bytecode/MethodsTest.java b/test/bytecode/MethodsTest.java new file mode 100644 index 00000000..11195b71 --- /dev/null +++ b/test/bytecode/MethodsTest.java @@ -0,0 +1,7 @@ +package bytecode; + +public class MethodsTest extends JavaTXCompilerTest { + public MethodsTest() { + this.fileName = "Methods"; + } +} From ac4a79f0e76f22a73334538d3a328cd1767ee40e Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Wed, 21 Feb 2018 15:43:28 +0100 Subject: [PATCH 20/65] Additive/multiplicativeExpression und UnaryExpression implementiert --- .../bytecode/BytecodeGenMethod.java | 5 +- .../StatementGenerator.java | 47 +++++++++++++++---- test/bytecode/For.jav | 17 +++++++ test/parser/GeneralParserTest.java | 3 +- test/parser/OpratorTest.jav | 12 +++++ 5 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 test/parser/OpratorTest.jav diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index c5480ac0..b13a1fb6 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -167,6 +167,7 @@ public class BytecodeGenMethod implements StatementVisitor{ public void visit(BinaryExpr binary) { System.out.println("\t++ In Binary: "); + System.out.println(binary.operation.toString()); } @@ -318,7 +319,7 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(IfStmt ifStmt) { - + System.out.println("If"); } @Override @@ -389,7 +390,7 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(UnaryExpr unaryExpr) { - throw new NotImplementedException(); + System.out.println(unaryExpr.operation.toString()); } @Override diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java index 679b23df..2b0b1a4f 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java @@ -7,6 +7,7 @@ import de.dhbwstuttgart.parser.scope.GenericsRegistry; import de.dhbwstuttgart.parser.scope.JavaClassRegistry; import de.dhbwstuttgart.syntaxtree.*; import de.dhbwstuttgart.syntaxtree.statement.*; +import de.dhbwstuttgart.syntaxtree.statement.UnaryExpr.Operation; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; @@ -278,13 +279,14 @@ public class StatementGenerator { } private Statement convert(Java8Parser.PreIncrementExpressionContext stmt) { - //TODO - throw new NotImplementedException(); + Expression argument = convert(stmt.unaryExpression()); + Token offset = stmt.getStart(); + return new UnaryExpr(UnaryExpr.Operation.PREINCREMENT, argument, TypePlaceholder.fresh(offset), offset); } - private Statement convert(Java8Parser.PreDecrementExpressionContext stmt) { - //TODO - throw new NotImplementedException(); + private Statement convert(Java8Parser.PreDecrementExpressionContext stmt) { + return new UnaryExpr(UnaryExpr.Operation.PREDECREMENT, convert(stmt.unaryExpression()), + TypePlaceholder.fresh(stmt.getStart()), stmt.getStart()); } private Statement convert(Java8Parser.PostIncrementExpressionContext stmt) { @@ -293,8 +295,8 @@ public class StatementGenerator { } private Statement convert(Java8Parser.PostDecrementExpressionContext stmt) { - //TODO - throw new NotImplementedException(); + return new UnaryExpr(UnaryExpr.Operation.POSTDECREMENT, convert(stmt.postfixExpression()), + TypePlaceholder.fresh(stmt.getStart()), stmt.getStart()); } private Statement convert(Java8Parser.AssignmentContext stmt) { @@ -600,7 +602,30 @@ public class StatementGenerator { private BinaryExpr.Operator convertBinaryOperator(String operator) { //return BinaryExpr.Operator.ADD; - throw new NotImplementedException(); + if(operator.equals("+")) { + return BinaryExpr.Operator.ADD; + }else if(operator.equals("-")) { + return BinaryExpr.Operator.SUB; + }else if(operator.equals("*")) { + return BinaryExpr.Operator.MUL; + }else if(operator.equals("&")) { + return BinaryExpr.Operator.AND; + }else if(operator.equals("|")) { + return BinaryExpr.Operator.OR; + }else if(operator.equals("/")) { + return BinaryExpr.Operator.DIV; + }else if(operator.equals("<")) { + return BinaryExpr.Operator.LESSTHAN; + }else if(operator.equals(">")) { + return BinaryExpr.Operator.BIGGERTHAN; + }else if(operator.equals(">=")) { + return BinaryExpr.Operator.BIGGEREQUAL; + } else if(operator.equals("<=")) { + return BinaryExpr.Operator.LESSEQUAL; + } else { + throw new NotImplementedException(); + } +// throw new NotImplementedException(); } private Expression convert(Java8Parser.ShiftExpressionContext expression) { @@ -628,7 +653,11 @@ public class StatementGenerator { if(expression.multiplicativeExpression() == null){ return convert(expression.unaryExpression()); }else{ - throw new NotImplementedException(); + Expression leftSide = convert(expression.multiplicativeExpression()); + Expression rightSide = convert(expression.unaryExpression()); + BinaryExpr.Operator op = convertBinaryOperator(expression.getChild(1).getText()); + Token offset = expression.getStart(); + return new BinaryExpr(op, TypePlaceholder.fresh(offset), leftSide, rightSide, offset); } } diff --git a/test/bytecode/For.jav b/test/bytecode/For.jav index c93b34c4..04cb6a53 100644 --- a/test/bytecode/For.jav +++ b/test/bytecode/For.jav @@ -1,6 +1,15 @@ +import java.lang.Integer; +import java.lang.Boolean; + class For{ m(Integer x){ + Boolean b = true; + c = 5; + c++; + ++c; + c--; + --c; while(x<2){ x = x +1; b = false; @@ -10,4 +19,12 @@ class For{ // x = x + 5; // } } + +// m2(Integer x){ +// if(x<2) { +// return 1; +// }else { +// return 2; +// } +// } } \ No newline at end of file diff --git a/test/parser/GeneralParserTest.java b/test/parser/GeneralParserTest.java index c48e1320..b218347f 100644 --- a/test/parser/GeneralParserTest.java +++ b/test/parser/GeneralParserTest.java @@ -41,7 +41,8 @@ public class GeneralParserTest{ filenames.add("FieldVarTest.jav"); filenames.add("StructuralTypes.jav"); */ - filenames.add("ExtendsTest.jav"); +// filenames.add("ExtendsTest.jav"); + filenames.add("OpratorTest.jav"); try{ new JavaTXCompiler(filenames.stream().map(s -> new File(rootDirectory + s)).collect(Collectors.toList())); }catch(Exception exc){ diff --git a/test/parser/OpratorTest.jav b/test/parser/OpratorTest.jav new file mode 100644 index 00000000..f99734f6 --- /dev/null +++ b/test/parser/OpratorTest.jav @@ -0,0 +1,12 @@ +import java.lang.Integer; + +class OpratorTest { + m(Integer a, Integer b) { + c = a+b; + d = a-b; + e = a*b; + f = a/b; + + return c; + } +} \ No newline at end of file From 73c37027d9dd7390871fa032bf72de85a0c80a61 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Fri, 23 Feb 2018 09:16:12 +0100 Subject: [PATCH 21/65] Fehler in TypeStmt UnaryExpression beheben --- src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index a06062c0..3733b7dc 100644 --- a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -199,7 +199,7 @@ public class TYPEStmt implements StatementVisitor{ //@see: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.14.2 //Expression muss zu Numeric Convertierbar sein. also von Numeric erben RefType number = new RefType(ASTFactory.createClass(Number.class).getClassName(), unaryExpr.getOffset()); - constraintsSet.addUndConstraint(new Pair(unaryExpr.expr.getType(), number, PairOperator.EQUALSDOT)); + constraintsSet.addUndConstraint(new Pair(unaryExpr.expr.getType(), number, PairOperator.SMALLERDOT)); //The type of the postfix increment expression is the type of the variable constraintsSet.addUndConstraint(new Pair(unaryExpr.expr.getType(), unaryExpr.getType(), PairOperator.EQUALSDOT)); }else{ From 4fbcf87e0c23888c4e9ea9dd5a2701ac608d1241 Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Fri, 23 Feb 2018 20:10:11 +0100 Subject: [PATCH 22/65] =?UTF-8?q?Methoden=20visit(assign)/visit(literal)?= =?UTF-8?q?=20angepasst=20und=20generiert=20bytecode=20f=C3=BCr=20Binaryex?= =?UTF-8?q?pressions.=20noch=20nicht=20fertig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bytecode/BytecodeGenMethod.java | 145 +++++++++++++----- test/bytecode/AssignToLit.jav | 30 ++-- test/bytecode/For.jav | 26 ++-- test/bytecode/Op.jav | 12 ++ test/bytecode/OpTest.java | 7 + test/parser/OpratorTest.jav | 6 +- 6 files changed, 157 insertions(+), 69 deletions(-) create mode 100644 test/bytecode/Op.jav create mode 100644 test/bytecode/OpTest.java diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index b6a45bb1..df714015 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -43,30 +43,28 @@ public class BytecodeGenMethod implements StatementVisitor{ private MethodVisitor mv; private HashMap paramsAndLocals = new HashMap<>(); private String className; - private int lamCounter; + private int lamCounter = -1; private ClassWriter cw; private ResultSet resultSet; private boolean isInterface; HashMap genericsAndBoundsMethod; private HashMap genericsAndBounds; + private boolean isBinaryExp = false; //for tests ** private String fieldName; private String fieldDesc; private Expression rightSideTemp; -// private String where; private boolean isRightSideALambda = false; private KindOfLambda kindOfLambda; private HashMap classFiles; - private ArrayList varsFunInterface; + private ArrayList varsFunInterface = new ArrayList<>();; public BytecodeGenMethod(String className,ResultSet resultSet, Method m, MethodVisitor mv, HashMap paramsAndLocals, ClassWriter cw, HashMap genericsAndBoundsMethod, HashMap genericsAndBounds, boolean isInterface, HashMap classFiles) { -// this.where = "<<<<<< NORMAL METHOD >>>>>>"; - this.className = className; this.resultSet = resultSet; this.m = m; @@ -77,9 +75,6 @@ public class BytecodeGenMethod implements StatementVisitor{ this.genericsAndBounds = genericsAndBounds; this.isInterface = isInterface; this.classFiles = classFiles; - this.lamCounter = -1; - - this.varsFunInterface = new ArrayList<>(); if(!isInterface) this.m.block.accept(this); @@ -89,13 +84,10 @@ public class BytecodeGenMethod implements StatementVisitor{ public BytecodeGenMethod(LambdaExpression lambdaExpression,ResultSet resultSet ,MethodVisitor mv, int indexOfFirstParamLam, boolean isInterface, HashMap classFiles) { -// this.where = "<<<<<< LAMBDA METHOD >>>>>>"; this.resultSet = resultSet; this.mv = mv; this.isInterface = isInterface; this.classFiles = classFiles; - this.lamCounter = -1; - this.varsFunInterface = new ArrayList<>(); Iterator itr = lambdaExpression.params.iterator(); int i = indexOfFirstParamLam; @@ -124,51 +116,61 @@ public class BytecodeGenMethod implements StatementVisitor{ public void visit(SuperCall superCall) { superCall.receiver.accept(this); superCall.arglist.accept(this); -// mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", superCall.name, desc,false); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), superCall.name, "()V",isInterface); } // ?? @Override public void visit(LocalVar localVar) { -// System.out.println("in Local Var: " + localVar.name); mv.visitVarInsn(Opcodes.ALOAD, paramsAndLocals.get(localVar.name)); + if(isBinaryExp) { + getVlaue(getResolvedType(localVar.getType())); + } } // ?? @Override public void visit(LocalVarDecl localVarDecl) { -// Integer i; -// paramsAndLocals.put(localVarDecl.getName(), paramsAndLocals.size()+1); -// System.out.println("In localVarDecl :: "+localVarDecl.getName()); + } @Override public void visit(Assign assign) { -// System.out.println("Assign : \nright = "+assign.rightSide + "\nLeft = " + assign.lefSide); - // if the right side is a lambda => the left side must be a functional interface - if(assign.rightSide.getClass().equals(LambdaExpression.class)) { + if(assign.rightSide instanceof LambdaExpression) { isRightSideALambda = true; }else { isRightSideALambda = false; } - if(assign.lefSide.getClass().equals(AssignToField.class)) { + if(assign.rightSide instanceof BinaryExpr) + isBinaryExp = true; + + if(assign.lefSide instanceof AssignToField) { // load_0, ldc or .. then putfield this.rightSideTemp = assign.rightSide; - assign.lefSide.accept(this); }else { assign.rightSide.accept(this); - assign.lefSide.accept(this); } + if(isBinaryExp) { + doAssign(getResolvedType(assign.lefSide.getType())); + isBinaryExp = false; + } + assign.lefSide.accept(this); } @Override - public void visit(BinaryExpr binary) { - System.out.println("\t++ In Binary: "); - System.out.println(binary.operation.toString()); + binary.lexpr.accept(this); + binary.rexpr.accept(this); + switch (binary.operation.toString()) { + case "ADD": + mv.visitInsn(Opcodes.IADD); + break; + default: + break; + } + } @Override @@ -330,12 +332,6 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(MethodCall methodCall) { -// if(methodCall.receiver instanceof ExpressionReceiver){ -// System.out.print(((ExpressionReceiver) methodCall.receiver).expr + "\n"); -// }else{ -// System.out.print(((StaticClassName) methodCall.receiver).getType().toString() + "\n"); -// } - methodCall.receiver.accept(this); methodCall.arglist.accept(this); @@ -343,8 +339,6 @@ public class BytecodeGenMethod implements StatementVisitor{ genericsAndBoundsMethod,genericsAndBounds); String mDesc = method.accept(new DescriptorToString(resultSet)); -// System.out.println("is Vars empty: "+varsFunInterface.isEmpty()); - // is methodCall.receiver functional Interface)? if(varsFunInterface.contains(methodCall.receiver.getType())) { mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, getResolvedType(methodCall.receiver.getType()), @@ -361,8 +355,6 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(NewClass methodCall) { -// System.out.println("In NewClass: "); -// System.out.println("\t\tname: " + methodCall.name + " *** " + "Receiver: " + methodCall.receiver); mv.visitTypeInsn(Opcodes.NEW, methodCall.name.replace(".", "/")); mv.visitInsn(Opcodes.DUP); @@ -437,9 +429,53 @@ public class BytecodeGenMethod implements StatementVisitor{ @Override public void visit(Literal literal) { Object value = literal.value; - switch (resultSet.resolveType(literal.getType()).resolvedType.acceptTV(new TypeToDescriptor())) { + String typeOfLiteral = resultSet.resolveType(literal.getType()).resolvedType.acceptTV(new TypeToDescriptor()); + if(this.isBinaryExp) { + getVlaue(typeOfLiteral); + }else { + doAssign(typeOfLiteral, value); + } + + + } + + private void getVlaue(String typeOfLiteral) { + switch (typeOfLiteral) { case "java/lang/String": - mv.visitLdcInsn(value); + break; + case "java/lang/Boolean": + break; + case "java/lang/Byte": + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Byte", "valueOf", + "(B)Ljava/lang/Byte;", false); + break; + case "java/lang/Short": + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Short", "valueOf", + "(S)Ljava/lang/Short;", false); + break; + case "java/lang/Integer": + mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Integer", "intValue", + "()I", false); + break; + case "java/lang/Long": + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", + "(J)Ljava/lang/Long;", false); + break; + case "java/lang/Float": + break; + case "java/lang/Double": + break; + case "java/lang/Character": + break; + default: + break; + } + } + + private void doAssign(String type, Object value) { + switch (type) { + case "java/lang/String": + mv.visitLdcInsn(String.valueOf(value)); break; case "java/lang/Boolean": visitBooleanLiteral((Boolean) value); @@ -479,8 +515,41 @@ public class BytecodeGenMethod implements StatementVisitor{ } } + private void doAssign(String type) { + switch (type) { + case "java/lang/String": + break; + case "java/lang/Boolean": + break; + case "java/lang/Byte": + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Byte", "valueOf", + "(B)Ljava/lang/Byte;", false); + break; + case "java/lang/Short": + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Short", "valueOf", + "(S)Ljava/lang/Short;", false); + break; + case "java/lang/Integer": + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", + "(I)Ljava/lang/Integer;", false); + break; + case "java/lang/Long": + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", + "(J)Ljava/lang/Long;", false); + break; + case "java/lang/Float": + break; + case "java/lang/Double": + break; + case "java/lang/Character": + break; + default: + break; + } + } + private void visitCharLiteral(Character value) { - mv.visitIntInsn(Opcodes.BIPUSH, Character.getNumericValue(value.charValue())); + mv.visitIntInsn(Opcodes.BIPUSH, (int) value); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;", false); } diff --git a/test/bytecode/AssignToLit.jav b/test/bytecode/AssignToLit.jav index 46ec2b91..873828ed 100644 --- a/test/bytecode/AssignToLit.jav +++ b/test/bytecode/AssignToLit.jav @@ -10,21 +10,21 @@ import java.lang.Character; class AssignToLit { void m(){ - String s = "Test"; - Boolean b = false; - Byte byte1 = 5; - Byte byte2 = 55; - Short short1 = 5; - Short short2 = 55; - Integer int1 = 5; - Integer int2 = 8888888; - Long long1 = 1; - Long long2 = 5; - Long long3 = 89989898; - Float float1 = 1; - Float float2 = 55; - Double d1 = 1; - Double d2 = 55; +// String s = "Test"; +// Boolean b = false; +// Byte byte1 = 5; +// Byte byte2 = 55; +// Short short1 = 5; +// Short short2 = 55; +// Integer int1 = 5; +// Integer int2 = 8888888; +// Long long1 = 1; +// Long long2 = 5; +// Long long3 = 89989898; +// Float float1 = 1; +// Float float2 = 55; +// Double d1 = 1; +// Double d2 = 55; Character c = 'A'; } } \ No newline at end of file diff --git a/test/bytecode/For.jav b/test/bytecode/For.jav index 04cb6a53..c4bd6677 100644 --- a/test/bytecode/For.jav +++ b/test/bytecode/For.jav @@ -2,19 +2,19 @@ import java.lang.Integer; import java.lang.Boolean; class For{ - m(Integer x){ - - Boolean b = true; - c = 5; - c++; - ++c; - c--; - --c; - while(x<2){ - x = x +1; - b = false; - } - return x; + Integer m(Integer x){ + var c = x + 2; +// Boolean b = true; +// c = 5; +// c++; +// ++c; +// c--; +// --c; +// while(x<2){ +// x = x +1; +// b = false; +// } + return c; // for(int i = 0;i<10;i++) { // x = x + 5; // } diff --git a/test/bytecode/Op.jav b/test/bytecode/Op.jav new file mode 100644 index 00000000..9c05b0a2 --- /dev/null +++ b/test/bytecode/Op.jav @@ -0,0 +1,12 @@ +import java.lang.Integer; + +class Op { + m(Integer a, Integer b) { + Integer c = a+b; +// d = a-b; +// e = a*b; +// f = a/b; + + return c; + } +} \ No newline at end of file diff --git a/test/bytecode/OpTest.java b/test/bytecode/OpTest.java new file mode 100644 index 00000000..cd8fee06 --- /dev/null +++ b/test/bytecode/OpTest.java @@ -0,0 +1,7 @@ +package bytecode; + +public class OpTest extends JavaTXCompilerTest { + public OpTest() { + this.fileName = "Op"; + } +} diff --git a/test/parser/OpratorTest.jav b/test/parser/OpratorTest.jav index f99734f6..2764adf4 100644 --- a/test/parser/OpratorTest.jav +++ b/test/parser/OpratorTest.jav @@ -3,9 +3,9 @@ import java.lang.Integer; class OpratorTest { m(Integer a, Integer b) { c = a+b; - d = a-b; - e = a*b; - f = a/b; +// d = a-b; +// e = a*b; +// f = a/b; return c; } From 59569380ed60d0f5ea5da2363a4e417c3ac57455 Mon Sep 17 00:00:00 2001 From: Fayez Abu Alia Date: Fri, 23 Feb 2018 20:17:32 +0100 Subject: [PATCH 23/65] Kleiner Bug beseitigt --- .../parser/SyntaxTreeGenerator/StatementGenerator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java index 2b0b1a4f..5310d13b 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java @@ -825,7 +825,9 @@ public class StatementGenerator { }else if(literal.CharacterLiteral() != null){ RefType type = new RefType(reg.getName("java.lang.Character"),literal.getStart()); return new Literal(type, - literal.CharacterLiteral().getText().charAt(0), + // das gibt immer ' zurück, der Char befindet sich in Position 1 + //literal.CharacterLiteral().getText().charAt(0), + literal.CharacterLiteral().getText().charAt(1), literal.getStart()); }else if(literal.StringLiteral()!=null){ RefType type = new RefType(reg.getName("java.lang.String"),literal.getStart()); From 92b110a971b2566417e8e322533d2f2ebe27f5f9 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 27 Feb 2018 19:10:16 +0100 Subject: [PATCH 24/65] Funktionierender Clingo Test --- .../sat/asp/ASPStringConverter.java | 17 ++ src/de/dhbwstuttgart/sat/asp/Clingo.java | 8 +- .../dhbwstuttgart/sat/asp/model/ASPRule.java | 4 +- .../sat/asp/parser/ASPParser.java | 186 +++++++++++++++++- .../asp/parser/model/ParsedASPStatement.java | 7 - .../sat/asp/parser/model/ParsedType.java | 12 ++ .../sat/asp/writer/ASPGenerator.java | 20 +- .../asp/writer/model/ASPParameterList.java | 4 +- .../sat/asp/writer/model/ASPTypeVar.java | 4 +- .../typeinference/result/PairTPHEqualTPH.java | 2 +- .../PairTPHequalRefTypeOrWildcardType.java | 2 +- .../result/PairTPHsmallerTPH.java | 2 +- .../typeinference/result/ResultPair.java | 2 +- .../result/ResultPairVisitor.java | 7 + .../result/ResultSetVisitor.java | 5 +- test/asp/ClingoTest.java | 17 +- test/asp/UnifyWithoutWildcards.java | 29 +++ 17 files changed, 279 insertions(+), 49 deletions(-) create mode 100644 src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/parser/model/ParsedASPStatement.java create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java create mode 100644 src/de/dhbwstuttgart/typeinference/result/ResultPairVisitor.java create mode 100644 test/asp/UnifyWithoutWildcards.java diff --git a/src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java b/src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java new file mode 100644 index 00000000..0497b09a --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java @@ -0,0 +1,17 @@ +package de.dhbwstuttgart.sat.asp; + +import de.dhbwstuttgart.parser.scope.JavaClassName; + +public class ASPStringConverter { + public static String toConstant(JavaClassName name){ + return toConstant(name.toString().replace(".", "_")); + } + + public static String toConstant(String name){ + return "c" + name.toString().replace(".", "_"); + } + + public static String fromConstant(String s){ + return s.replace("_", ".").substring(1); + } +} diff --git a/src/de/dhbwstuttgart/sat/asp/Clingo.java b/src/de/dhbwstuttgart/sat/asp/Clingo.java index 85f6dc56..ed1e9f40 100644 --- a/src/de/dhbwstuttgart/sat/asp/Clingo.java +++ b/src/de/dhbwstuttgart/sat/asp/Clingo.java @@ -17,16 +17,20 @@ public class Clingo { private static final List programFiles = new ArrayList<>(); static{ programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/basis.lp")); + programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/finiteclosure.lp")); programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/subst.lp")); - programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/reduce1.lp")); - programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/reduce2.lp")); + programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/reduce.lp")); programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/unify.lp")); + programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/adapt.lp")); } public Clingo(List inputFiles){ this.input = inputFiles; } + /* + TODO: Clingo per Java Wrapper https://stackoverflow.com/questions/3356200/using-java-to-wrap-over-c + */ public String runClingo() throws IOException, InterruptedException { String pathToClingo = "/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/clingo-5.2.1-linux-x86_64/clingo"; diff --git a/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java b/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java index 8d4d73f9..24ed9269 100644 --- a/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java +++ b/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java @@ -9,8 +9,8 @@ public enum ASPRule { ASP_PARAMLISTNUMERATION_NAME("paramNum"), ASP_PARAMLIST_END_POINTER("null"), ASP_TYPE("type"), - ASP_FCTYPE("type") - ; + ASP_FCTYPE("typeFC"), + ASP_TYPE_VAR("typeVar"); private final String text; diff --git a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java index c7be7dbc..b3534f47 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java @@ -1,17 +1,187 @@ package de.dhbwstuttgart.sat.asp.parser; -import de.dhbwstuttgart.typeinference.result.ResultPair; -import de.dhbwstuttgart.typeinference.result.ResultSet; +import de.dhbwstuttgart.exceptions.DebugException; +import de.dhbwstuttgart.parser.NullToken; +import de.dhbwstuttgart.parser.scope.JavaClassName; +import de.dhbwstuttgart.sat.asp.ASPStringConverter; +import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.parser.model.ParsedType; +import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; +import de.dhbwstuttgart.sat.asp.writer.model.ASPParameterList; +import de.dhbwstuttgart.sat.asp.writer.model.ASPRefType; +import de.dhbwstuttgart.sat.asp.writer.model.ASPType; +import de.dhbwstuttgart.syntaxtree.type.*; +import de.dhbwstuttgart.typeinference.result.*; -import java.util.HashSet; -import java.util.Set; +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonObject; +import java.io.StringReader; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +/** + * Ablauf: + * - Erst werden alle benötigten Statements eingelesen. Die Pointer bleiben als Strings erhalten + * - Anschließend müssen diese wieder zu einem Unify Ergebnis zurückgewandelt werden + * - Hier nicht die Typen aus dem unify.model packages verwenden. + * TODO: Ãœberlegen welche Informationen noch nach der Unifizierung gebraucht werden + * -> Eigentlich nur die korrekten Namen der Typen und TPHs + */ public class ASPParser { - ResultSet parse(String result){ - Set ret = new HashSet<>(); - for(String pair : result.split(",")){ + private final Collection originalTPHs; + private ResultSet resultSet; + private Map types = new HashMap<>(); + private Set tphs = new HashSet<>(); + private Map parameterLists = new HashMap<>(); + /** + * Parst clingo output welcher als JSON (option --outf=2) ausgibt + * @param toParse + * @return + */ + public static ResultSet parse(String toParse, Collection oldPlaceholders){ + return new ASPParser(toParse, oldPlaceholders).resultSet; + } + + + private ASPParser(String toParse, Collection oldPlaceholders){ + this.originalTPHs = oldPlaceholders; + JsonObject jsonResult = Json.createReader(new StringReader(toParse)).readObject(); + JsonArray results = jsonResult.getJsonArray("Call").getJsonObject(0). + getJsonArray("Witnesses").getJsonObject(0). + getJsonArray("Value"); + + /* + Diese Funktion läuft im folgenden mehrmals über das Result aus dem ASP Programm. + Dabei werden Schritt für Schritt die Felder dieser Klasse befüllt die am Schluss das ResultSet ergeben + */ + Set ret = new HashSet<>(); + //Zuerst die params und typeVars: + for(int i = 0; i params = new ArrayList<>(); + ParsedType t = types.get(name); + for(String param : t.params){ + params.add(this.getType(param)); + } + return new RefType(new JavaClassName(ASPStringConverter.fromConstant(t.name)), params, new NullToken()); + }else throw new DebugException("Der Typ " + name + " konnte nicht bestimmt werden"); + } + + private static class ParameterListNode{ + final String type; + final String nextNode; + + public ParameterListNode(String type, String next) { + this.type = type; + this.nextNode = next; + } + } + private void parseParameter(String statement){ + Pattern p = Pattern.compile(ASPRule.ASP_PARAMLIST_NAME+"\\(([^,]+),([^,]+),([^,]+)\\)"); + Matcher m = p.matcher(statement); + boolean b = m.matches(); + if(b){ + if(m.groupCount()<3)throw new DebugException("Fehler in Regex"); + String pointer = m.group(1); + String type = m.group(2); + String next = m.group(2); + if(next.equals(ASPRule.ASP_PARAMLIST_END_POINTER.toString()))next = null; + if(this.parameterLists.containsKey(pointer)){ + throw new DebugException("Fehler in Ergebnisparsen"); + } + this.parameterLists.put(pointer,new ParameterListNode(type, next)); + } + } + + private void parseTypeVar(String statement){ + Pattern p = Pattern.compile(ASPRule.ASP_TYPE_VAR+"\\(([^,]+)\\)"); + Matcher m = p.matcher(statement); + boolean b = m.matches(); + if(b){ + if(m.groupCount()<1)throw new DebugException("Fehler in Regex"); + String name = m.group(1); + this.tphs.add(name); + } + } + + private void parseType(String statement){ + Pattern p = Pattern.compile(ASPRule.ASP_TYPE+"\\(([^,]+),([^,]+)\\)"); + Matcher m = p.matcher(statement); + boolean b = m.matches(); + if(b){ + if(m.groupCount()<2)throw new DebugException("Fehler in Regex"); + String ls = m.group(1); + String rs = m.group(2); + List params = this.getParams(rs); + this.types.put(ls,new ParsedType(ls, params)); + } + } + + private List getParams(String pointer) { + List params = new ArrayList<>(); + if(pointer.equals(ASPRule.ASP_PARAMLIST_END_POINTER.toString()))return params; + while(pointer != null){ + if(!parameterLists.containsKey(pointer)) + throw new DebugException("Fehler in Ergebnisparsen"); + ParameterListNode param = parameterLists.get(pointer); + pointer = param.nextNode; + params.add(param.type); + } + return params; + //Optional ret = parameterLists.stream().filter(aspParameterList -> aspParameterList.name.equals(rs)).findAny(); + //return ret.get(); } } \ No newline at end of file diff --git a/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedASPStatement.java b/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedASPStatement.java deleted file mode 100644 index 614bddb0..00000000 --- a/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedASPStatement.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.dhbwstuttgart.sat.asp.parser.model; - -public class ParsedASPStatement { - public ParsedASPStatement(String statement){ - - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java b/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java new file mode 100644 index 00000000..c49ce831 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java @@ -0,0 +1,12 @@ +package de.dhbwstuttgart.sat.asp.parser.model; + +import java.util.List; + +public class ParsedType { + public final String name; + public final List params; + public ParsedType(String name, List params){ + this.name = name; + this.params = params; + } +} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java index 38652b43..b1483423 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.sat.asp.writer; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; import de.dhbwstuttgart.parser.scope.JavaClassName; +import de.dhbwstuttgart.sat.asp.ASPStringConverter; import de.dhbwstuttgart.sat.asp.writer.model.*; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; @@ -24,7 +25,6 @@ public class ASPGenerator { List> constraints1 = constraints.cartesianProduct().iterator().next(); List constraintPairs = new ArrayList<>(); for(Constraint constraint : constraints1){ - System.out.println(UnifyTypeFactory.convert(constraint)); constraintPairs.addAll(constraint); } asp = toASP(constraintPairs, FCGenerator.toFC(fcClasses)); @@ -65,18 +65,10 @@ public class ASPGenerator { private ASPRefType convert(ClassOrInterface cl){ List paramList = new ArrayList<>(); for(GenericTypeVar gtv : cl.getGenerics()){ - paramList.add(new ASPGenericType(toConstant(gtv.getName()))); + paramList.add(new ASPGenericType(ASPStringConverter.toConstant(gtv.getName()))); } ASPParameterList params = new ASPParameterList(paramList, writer); - return new ASPRefType(toConstant(cl.getClassName()), params); - } - - public static String toConstant(JavaClassName name){ - return toConstant(name.toString().replace(".", "_")); - } - - public static String toConstant(String name){ - return "c" + name.toString().replace(".", "_"); + return new ASPRefType(ASPStringConverter.toConstant(cl.getClassName()), params); } private class TypeConverter implements TypeVisitor{ @@ -88,7 +80,7 @@ public class ASPGenerator { paramList.add(gtv.acceptTV(this)); } ASPParameterList params = new ASPParameterList(paramList, writer); - return new ASPRefType(toConstant(type.getName()), params); + return new ASPRefType(ASPStringConverter.toConstant(type.getName()), params); } @Override @@ -98,7 +90,7 @@ public class ASPGenerator { @Override public ASPType visit(TypePlaceholder typePlaceholder) { - return new ASPTypeVar(toConstant(typePlaceholder.getName())); + return new ASPTypeVar(ASPStringConverter.toConstant(typePlaceholder.getName())); } @Override @@ -108,7 +100,7 @@ public class ASPGenerator { @Override public ASPType visit(GenericRefType genericRefType) { - return new ASPRefType(toConstant(genericRefType.getName()), + return new ASPRefType(ASPStringConverter.toConstant(genericRefType.getName()), new ASPParameterList(new ArrayList<>(), writer)); } } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java index 3c176e49..178bb8fa 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java @@ -1,5 +1,6 @@ package de.dhbwstuttgart.sat.asp.writer.model; +import de.dhbwstuttgart.sat.asp.ASPStringConverter; import de.dhbwstuttgart.sat.asp.model.ASPRule; import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.sat.asp.writer.ASPWriter; @@ -30,13 +31,12 @@ public class ASPParameterList { writer.add(new ASPStatement(ASPRule.ASP_PARAMLIST_NAME + "(" + param + ")")); writer.add(new ASPStatement(ASPRule.ASP_PARAMLISTNUMERATION_NAME + "(" + name + "," +t + "," + paramNum + ")")); paramNum++; - //paramDefinitions.add(new ASPStatement(ASP_PARAMLIST_NAME + "(" + param + ")")); } } } private String newName() { - return ASPGenerator.toConstant(NameGenerator.makeNewName()); + return ASPStringConverter.toConstant(NameGenerator.makeNewName()); } public String toString(){ diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java index 8b3c1af6..24b33eaf 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java @@ -1,5 +1,7 @@ package de.dhbwstuttgart.sat.asp.writer.model; +import de.dhbwstuttgart.sat.asp.model.ASPRule; + public class ASPTypeVar implements ASPType{ private final String name; @@ -9,7 +11,7 @@ public class ASPTypeVar implements ASPType{ @Override public String toString() { - return "typeVar("+ name +")"; + return ASPRule.ASP_TYPE_VAR+"("+ name +")"; } @Override diff --git a/src/de/dhbwstuttgart/typeinference/result/PairTPHEqualTPH.java b/src/de/dhbwstuttgart/typeinference/result/PairTPHEqualTPH.java index 64d0ce0b..c24fe211 100644 --- a/src/de/dhbwstuttgart/typeinference/result/PairTPHEqualTPH.java +++ b/src/de/dhbwstuttgart/typeinference/result/PairTPHEqualTPH.java @@ -9,7 +9,7 @@ public class PairTPHEqualTPH extends ResultPair getFC() { Set ret = new HashSet<>(); - ret.add(ASTFactory.createObjectClass()); - ret.add(ASTFactory.createClass(java.util.List.class)); return ret; } public ConstraintSet getPairs() { ConstraintSet ret = new ConstraintSet<>(); - ret.addUndConstraint(new Pair(TypePlaceholder.fresh(new NullToken()), ASTFactory.createObjectType(), PairOperator.SMALLERDOT)); + ret.addUndConstraint(new Pair(testType, ASTFactory.createObjectType(), PairOperator.EQUALSDOT)); return ret; } } diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java new file mode 100644 index 00000000..9e7c867d --- /dev/null +++ b/test/asp/UnifyWithoutWildcards.java @@ -0,0 +1,29 @@ +package asp; + +import de.dhbwstuttgart.parser.NullToken; +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; +import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; +import de.dhbwstuttgart.typeinference.constraints.Pair; +import de.dhbwstuttgart.typeinference.unify.model.PairOperator; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +public class UnifyWithoutWildcards { + + public Collection getFC() { + Set ret = new HashSet<>(); + ret.add(ASTFactory.createObjectClass()); + ret.add(ASTFactory.createClass(java.util.List.class)); + return ret; + } + + public ConstraintSet getPairs() { + ConstraintSet ret = new ConstraintSet<>(); + ret.addUndConstraint(new Pair(TypePlaceholder.fresh(new NullToken()), ASTFactory.createObjectType(), PairOperator.SMALLERDOT)); + return ret; + } +} From 9f9a94b5cfb6ed8712ab241ccd9a8cd963653b05 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 28 Feb 2018 13:22:07 +0100 Subject: [PATCH 25/65] =?UTF-8?q?Testf=C3=A4lle=20bereinigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../syntaxtree/factory/UnifyTypeFactory.java | 5 +- test/javFiles/Expressions.jav | 8 +++ test/typeinference/FacultyTest.java | 9 --- test/typeinference/FiniteClosureTest.java | 9 --- test/typeinference/GenericsTest.java | 10 --- test/typeinference/JavaTXCompilerTest.java | 62 ++++++++++++++++--- test/typeinference/Lambda2Test.java | 9 --- test/typeinference/Lambda3Test.java | 9 --- test/typeinference/LambdaTest.java | 9 --- test/typeinference/MatrixTest.java | 9 --- test/typeinference/RunnableTest.java | 9 --- test/typeinference/VectorTest.java | 9 --- test/typeinference/mathStrucTest.java | 9 --- 13 files changed, 64 insertions(+), 102 deletions(-) create mode 100644 test/javFiles/Expressions.jav delete mode 100644 test/typeinference/FacultyTest.java delete mode 100644 test/typeinference/FiniteClosureTest.java delete mode 100644 test/typeinference/GenericsTest.java delete mode 100644 test/typeinference/Lambda2Test.java delete mode 100644 test/typeinference/Lambda3Test.java delete mode 100644 test/typeinference/LambdaTest.java delete mode 100644 test/typeinference/MatrixTest.java delete mode 100644 test/typeinference/RunnableTest.java delete mode 100644 test/typeinference/VectorTest.java delete mode 100644 test/typeinference/mathStrucTest.java diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java index 4ecaa136..43fcf1b4 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java @@ -127,10 +127,13 @@ public class UnifyTypeFactory { UnifyPair ret = generateSmallerDotPair(UnifyTypeFactory.convert(p.TA1) , UnifyTypeFactory.convert(p.TA2)); return ret; - }else if(p.GetOperator().equals(PairOperator.EQUALSDOT)){ + }else if(p.GetOperator().equals(PairOperator.EQUALSDOT)) { UnifyPair ret = generateEqualDotPair(UnifyTypeFactory.convert(p.TA1) , UnifyTypeFactory.convert(p.TA2)); return ret; + }else if(p.GetOperator().equals(PairOperator.SMALLER)){ + return generateSmallerPair(UnifyTypeFactory.convert(p.TA1), + UnifyTypeFactory.convert(p.TA2)); }else throw new NotImplementedException(); } diff --git a/test/javFiles/Expressions.jav b/test/javFiles/Expressions.jav new file mode 100644 index 00000000..e2e992a1 --- /dev/null +++ b/test/javFiles/Expressions.jav @@ -0,0 +1,8 @@ +class Expressions{ + +void test(){ + var x = 2; + x = x + 2; +} + +} \ No newline at end of file diff --git a/test/typeinference/FacultyTest.java b/test/typeinference/FacultyTest.java deleted file mode 100644 index aadaf6e7..00000000 --- a/test/typeinference/FacultyTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class FacultyTest extends JavaTXCompilerTest{ - public FacultyTest() { - this.fileToTest = new File(rootDirectory+"Faculty.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/FiniteClosureTest.java b/test/typeinference/FiniteClosureTest.java deleted file mode 100644 index 8b62e4e5..00000000 --- a/test/typeinference/FiniteClosureTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class FiniteClosureTest extends JavaTXCompilerTest{ - public FiniteClosureTest() { -// this.fileToTest = new File(rootDirectory+"fc.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/GenericsTest.java b/test/typeinference/GenericsTest.java deleted file mode 100644 index abcef013..00000000 --- a/test/typeinference/GenericsTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package typeinference; - -import java.io.File; - -//TODO: Hier gibt es einen Fehler. Das erstellte ConstraintSet stimmt nicht -public class GenericsTest extends JavaTXCompilerTest{ - public GenericsTest() { - this.fileToTest = new File(rootDirectory+"Generics.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index 03452018..3fe7c17d 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -23,19 +23,57 @@ import java.util.Set; public class JavaTXCompilerTest { public static final String rootDirectory = System.getProperty("user.dir")+"/test/javFiles/"; - private static final List filesToTest = new ArrayList<>(); - protected File fileToTest = null; - public JavaTXCompilerTest(){ + @Test + public void finiteClosure() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"fc.jav")); } @Test - public void test() throws IOException, ClassNotFoundException { - if(fileToTest != null)filesToTest.add(fileToTest); - else return; - //filesToTest.add(new File(rootDirectory+"Faculty.jav")); - //filesToTest.add(new File(rootDirectory+"mathStruc.jav")); - //filesToTest.add(new File(rootDirectory+"test.jav")); - filesToTest.add(new File(rootDirectory+"EmptyMethod.jav")); + public void lambda() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Lambda.jav")); + } + @Test + public void lambda2() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Lambda2.jav")); + } + @Test + public void lambda3() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Lambda3.jav")); + } + @Test + public void mathStruc() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"mathStruc.jav")); + } + @Test + public void generics() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Generics.jav")); + } + @Test + public void faculty() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Faculty.jav")); + } + @Test + public void matrix() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Matrix.jav")); + } + @Test + public void vector() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Vector.jav")); + } + @Test + public void lambdaRunnable() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"LambdaRunnable.jav")); + } + @Test + public void expressions() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Expressions.jav")); + } + + private static class TestResultSet{ + + } + + public TestResultSet execute(File fileToTest) throws IOException, ClassNotFoundException { //filesToTest.add(new File(rootDirectory+"fc.jav")); //filesToTest.add(new File(rootDirectory+"Lambda.jav")); //filesToTest.add(new File(rootDirectory+"Lambda2.jav")); @@ -45,6 +83,9 @@ public class JavaTXCompilerTest { //filesToTest.add(new File(rootDirectory+"MethodsEasy.jav")); //filesToTest.add(new File(rootDirectory+"Matrix.jav")); //filesToTest.add(new File(rootDirectory+"Import.jav")); + // //filesToTest.add(new File(rootDirectory+"Faculty.jav")); + // //filesToTest.add(new File(rootDirectory+"mathStruc.jav")); + // //filesToTest.add(new File(rootDirectory+"test.jav")); JavaTXCompiler compiler = new JavaTXCompiler(fileToTest); List results = compiler.typeInference(); @@ -68,6 +109,7 @@ public class JavaTXCompilerTest { System.out.println(s); } } + return new TestResultSet(); } static String readFile(String path, Charset encoding) diff --git a/test/typeinference/Lambda2Test.java b/test/typeinference/Lambda2Test.java deleted file mode 100644 index 84867cd9..00000000 --- a/test/typeinference/Lambda2Test.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class Lambda2Test extends JavaTXCompilerTest{ - public Lambda2Test() { - this.fileToTest = new File(rootDirectory+"Lambda2.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/Lambda3Test.java b/test/typeinference/Lambda3Test.java deleted file mode 100644 index 843eee10..00000000 --- a/test/typeinference/Lambda3Test.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class Lambda3Test extends JavaTXCompilerTest{ - public Lambda3Test() { - this.fileToTest = new File(rootDirectory+"Lambda3.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/LambdaTest.java b/test/typeinference/LambdaTest.java deleted file mode 100644 index abdaa140..00000000 --- a/test/typeinference/LambdaTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class LambdaTest extends JavaTXCompilerTest{ - public LambdaTest() { - this.fileToTest = new File(rootDirectory+"Lambda.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/MatrixTest.java b/test/typeinference/MatrixTest.java deleted file mode 100644 index 8cc587c9..00000000 --- a/test/typeinference/MatrixTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class MatrixTest extends JavaTXCompilerTest{ - public MatrixTest() { - this.fileToTest = new File(rootDirectory+"Matrix.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/RunnableTest.java b/test/typeinference/RunnableTest.java deleted file mode 100644 index bc0c52ad..00000000 --- a/test/typeinference/RunnableTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class RunnableTest extends JavaTXCompilerTest{ - public RunnableTest() { - this.fileToTest = new File(rootDirectory+"LambdaRunnable.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/VectorTest.java b/test/typeinference/VectorTest.java deleted file mode 100644 index 864535b3..00000000 --- a/test/typeinference/VectorTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class VectorTest extends JavaTXCompilerTest{ - public VectorTest() { - this.fileToTest = new File(rootDirectory+"Vector.jav"); - } -} \ No newline at end of file diff --git a/test/typeinference/mathStrucTest.java b/test/typeinference/mathStrucTest.java deleted file mode 100644 index 0181be72..00000000 --- a/test/typeinference/mathStrucTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package typeinference; - -import java.io.File; - -public class mathStrucTest extends JavaTXCompilerTest{ - public mathStrucTest() { - this.fileToTest = new File(rootDirectory+"mathStruc.jav"); - } -} \ No newline at end of file From f023754328320f0a46a6725b0b14716541757612 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 28 Feb 2018 14:50:16 +0100 Subject: [PATCH 26/65] =?UTF-8?q?TypeStmt=20f=C3=BCr=20+,-,/,*,%=20einf?= =?UTF-8?q?=C3=BChren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../syntaxtree/statement/BinaryExpr.java | 21 +++++----- .../typeinference/typeAlgo/TYPEStmt.java | 41 +++++++++++++++---- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/de/dhbwstuttgart/syntaxtree/statement/BinaryExpr.java b/src/de/dhbwstuttgart/syntaxtree/statement/BinaryExpr.java index f7db0481..bb631e04 100644 --- a/src/de/dhbwstuttgart/syntaxtree/statement/BinaryExpr.java +++ b/src/de/dhbwstuttgart/syntaxtree/statement/BinaryExpr.java @@ -13,16 +13,17 @@ public class BinaryExpr extends Expression } public enum Operator{ - ADD, - SUB, - MUL, - AND, - OR, - DIV, - LESSTHAN, - BIGGERTHAN, - LESSEQUAL, - BIGGEREQUAL + ADD, // + + SUB, // - + MUL, // * + MOD, // Modulo Operator % + AND, // && + OR, // || + DIV, // / + LESSTHAN, // < + BIGGERTHAN, // > + LESSEQUAL, // <= + BIGGEREQUAL // >= } public final Operator operation; diff --git a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 3733b7dc..e6b82a10 100644 --- a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -81,11 +81,6 @@ public class TYPEStmt implements StatementVisitor{ assign.rightSide.getType(), assign.lefSide.getType(), PairOperator.SMALLERDOT)); } - @Override - public void visit(BinaryExpr binary) { - //TODO - } - @Override public void visit(Block block) { for(Statement stmt : block.getStatements()){ @@ -190,6 +185,8 @@ public class TYPEStmt implements StatementVisitor{ receiver.expr.accept(this); } + private final RefType number = new RefType(ASTFactory.createClass(Number.class).getClassName(), new NullToken()); + private final RefType string = new RefType(ASTFactory.createClass(String.class).getClassName(), new NullToken()); @Override public void visit(UnaryExpr unaryExpr) { if(unaryExpr.operation == UnaryExpr.Operation.POSTDECREMENT || @@ -198,7 +195,6 @@ public class TYPEStmt implements StatementVisitor{ unaryExpr.operation == UnaryExpr.Operation.PREINCREMENT){ //@see: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.14.2 //Expression muss zu Numeric Convertierbar sein. also von Numeric erben - RefType number = new RefType(ASTFactory.createClass(Number.class).getClassName(), unaryExpr.getOffset()); constraintsSet.addUndConstraint(new Pair(unaryExpr.expr.getType(), number, PairOperator.SMALLERDOT)); //The type of the postfix increment expression is the type of the variable constraintsSet.addUndConstraint(new Pair(unaryExpr.expr.getType(), unaryExpr.getType(), PairOperator.EQUALSDOT)); @@ -207,9 +203,40 @@ public class TYPEStmt implements StatementVisitor{ } } + @Override + public void visit(BinaryExpr binary) { + if(binary.operation.equals(BinaryExpr.Operator.DIV) || + binary.operation.equals(BinaryExpr.Operator.MUL)|| + binary.operation.equals(BinaryExpr.Operator.MOD)|| + binary.operation.equals(BinaryExpr.Operator.ADD)){ + Set numericAdditionOrStringConcatenation = new HashSet<>(); + Constraint numeric = new Constraint<>(); + //Zuerst der Fall für Numerische AusdrücPairOpnumericeratorke, das sind Mul, Mod und Div immer: + //see: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 + //Expression muss zu Numeric Convertierbar sein. also von Numeric erben + numeric.add(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERDOT)); + numeric.add(new Pair(binary.rexpr.getType(), number, PairOperator.SMALLERDOT)); + //The type of a multiplicative expression is the promoted type of its operands. + numeric.add(new Pair(binary.rexpr.getType(), binary.getType(), PairOperator.SMALLERDOT)); + numeric.add(new Pair(binary.lexpr.getType(), binary.getType(), PairOperator.SMALLERDOT)); + numericAdditionOrStringConcatenation.add(numeric); + if(binary.operation.equals(BinaryExpr.Operator.ADD)) { + //Dann kann der Ausdruck auch das aneinanderfügen zweier Strings sein: ("a" + "b") oder (1 + 2) + Constraint stringConcat = new Constraint<>(); + stringConcat.add(new Pair(binary.lexpr.getType(), string, PairOperator.EQUALSDOT)); + stringConcat.add(new Pair(binary.rexpr.getType(), string, PairOperator.EQUALSDOT)); + stringConcat.add(new Pair(binary.getType(), string, PairOperator.EQUALSDOT)); + numericAdditionOrStringConcatenation.add(stringConcat); + } + constraintsSet.addOderConstraint(numericAdditionOrStringConcatenation); + }else { + throw new NotImplementedException(); + } + } + @Override public void visit(Literal literal) { - //Nothing to do here. Literale kriegen beim parsen den korrekten Typ. + //Nothing to do here. Literale erzeugen keine Constraints } @Override From 327f36f1c2cb345c5ceef23907b1c659d44b9099 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 28 Feb 2018 15:21:12 +0100 Subject: [PATCH 27/65] =?UTF-8?q?Faculty=20Test=20=C3=A4ndern.=20UnifyType?= =?UTF-8?q?Factory=20konvertiert=20automatisch=20FunN=20Typen=20korrekt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../syntaxtree/factory/UnifyTypeFactory.java | 15 +++++++++++++++ test/javFiles/Faculty.jav | 6 +----- test/javFiles/FacultyTyped.jav | 19 +++++++++++++++++++ test/typeinference/JavaTXCompilerTest.java | 4 ++++ 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 test/javFiles/FacultyTyped.jav diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java index 43fcf1b4..e58ce50f 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java @@ -1,12 +1,17 @@ package de.dhbwstuttgart.syntaxtree.factory; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; +import de.dhbwstuttgart.exceptions.DebugException; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; import de.dhbwstuttgart.parser.scope.JavaClassName; +import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.parser.ASPParser; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.syntaxtree.type.Void; @@ -72,6 +77,16 @@ public class UnifyTypeFactory { } public static UnifyType convert(RefType t){ + //Check if it is a FunN Type: + Pattern p = Pattern.compile("Fun(\\d+)"); + Matcher m = p.matcher(t.getName().toString()); + boolean b = m.matches(); + if(b){ + Integer N = Integer.valueOf(m.group(1)); + if((N + 1) == t.getParaList().size()){ + return convert(new FunN(t.getParaList())); + } + } UnifyType ret; if(t.getParaList() != null && t.getParaList().size() > 0){ List params = new ArrayList<>(); diff --git a/test/javFiles/Faculty.jav b/test/javFiles/Faculty.jav index 089d2f33..ca539add 100644 --- a/test/javFiles/Faculty.jav +++ b/test/javFiles/Faculty.jav @@ -6,14 +6,10 @@ class Faculty { return x; } - Fun1 m () { + m () { var fact = (Integer x) -> { return mul(x, fact.apply(x)); }; return fact; } -} - -interface Fun1{ - B apply(A a); } \ No newline at end of file diff --git a/test/javFiles/FacultyTyped.jav b/test/javFiles/FacultyTyped.jav new file mode 100644 index 00000000..089d2f33 --- /dev/null +++ b/test/javFiles/FacultyTyped.jav @@ -0,0 +1,19 @@ +import java.lang.Integer; + +class Faculty { + + Integer mul(Integer x, Integer y) { + return x; + } + + Fun1 m () { + var fact = (Integer x) -> { + return mul(x, fact.apply(x)); + }; + return fact; + } +} + +interface Fun1{ + B apply(A a); +} \ No newline at end of file diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index 3fe7c17d..bf48a537 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -53,6 +53,10 @@ public class JavaTXCompilerTest { execute(new File(rootDirectory+"Faculty.jav")); } @Test + public void facultyTyped() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"FacultyTyped.jav")); + } + @Test public void matrix() throws IOException, ClassNotFoundException { execute(new File(rootDirectory+"Matrix.jav")); } From 99ce7c1122f51a292fac5e34849a61421e1f76c8 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 28 Feb 2018 16:33:18 +0100 Subject: [PATCH 28/65] =?UTF-8?q?<,=20>=20Operatoren=20einf=C3=BChren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../typeinference/typeAlgo/TYPEStmt.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index e6b82a10..8ed2343c 100644 --- a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -187,6 +187,7 @@ public class TYPEStmt implements StatementVisitor{ private final RefType number = new RefType(ASTFactory.createClass(Number.class).getClassName(), new NullToken()); private final RefType string = new RefType(ASTFactory.createClass(String.class).getClassName(), new NullToken()); + private final RefType bool = new RefType(ASTFactory.createClass(Boolean.class).getClassName(), new NullToken()); @Override public void visit(UnaryExpr unaryExpr) { if(unaryExpr.operation == UnaryExpr.Operation.POSTDECREMENT || @@ -229,7 +230,15 @@ public class TYPEStmt implements StatementVisitor{ numericAdditionOrStringConcatenation.add(stringConcat); } constraintsSet.addOderConstraint(numericAdditionOrStringConcatenation); - }else { + }else if(binary.operation.equals(BinaryExpr.Operator.LESSEQUAL) || + binary.operation.equals(BinaryExpr.Operator.BIGGEREQUAL) || + binary.operation.equals(BinaryExpr.Operator.BIGGERTHAN) || + binary.operation.equals(BinaryExpr.Operator.LESSTHAN)){ + constraintsSet.addUndConstraint(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERDOT)); + constraintsSet.addUndConstraint(new Pair(binary.rexpr.getType(), number, PairOperator.SMALLERDOT)); + //Rückgabetyp ist Boolean + constraintsSet.addUndConstraint(new Pair(bool, binary.getType(), PairOperator.EQUALSDOT)); + }else{ throw new NotImplementedException(); } } From 53087a8e048235047cddf8ac14c4ba8c16f981b4 Mon Sep 17 00:00:00 2001 From: Pluemicke Martin Date: Wed, 28 Feb 2018 17:11:50 +0100 Subject: [PATCH 29/65] result.add wieder aktiviert --- src/de/dhbwstuttgart/core/JavaTXCompiler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/de/dhbwstuttgart/core/JavaTXCompiler.java index 8d381e37..9a66543a 100644 --- a/src/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -103,7 +103,7 @@ public class JavaTXCompiler { System.out.println(xConsSet); Set> result = unify.unify(xConsSet, finiteClosure); System.out.println("RESULT: " + result.size()); - //results.addAll(result); + results.addAll(result); } return results.stream().map((unifyPairs -> new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList()); From 9840281d836564329d28087dda97d22b044998cc Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Thu, 1 Mar 2018 12:31:56 +0100 Subject: [PATCH 30/65] =?UTF-8?q?Test=20f=C3=BCr=20ASP=20anf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../syntaxtree/factory/ASTFactory.java | 2 + .../syntaxtree/type/SuperWildcardType.java | 2 +- test/asp/ClingoTest.java | 1 - test/asp/UnifyWithoutWildcards.java | 91 ++++++++++++++++--- 4 files changed, 83 insertions(+), 13 deletions(-) diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index b0683569..8dc34ecf 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -43,6 +43,8 @@ public class ASTFactory { } int modifier = jreClass.getModifiers(); boolean isInterface = jreClass.isInterface(); + //see: https://stackoverflow.com/questions/9934774/getting-generic-parameter-from-supertype-class + //ParameterizedType parameterSuperClass = (ParameterizedType) jreClass.getGenericSuperclass(); java.lang.Class superjreClass = jreClass.getSuperclass(); RefType superClass; if(superjreClass != null){ diff --git a/src/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java b/src/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java index f630583e..740c80e5 100644 --- a/src/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java +++ b/src/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java @@ -30,7 +30,7 @@ public class SuperWildcardType extends WildcardType{ * Beispiel: ? super Integer. * Integer wird zurückgegeben. */ - public RefTypeOrTPHOrWildcardOrGeneric get_SuperType() + public RefTypeOrTPHOrWildcardOrGeneric getInnerType() { return this.innerType; } diff --git a/test/asp/ClingoTest.java b/test/asp/ClingoTest.java index d7656d8a..f47b644c 100644 --- a/test/asp/ClingoTest.java +++ b/test/asp/ClingoTest.java @@ -20,7 +20,6 @@ import java.io.*; import java.util.*; public class ClingoTest { - public static final String rootDirectory = "~/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards"; public static final String tempDirectory = "/tmp/"; private final TypePlaceholder testType = TypePlaceholder.fresh(new NullToken()); @Test diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index 9e7c867d..6fd6373e 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -1,29 +1,98 @@ package asp; import de.dhbwstuttgart.parser.NullToken; +import de.dhbwstuttgart.parser.scope.JavaClassName; +import de.dhbwstuttgart.sat.asp.Clingo; +import de.dhbwstuttgart.sat.asp.parser.ASPParser; +import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; -import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; +import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; import de.dhbwstuttgart.typeinference.constraints.Pair; +import de.dhbwstuttgart.typeinference.result.ResultSet; import de.dhbwstuttgart.typeinference.unify.model.PairOperator; +import org.junit.Test; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.Ref; +import java.util.*; public class UnifyWithoutWildcards { - public Collection getFC() { - Set ret = new HashSet<>(); - ret.add(ASTFactory.createObjectClass()); - ret.add(ASTFactory.createClass(java.util.List.class)); + public static final String tempDirectory = "/tmp/"; + + @Test + public void adapt() throws InterruptedException, IOException, ClassNotFoundException { + ConstraintSet testSet = new ConstraintSet<>(); + List list = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + RefType t1 = new RefType(new JavaClassName("Matrix"), new NullToken()); + RefType t2 = new RefType(new JavaClassName("Vector"), list, new NullToken()); + testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); + run(testSet); + } + + public ResultSet run(ConstraintSet toTest) throws IOException, InterruptedException, ClassNotFoundException { + String content = ""; + content = new ASPGenerator(toTest, this.getFC()).getASP(); + + PrintWriter writer = new PrintWriter(tempDirectory + "test.lp", "UTF-8"); + writer.println(content); + writer.close(); + Clingo clingo = new Clingo(Arrays.asList(new File(tempDirectory + "test.lp"))); + String result = clingo.runClingo(); + ResultSet resultSet = ASPParser.parse(result, getInvolvedTPHS(toTest)); + return resultSet; + } + + private static class TPHExtractor implements TypeVisitor>{ + @Override + public List visit(RefType refType) { + ArrayList ret = new ArrayList<>(); + for(RefTypeOrTPHOrWildcardOrGeneric param : refType.getParaList()){ + ret.addAll(param.acceptTV(this)); + } + return ret; + } + + @Override + public List visit(SuperWildcardType superWildcardType) { + return superWildcardType.getInnerType().acceptTV(this); + } + + @Override + public List visit(TypePlaceholder typePlaceholder) { + return Arrays.asList(typePlaceholder); + } + + @Override + public List visit(ExtendsWildcardType extendsWildcardType) { + return extendsWildcardType.getInnerType().acceptTV(this); + } + + @Override + public List visit(GenericRefType genericRefType) { + return new ArrayList<>(); + } + } + private Collection getInvolvedTPHS(ConstraintSet toTest) { + List ret = new ArrayList<>(); + toTest.map((Pair p)-> { + ret.addAll(p.TA1.acceptTV(new TPHExtractor())); + ret.addAll(p.TA2.acceptTV(new TPHExtractor())); + return p; + }); return ret; } - public ConstraintSet getPairs() { - ConstraintSet ret = new ConstraintSet<>(); - ret.addUndConstraint(new Pair(TypePlaceholder.fresh(new NullToken()), ASTFactory.createObjectType(), PairOperator.SMALLERDOT)); + private Collection getFC() { + Set ret = new HashSet<>(); + ret.add(ASTFactory.createClass(Matrix.class)); + //ret.add(ASTFactory.createObjectClass()); + //ret.add(ASTFactory.createClass(java.util.List.class)); return ret; } + private class Matrix extends Vector>{} } From 18545cff9a434bc6c307ffc86879e387e606a1f5 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Thu, 1 Mar 2018 13:25:03 +0100 Subject: [PATCH 31/65] =?UTF-8?q?GenericRefType=20umgestalten.=20Unn=C3=B6?= =?UTF-8?q?tige=20Backreferenzen=20entfernen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bytecode/signature/Signature.java | 6 ++-- .../SyntaxTreeGenerator/FCGenerator.java | 11 +++---- .../SyntaxTreeGenerator/GenericContext.java | 4 +-- .../SyntaxTreeGenerator/TypeGenerator.java | 5 ++- .../parser/scope/GenericTypeName.java | 26 --------------- .../sat/asp/writer/ASPGenerator.java | 4 +-- .../syntaxtree/GenericTypeVar.java | 15 +++------ .../syntaxtree/factory/ASTFactory.java | 32 +++++++++++++------ .../syntaxtree/type/GenericRefType.java | 10 ++---- .../syntaxtree/visual/OutputGenerator.java | 3 +- .../typedeployment/TypeInsertFactory.java | 2 +- .../typeinference/assumptions/FunNClass.java | 5 +-- .../assumptions/MethodAssumption.java | 3 -- .../typeinference/typeAlgo/TYPEStmt.java | 3 +- test/asp/UnifyWithoutWildcards.java | 2 +- 15 files changed, 47 insertions(+), 84 deletions(-) delete mode 100644 src/de/dhbwstuttgart/parser/scope/GenericTypeName.java diff --git a/src/de/dhbwstuttgart/bytecode/signature/Signature.java b/src/de/dhbwstuttgart/bytecode/signature/Signature.java index f9bcb369..46202cb1 100644 --- a/src/de/dhbwstuttgart/bytecode/signature/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -10,12 +10,10 @@ import org.objectweb.asm.signature.SignatureWriter; import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.Constructor; -import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression; import de.dhbwstuttgart.syntaxtree.type.GenericRefType; -import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; import de.dhbwstuttgart.typeinference.result.ResultSet; @@ -165,7 +163,7 @@ public class Signature { * @param genAndBounds */ private void getBoundsOfTypeVar(GenericTypeVar g, HashMap genAndBounds) { - sw.visitFormalTypeParameter(g.getParsedName()); + sw.visitFormalTypeParameter(g.getName()); Iterator bItr = g.getBounds().iterator(); while(bItr.hasNext()) { @@ -174,7 +172,7 @@ public class Signature { // System.out.println("GetBounds: " + boundDesc); // Ensure that <...> extends java.lang.Object OR ... sw.visitClassBound().visitClassType(boundDesc); - genAndBounds.put(g.getParsedName(), boundDesc); + genAndBounds.put(g.getName(), boundDesc); } sw.visitClassBound().visitEnd(); } diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index ea2b17a6..24abec67 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -1,7 +1,6 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator; import de.dhbwstuttgart.exceptions.DebugException; -import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; @@ -51,11 +50,11 @@ public class FCGenerator { HashMap newGTVs = new HashMap<>(); //Generics mit gleichem Namen müssen den selben TPH bekommen for(GenericTypeVar gtv : forType.getGenerics()){ - if(!gtvs.containsKey(gtv.getParsedName())){ - gtvs.put(gtv.getParsedName(), TypePlaceholder.fresh(new NullToken())); - newGTVs.put(gtv.getParsedName(), TypePlaceholder.fresh(new NullToken())); + if(!gtvs.containsKey(gtv.getName())){ + gtvs.put(gtv.getName(), TypePlaceholder.fresh(new NullToken())); + newGTVs.put(gtv.getName(), TypePlaceholder.fresh(new NullToken())); } - params.add(gtvs.get(gtv.getParsedName())); + params.add(gtvs.get(gtv.getName())); } Optional hasSuperclass = availableClasses.stream().filter(cl -> forType.getSuperClass().getName().equals(cl.getClassName())).findAny(); @@ -79,7 +78,7 @@ public class FCGenerator { 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().getParsedName(), setSetType); + newGTVs.put(itGenParams.next().getName(), setSetType); } RefTypeOrTPHOrWildcardOrGeneric superType = forType.getSuperClass().acceptTV(new TypeExchanger(newGTVs)); diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/GenericContext.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/GenericContext.java index 6e3ce7d9..0cea06ed 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/GenericContext.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/GenericContext.java @@ -3,8 +3,8 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator; import de.dhbwstuttgart.parser.scope.JavaClassName; public class GenericContext { - public final String parentMethod; - public final JavaClassName parentClass; + private final String parentMethod; + private final JavaClassName parentClass; public GenericContext(JavaClassName parentClass, String parentMethod) { if(parentMethod == null)parentMethod = ""; diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java index ccc7b327..38399bf0 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/TypeGenerator.java @@ -3,7 +3,6 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.exceptions.TypeinferenceException; import de.dhbwstuttgart.parser.antlr.Java8Parser; -import de.dhbwstuttgart.parser.scope.GenericTypeName; import de.dhbwstuttgart.parser.scope.GenericsRegistry; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.parser.scope.JavaClassRegistry; @@ -75,7 +74,7 @@ public class TypeGenerator { //Problem ist erlaubt, würde aber bei den Bounds von A den Generic B nicht als solchen erkennen List bounds = TypeGenerator.convert(typeParameter.typeBound(),reg, generics); - GenericTypeVar ret = new GenericTypeVar(new GenericTypeName(new GenericContext(parentClass, parentMethod), name), bounds, typeParameter.getStart(), typeParameter.getStop()); + GenericTypeVar ret = new GenericTypeVar(name, bounds, typeParameter.getStart(), typeParameter.getStop()); generics.put(name, new GenericContext(parentClass, parentMethod)); return ret; } @@ -133,7 +132,7 @@ public class TypeGenerator { String name, Java8Parser.TypeArgumentsContext typeArguments, Token offset, JavaClassRegistry reg, GenericsRegistry generics){ if(!reg.contains(name)){ //Dann könnte es ein Generische Type sein if(generics.contains(name)){ - return new GenericRefType(new GenericTypeName(generics.get(name),name), offset); + return new GenericRefType(name, offset); }else{ throw new TypeinferenceException("Der Typ "+ name + " ist nicht vorhanden",offset); } diff --git a/src/de/dhbwstuttgart/parser/scope/GenericTypeName.java b/src/de/dhbwstuttgart/parser/scope/GenericTypeName.java deleted file mode 100644 index c5355ebd..00000000 --- a/src/de/dhbwstuttgart/parser/scope/GenericTypeName.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.dhbwstuttgart.parser.scope; - -import de.dhbwstuttgart.parser.SyntaxTreeGenerator.GenericContext; - -public class GenericTypeName extends JavaClassName { - private final static String DELIMITER = "%"; - - private final JavaClassName parentClass; - private final String methodName; - - public GenericTypeName(GenericContext genericContext, String name) { - super(name); - this.parentClass = genericContext.parentClass; - this.methodName = genericContext.parentMethod; - } - - public String getUniqueIdentifier() { - return parentClass.toString() - + DELIMITER + methodName - + DELIMITER + super.toString(); - } - - public JavaClassName getParentClass() { - return parentClass; - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java index b1483423..676aa33f 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java @@ -2,12 +2,10 @@ package de.dhbwstuttgart.sat.asp.writer; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; -import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.sat.asp.ASPStringConverter; import de.dhbwstuttgart.sat.asp.writer.model.*; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; -import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory; import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.typeinference.constraints.Constraint; import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; @@ -100,7 +98,7 @@ public class ASPGenerator { @Override public ASPType visit(GenericRefType genericRefType) { - return new ASPRefType(ASPStringConverter.toConstant(genericRefType.getName()), + return new ASPRefType(ASPStringConverter.toConstant(genericRefType.getParsedName()), new ASPParameterList(new ArrayList<>(), writer)); } } diff --git a/src/de/dhbwstuttgart/syntaxtree/GenericTypeVar.java b/src/de/dhbwstuttgart/syntaxtree/GenericTypeVar.java index 02042ca3..6ee03b60 100644 --- a/src/de/dhbwstuttgart/syntaxtree/GenericTypeVar.java +++ b/src/de/dhbwstuttgart/syntaxtree/GenericTypeVar.java @@ -1,7 +1,5 @@ package de.dhbwstuttgart.syntaxtree; -import de.dhbwstuttgart.parser.scope.GenericTypeName; -import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; import org.antlr.v4.runtime.Token; @@ -26,9 +24,9 @@ public class GenericTypeVar extends SyntaxTreeNode */ List bounds=new ArrayList(); private Token endOffset; - private GenericTypeName name; + private String name; - public GenericTypeVar(GenericTypeName s, List bounds, Token offset, Token endOffset) + public GenericTypeVar(String s, List bounds, Token offset, Token endOffset) { super(offset); name = s; @@ -50,18 +48,15 @@ public class GenericTypeVar extends SyntaxTreeNode return "BoGTV " + this.name; } - public GenericTypeName getName() { - return name; - } - - public String getParsedName(){ + public String getName(){ return name.toString(); } + /* public JavaClassName definingClass(){ return name.getParentClass(); } - +*/ @Override public void accept(ASTVisitor visitor) { visitor.visit(this); diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index 8dc34ecf..fa930f58 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -8,7 +8,6 @@ import java.util.List; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.GenericContext; -import de.dhbwstuttgart.parser.scope.GenericTypeName; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.parser.scope.JavaClassRegistry; import de.dhbwstuttgart.syntaxtree.Field; @@ -44,13 +43,16 @@ public class ASTFactory { int modifier = jreClass.getModifiers(); boolean isInterface = jreClass.isInterface(); //see: https://stackoverflow.com/questions/9934774/getting-generic-parameter-from-supertype-class - //ParameterizedType parameterSuperClass = (ParameterizedType) jreClass.getGenericSuperclass(); + ParameterizedType parameterSuperClass = null; + Type tempSuperClass = jreClass.getGenericSuperclass(); + if(tempSuperClass != null && tempSuperClass instanceof ParameterizedType) + parameterSuperClass = (ParameterizedType) tempSuperClass; java.lang.Class superjreClass = jreClass.getSuperclass(); RefType superClass; if(superjreClass != null){ List params = new ArrayList<>(); for(TypeVariable tv : superjreClass.getTypeParameters()){ - params.add(new GenericRefType(new GenericTypeName(new GenericContext( name, null),tv.getName()), new NullToken())); + params.add(new GenericRefType(tv.getName(), new NullToken())); } superClass = new RefType(new JavaClassName(superjreClass.getName()), params, new NullToken()); }else{//Jede Klasse und jedes Interface erbt von Object: (auch Object selbst!) @@ -67,6 +69,22 @@ public class ASTFactory { return new ClassOrInterface(modifier, name, felder, methoden, konstruktoren, genericDeclarationList, superClass,isInterface, implementedInterfaces, offset); } + private static RefTypeOrTPHOrWildcardOrGeneric convertType(Type type){ + JavaClassName name = null; + List params = new ArrayList<>(); + if(type instanceof ParameterizedType){ + for(Type paramType : ((ParameterizedType)type).getActualTypeArguments()){ + params.add(convertType(paramType)); + } + }else if(type instanceof TypeVariable){ + + }else if(type instanceof Class){ + Class paramClass = (Class) type; + //params.add(new RefType(paramClass.getName()) + }else throw new NotImplementedException(); + return new RefType(name, params, new NullToken()); + } + private static Field createField(java.lang.reflect.Field field, JavaClassName jreClass) { return new Field(field.getName(), createType(field.getType(), jreClass, null), field.getModifiers(), new NullToken()); } @@ -155,9 +173,7 @@ public class ASTFactory { }else{ if(type instanceof TypeVariable){ //GTVDeclarationContext via "(TypeVariable) type).getGenericDeclaration()" - return new GenericRefType( - new GenericTypeName(new GenericContext(parentClass, parentMethod),type.getTypeName()), - new NullToken()); + return new GenericRefType(type.getTypeName(), new NullToken()); } List params = new ArrayList<>(); if(type instanceof ParameterizedType){ @@ -179,9 +195,7 @@ public class ASTFactory { genericBounds.add((RefType) createType(bound, parentClass, parentMethod)); } } - return new de.dhbwstuttgart.syntaxtree.GenericTypeVar( - new GenericTypeName(new GenericContext(parentClass, parentMethod), jreTVName) - , genericBounds, new NullToken(), new NullToken()); + return new de.dhbwstuttgart.syntaxtree.GenericTypeVar(jreTVName, genericBounds, new NullToken(), new NullToken()); } public static ClassOrInterface createObjectClass() { diff --git a/src/de/dhbwstuttgart/syntaxtree/type/GenericRefType.java b/src/de/dhbwstuttgart/syntaxtree/type/GenericRefType.java index a5d394aa..a14813e7 100644 --- a/src/de/dhbwstuttgart/syntaxtree/type/GenericRefType.java +++ b/src/de/dhbwstuttgart/syntaxtree/type/GenericRefType.java @@ -1,25 +1,19 @@ package de.dhbwstuttgart.syntaxtree.type; -import de.dhbwstuttgart.parser.scope.GenericTypeName; -import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.syntaxtree.ASTVisitor; import de.dhbwstuttgart.typeinference.result.ResultSetVisitor; import org.antlr.v4.runtime.Token; public class GenericRefType extends RefTypeOrTPHOrWildcardOrGeneric { - private GenericTypeName name; + private String name; - public GenericRefType(GenericTypeName name, Token offset) + public GenericRefType(String name, Token offset) { super(offset); this.name = name; } - public GenericTypeName getName(){ - return name; - } - public String getParsedName(){ return name.toString(); } diff --git a/src/de/dhbwstuttgart/syntaxtree/visual/OutputGenerator.java b/src/de/dhbwstuttgart/syntaxtree/visual/OutputGenerator.java index c7a06502..0c623548 100644 --- a/src/de/dhbwstuttgart/syntaxtree/visual/OutputGenerator.java +++ b/src/de/dhbwstuttgart/syntaxtree/visual/OutputGenerator.java @@ -1,6 +1,5 @@ package de.dhbwstuttgart.syntaxtree.visual; -import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal; import de.dhbwstuttgart.syntaxtree.*; import de.dhbwstuttgart.syntaxtree.statement.*; @@ -171,7 +170,7 @@ public class OutputGenerator implements ASTVisitor{ @Override public void visit(GenericRefType genericRefType) { - out.append(genericRefType.getName().toString()); + out.append(genericRefType.getParsedName().toString()); } @Override diff --git a/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java b/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java index 29492c31..8834f859 100644 --- a/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java +++ b/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java @@ -126,7 +126,7 @@ class TypeToInsertString implements ResultSetVisitor{ @Override public void visit(GenericRefType genericRefType) { - insert += genericRefType.getName(); + insert += genericRefType.getParsedName(); } @Override diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java b/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java index a04ce9bb..3518c16a 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/FunNClass.java @@ -1,8 +1,6 @@ package de.dhbwstuttgart.typeinference.assumptions; import de.dhbwstuttgart.parser.NullToken; -import de.dhbwstuttgart.parser.SyntaxTreeGenerator.GenericContext; -import de.dhbwstuttgart.parser.scope.GenericTypeName; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.GenericDeclarationList; @@ -29,8 +27,7 @@ public class FunNClass extends ClassOrInterface { private static GenericDeclarationList createGenerics(List funNParams) { List generics = new ArrayList<>(); for(RefTypeOrTPHOrWildcardOrGeneric param : funNParams){ - generics.add(new GenericTypeVar(new GenericTypeName(new GenericContext( - new JavaClassName("Fun"+(funNParams.size()-1)), null), NameGenerator.makeNewName()), + generics.add(new GenericTypeVar(NameGenerator.makeNewName(), new ArrayList<>(), new NullToken(), new NullToken())); } return new GenericDeclarationList(generics, new NullToken()); diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java b/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java index 066c3246..4656318c 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java @@ -3,9 +3,7 @@ package de.dhbwstuttgart.typeinference.assumptions; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.GenericTypeVar; -import de.dhbwstuttgart.syntaxtree.ParameterList; import de.dhbwstuttgart.syntaxtree.TypeScope; -import de.dhbwstuttgart.syntaxtree.statement.Assign; import de.dhbwstuttgart.syntaxtree.type.FunN; import de.dhbwstuttgart.syntaxtree.type.GenericRefType; import de.dhbwstuttgart.syntaxtree.type.RefType; @@ -14,7 +12,6 @@ import de.dhbwstuttgart.typeinference.constraints.GenericsResolver; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; public class MethodAssumption extends Assumption{ private ClassOrInterface receiver; diff --git a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 8ed2343c..1fc2c3d8 100644 --- a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -4,7 +4,6 @@ import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.exceptions.TypeinferenceException; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal; -import de.dhbwstuttgart.parser.antlr.Java8Parser; import de.dhbwstuttgart.syntaxtree.*; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; import de.dhbwstuttgart.syntaxtree.statement.*; @@ -339,7 +338,7 @@ public class TYPEStmt implements StatementVisitor{ List params = new ArrayList<>(); for(GenericTypeVar gtv : receiverCl.getGenerics()){ //Die Generics werden alle zu TPHs umgewandelt. - params.add(resolver.resolve(gtv.getParsedName())); + params.add(resolver.resolve(gtv.getName())); } RefTypeOrTPHOrWildcardOrGeneric receiverType = new RefType(assumption.getReceiver().getClassName(), params, forMethod.getOffset()); diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index 6fd6373e..db697312 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -94,5 +94,5 @@ public class UnifyWithoutWildcards { //ret.add(ASTFactory.createClass(java.util.List.class)); return ret; } - private class Matrix extends Vector>{} + private class Matrix extends HashMap>{} } From 284af1246ba50f0690a9d94a89a16cdaa8bf9c19 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 7 Mar 2018 07:41:46 +0100 Subject: [PATCH 32/65] =?UTF-8?q?Nicht=20lauff=C3=A4hig.=20ASPFactory=20ne?= =?UTF-8?q?u=20implementieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sat/asp/ASPStringConverter.java | 29 +++++++++++++++++-- src/de/dhbwstuttgart/sat/asp/Clingo.java | 1 + .../sat/asp/writer/ASPFactory.java | 16 ++++++++++ .../sat/asp/writer/ASPGenerator.java | 7 ++--- .../sat/asp/writer/model/ASPGenericType.java | 6 ++-- .../sat/asp/writer/model/ASPPair.java | 5 ++-- .../asp/writer/model/ASPParameterList.java | 2 +- .../sat/asp/writer/model/ASPRefType.java | 5 ---- .../sat/asp/writer/model/ASPType.java | 2 -- .../sat/asp/writer/model/ASPTypeVar.java | 11 +++---- .../syntaxtree/factory/ASTFactory.java | 25 +++++++++------- test/asp/UnifyWithoutWildcards.java | 5 ++-- test/javFiles/LambdaRunnable.jav | 3 ++ 13 files changed, 78 insertions(+), 39 deletions(-) create mode 100644 src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java diff --git a/src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java b/src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java index 0497b09a..5235ab1a 100644 --- a/src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java +++ b/src/de/dhbwstuttgart/sat/asp/ASPStringConverter.java @@ -2,16 +2,39 @@ package de.dhbwstuttgart.sat.asp; import de.dhbwstuttgart.parser.scope.JavaClassName; +import java.util.HashMap; +import java.util.Map; + public class ASPStringConverter { + private static final Map replacements = new HashMap<>(); + static{ + replacements.put(".", "_DOT_"); + replacements.put("$", "_DOLLAR_"); + } + public static String toConstant(JavaClassName name){ - return toConstant(name.toString().replace(".", "_")); + return toConstant(name.toString()); } public static String toConstant(String name){ - return "c" + name.toString().replace(".", "_"); + return "c" + replace(name); } public static String fromConstant(String s){ - return s.replace("_", ".").substring(1); + return unReplace(s).substring(1); + } + + private static String replace(String input){ + for(String toReplace : replacements.keySet()){ + input = input.replace(toReplace, replacements.get(toReplace)); + } + return input; + } + + private static String unReplace(String input){ + for(String toReplace : replacements.keySet()){ + input = input.replace(replacements.get(toReplace), toReplace); + } + return input; } } diff --git a/src/de/dhbwstuttgart/sat/asp/Clingo.java b/src/de/dhbwstuttgart/sat/asp/Clingo.java index ed1e9f40..e0f29cb1 100644 --- a/src/de/dhbwstuttgart/sat/asp/Clingo.java +++ b/src/de/dhbwstuttgart/sat/asp/Clingo.java @@ -41,6 +41,7 @@ public class Clingo { commands.add(file.getPath()); } commands.addAll(programFiles.stream().map(f->f.getPath()).collect(Collectors.toList())); + Process clingo = new ProcessBuilder( commands.toArray(new String[0])).start(); InputStream output = clingo.getInputStream(); clingo.waitFor(); diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java new file mode 100644 index 00000000..46c047d5 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java @@ -0,0 +1,16 @@ +package de.dhbwstuttgart.sat.asp.writer; + +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.type.RefType; + +import java.util.Collection; + +public class ASPFactory { + public static String convertFC(Collection classes){ + return null; //TODO + } + + public static String convert(RefType t){ + return null; //TODO + } +} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java index 676aa33f..3f999a41 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java @@ -36,11 +36,10 @@ public class ASPGenerator { TypeConverter converter = new TypeConverter(); for(Pair fcp : fc){ //Wenn dieser Cast fehlschlägt stimmt etwas nicht. Alle Paare in der FC müssen smaller Operatoren haen - ASPPairSmaller fcEntry = (ASPPairSmaller) convert(fcp); - writer.add(new ASPStatement(fcEntry.toASP())); + convert(fcp); } for(Pair cons : constraintSet){ - writer.add(new ASPStatement(convert(cons).toASP())); + convert(cons); } return writer.getASPFile(); @@ -88,7 +87,7 @@ public class ASPGenerator { @Override public ASPType visit(TypePlaceholder typePlaceholder) { - return new ASPTypeVar(ASPStringConverter.toConstant(typePlaceholder.getName())); + return new ASPTypeVar(ASPStringConverter.toConstant(typePlaceholder.getName()),writer); } @Override diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java index 8e732d64..327ce04a 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java @@ -1,6 +1,7 @@ package de.dhbwstuttgart.sat.asp.writer.model; import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.writer.ASPWriter; public class ASPGenericType implements ASPType{ private final String name; @@ -13,9 +14,8 @@ public class ASPGenericType implements ASPType{ return ASPRule.ASP_GENERIC_TYPE_NAME + "(" + name + ")"; } - @Override - public String toASP() { - return toString(); + private String toASP() { + return ASPRule.ASP_GENERIC_TYPE_NAME + "(" + name + ")"; } @Override diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java index 19730639..e881f346 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java @@ -9,11 +9,10 @@ public abstract class ASPPair { public ASPPair(ASPType ls, ASPType rs, ASPWriter writer){ this.leftSide = ls; this.rightSide = rs; - writer.add(new ASPStatement(ls.toASP())); - writer.add(new ASPStatement(rs.toASP())); + writer.add(new ASPStatement(toASP())); } - public String toASP(){ + private String toASP(){ return this.getRuleName() + "(" + leftSide.getPointer() + ","+ rightSide.getPointer() + ")"; } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java index 178bb8fa..fafa50f5 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java @@ -29,7 +29,7 @@ public class ASPParameterList { if(! it.hasNext())nextPointer = ASPRule.ASP_PARAMLIST_END_POINTER.toString(); param += nextPointer; writer.add(new ASPStatement(ASPRule.ASP_PARAMLIST_NAME + "(" + param + ")")); - writer.add(new ASPStatement(ASPRule.ASP_PARAMLISTNUMERATION_NAME + "(" + name + "," +t + "," + paramNum + ")")); + writer.add(new ASPStatement(ASPRule.ASP_PARAMLISTNUMERATION_NAME + "(" + name + "," + t.getPointer() + "," + paramNum + ")")); paramNum++; } } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java index 5eab65be..46a4d1c7 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java @@ -19,11 +19,6 @@ public class ASPRefType implements ASPType { return ASPRule.ASP_TYPE + "(" + name +"," + params.name + ")"; } - @Override - public String toASP() { - return toString(); - } - @Override public String getPointer() { return name; diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java index 6e715dba..201e36ad 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java @@ -1,7 +1,5 @@ package de.dhbwstuttgart.sat.asp.writer.model; public interface ASPType { - String toASP(); - String getPointer(); } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java index 24b33eaf..e10a88bf 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java @@ -1,22 +1,23 @@ package de.dhbwstuttgart.sat.asp.writer.model; import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.writer.ASPWriter; public class ASPTypeVar implements ASPType{ private final String name; - public ASPTypeVar(String name){ + public ASPTypeVar(String name, ASPWriter writer){ this.name = name; + writer.add(new ASPStatement(this.toASP())); } @Override public String toString() { - return ASPRule.ASP_TYPE_VAR+"("+ name +")"; + return toASP(); } - @Override - public String toASP() { - return toString(); + private String toASP() { + return ASPRule.ASP_TYPE_VAR+"("+ name +")"; } @Override diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index fa930f58..de1bec99 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -49,12 +49,10 @@ public class ASTFactory { parameterSuperClass = (ParameterizedType) tempSuperClass; java.lang.Class superjreClass = jreClass.getSuperclass(); RefType superClass; - if(superjreClass != null){ - List params = new ArrayList<>(); - for(TypeVariable tv : superjreClass.getTypeParameters()){ - params.add(new GenericRefType(tv.getName(), new NullToken())); - } - superClass = new RefType(new JavaClassName(superjreClass.getName()), params, new NullToken()); + if(parameterSuperClass != null){ + superClass = (RefType) convertType(parameterSuperClass); + }else if(superjreClass != null){ + superClass = (RefType) convertType(superjreClass); }else{//Jede Klasse und jedes Interface erbt von Object: (auch Object selbst!) superClass = (RefType) createType(java.lang.Object.class, name, ""); } @@ -70,19 +68,24 @@ public class ASTFactory { } private static RefTypeOrTPHOrWildcardOrGeneric convertType(Type type){ - JavaClassName name = null; - List params = new ArrayList<>(); if(type instanceof ParameterizedType){ + List params = new ArrayList<>(); for(Type paramType : ((ParameterizedType)type).getActualTypeArguments()){ params.add(convertType(paramType)); } + JavaClassName name = new JavaClassName(((ParameterizedType) type).getRawType().getTypeName()); + return new RefType(name, params, new NullToken()); }else if(type instanceof TypeVariable){ - + return new GenericRefType(((TypeVariable) type).getName(), new NullToken()); }else if(type instanceof Class){ + List params = new ArrayList<>(); Class paramClass = (Class) type; - //params.add(new RefType(paramClass.getName()) + for(TypeVariable tv : paramClass.getTypeParameters()){ + params.add(new GenericRefType(tv.getName(), new NullToken())); + } + JavaClassName name = new JavaClassName(paramClass.getName()); + return new RefType(name, params, new NullToken()); }else throw new NotImplementedException(); - return new RefType(name, params, new NullToken()); } private static Field createField(java.lang.reflect.Field field, JavaClassName jreClass) { diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index db697312..998ec56c 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -28,10 +28,11 @@ public class UnifyWithoutWildcards { public void adapt() throws InterruptedException, IOException, ClassNotFoundException { ConstraintSet testSet = new ConstraintSet<>(); List list = Arrays.asList(TypePlaceholder.fresh(new NullToken())); - RefType t1 = new RefType(new JavaClassName("Matrix"), new NullToken()); + RefType t1 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Matrix"), new NullToken()); RefType t2 = new RefType(new JavaClassName("Vector"), list, new NullToken()); testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); - run(testSet); + ResultSet resultSet = run(testSet); + System.out.println(resultSet); } public ResultSet run(ConstraintSet toTest) throws IOException, InterruptedException, ClassNotFoundException { diff --git a/test/javFiles/LambdaRunnable.jav b/test/javFiles/LambdaRunnable.jav index 982680c3..37924ea2 100644 --- a/test/javFiles/LambdaRunnable.jav +++ b/test/javFiles/LambdaRunnable.jav @@ -1,3 +1,6 @@ +import java.lang.Runnable; +import java.lang.String; +import java.lang.System; public class LamRunnable{ From 725b071d28c0962577e84df3b3a4ade3495db5ac Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 7 Mar 2018 08:47:43 +0100 Subject: [PATCH 33/65] Problem mit BinaryExpr gefixt --- .../dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java | 10 +++++++--- test/javFiles/AddLong.jav | 9 +++++++++ test/typeinference/JavaTXCompilerTest.java | 4 ++++ 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 test/javFiles/AddLong.jav diff --git a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 1fc2c3d8..8d87218d 100644 --- a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -205,6 +205,7 @@ public class TYPEStmt implements StatementVisitor{ @Override public void visit(BinaryExpr binary) { + if(binary.operation.equals(BinaryExpr.Operator.DIV) || binary.operation.equals(BinaryExpr.Operator.MUL)|| binary.operation.equals(BinaryExpr.Operator.MOD)|| @@ -216,9 +217,12 @@ public class TYPEStmt implements StatementVisitor{ //Expression muss zu Numeric Convertierbar sein. also von Numeric erben numeric.add(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERDOT)); numeric.add(new Pair(binary.rexpr.getType(), number, PairOperator.SMALLERDOT)); - //The type of a multiplicative expression is the promoted type of its operands. - numeric.add(new Pair(binary.rexpr.getType(), binary.getType(), PairOperator.SMALLERDOT)); - numeric.add(new Pair(binary.lexpr.getType(), binary.getType(), PairOperator.SMALLERDOT)); + /* + In Java passiert bei den binären Operatoren eine sogenannte Type Promotion: + https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 + Das bedeutet, dass Java die Typen je nach belieben castet, so lange sie nur von Number erben + */ + numeric.add(new Pair(binary.getType(), number, PairOperator.SMALLERDOT)); numericAdditionOrStringConcatenation.add(numeric); if(binary.operation.equals(BinaryExpr.Operator.ADD)) { //Dann kann der Ausdruck auch das aneinanderfügen zweier Strings sein: ("a" + "b") oder (1 + 2) diff --git a/test/javFiles/AddLong.jav b/test/javFiles/AddLong.jav new file mode 100644 index 00000000..ceb31228 --- /dev/null +++ b/test/javFiles/AddLong.jav @@ -0,0 +1,9 @@ +import java.lang.Integer; +import java.lang.Long; + +public class AddLong{ + add(Integer a, Long b) { + Long c = a+b; + return c; + } +} \ No newline at end of file diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index bf48a537..87551476 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -72,6 +72,10 @@ public class JavaTXCompilerTest { public void expressions() throws IOException, ClassNotFoundException { execute(new File(rootDirectory+"Expressions.jav")); } + @Test + public void addLong() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"AddLong.jav")); + } private static class TestResultSet{ From c4aec8379e952d791a11b05cdd2cee8933e354d6 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 7 Mar 2018 21:52:46 +0100 Subject: [PATCH 34/65] Erste Version von ASPFactory implementieren --- .../sat/asp/writer/ASPFactory.java | 123 +++++++++++++++++- 1 file changed, 116 insertions(+), 7 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java index 46c047d5..30c06169 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java @@ -1,16 +1,125 @@ package de.dhbwstuttgart.sat.asp.writer; +import de.dhbwstuttgart.exceptions.NotImplementedException; +import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; +import de.dhbwstuttgart.sat.asp.ASPStringConverter; +import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.writer.model.ASPStatement; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; -import de.dhbwstuttgart.syntaxtree.type.RefType; +import de.dhbwstuttgart.syntaxtree.factory.NameGenerator; +import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory; +import de.dhbwstuttgart.syntaxtree.type.*; +import de.dhbwstuttgart.typeinference.constraints.Constraint; +import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; +import de.dhbwstuttgart.typeinference.constraints.Pair; +import de.dhbwstuttgart.typeinference.result.PairTPHEqualTPH; +import de.dhbwstuttgart.typeinference.result.PairTPHequalRefTypeOrWildcardType; +import de.dhbwstuttgart.typeinference.result.PairTPHsmallerTPH; +import de.dhbwstuttgart.typeinference.result.ResultSetVisitor; +import de.dhbwstuttgart.typeinference.unify.model.PairOperator; -import java.util.Collection; +import java.util.*; -public class ASPFactory { - public static String convertFC(Collection classes){ - return null; //TODO +public class ASPFactory implements TypeVisitor{ + + public String generateASP(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException{ + ASPFactory factory = new ASPFactory(); + convertFC(fcClasses); + List> constraints1 = constraints.cartesianProduct().iterator().next(); + for(Constraint constraint : constraints1){ + for(Pair p : constraint){ + convertPair(p); + } + } + + return writer.getASPFile(); } - public static String convert(RefType t){ - return null; //TODO + ASPWriter writer = new ASPWriter(); + + private void convertFC(Collection classes) throws ClassNotFoundException { + Set fc = FCGenerator.toFC(classes); + for(Pair fcp : fc){ + convertPair(fcp); + } + } + + private void convertPair(Pair p){ + String ls = p.TA1.acceptTV(this); + String rs = p.TA2.acceptTV(this); + ASPStatement pairStmt = null; + if(p.GetOperator().equals(PairOperator.SMALLERDOT)){ + pairStmt = makeStatement(ASPRule.ASP_PAIR_SMALLER_DOT_NAME.toString(), ls, rs); + }else if(p.GetOperator().equals(PairOperator.EQUALSDOT)){ + pairStmt = makeStatement(ASPRule.ASP_PAIR_EQUALS_NAME.toString(), ls, rs); + }else if(p.GetOperator().equals(PairOperator.SMALLER)){ + pairStmt = makeStatement(ASPRule.ASP_PAIR_SMALLER_NAME.toString(), ls, rs); + }else throw new NotImplementedException(); + writer.add(pairStmt); + } + + private ASPStatement makeStatement(String rule, String... params){ + String stmt = rule + "("; + for(String param : params){ + stmt += param + ","; + } + stmt = stmt.substring(0,stmt.length()-1); + stmt += ")"; + return new ASPStatement(stmt); + } + + private String convertParameterlist(List pointers){ + String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + Iterator it = pointers.iterator(); + String p = pointer; + while (it.hasNext()){ + ASPStatement stmt; + String type = it.next(); + String nextP = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + if(it.hasNext()){ + stmt = makeStatement(ASPRule.ASP_PARAMLIST_NAME.toString(), p, type, nextP); + }else{ + stmt = makeStatement(ASPRule.ASP_PARAMLIST_NAME.toString(), p, type, + ASPRule.ASP_PARAMLIST_END_POINTER.toString()); + } + p = nextP; + writer.add(stmt); + } + return pointer; + } + + @Override + public String visit(RefType refType) { + String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + List params = new ArrayList<>(); + for(RefTypeOrTPHOrWildcardOrGeneric param : refType.getParaList()){ + params.add(param.acceptTV(this)); + } + String typeName = ASPStringConverter.toConstant(refType.getName()); + ASPStatement stmt = makeStatement(ASPRule.ASP_TYPE.toString(), pointer, typeName, convertParameterlist(params)); + writer.add(stmt); + return pointer; + } + + @Override + public String visit(SuperWildcardType superWildcardType) { + throw new NotImplementedException(); + } + + @Override + public String visit(TypePlaceholder typePlaceholder) { + String name = ASPStringConverter.toConstant(typePlaceholder.getName()); + ASPStatement stmt = makeStatement(ASPRule.ASP_TYPE_VAR.toString(), name); + return name; + } + + @Override + public String visit(ExtendsWildcardType extendsWildcardType) { + throw new NotImplementedException(); + } + + @Override + public String visit(GenericRefType genericRefType) { + throw new NotImplementedException(); } } From 095f9a79561603d71c54b1a82aee94659dc02630 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 7 Mar 2018 22:41:00 +0100 Subject: [PATCH 35/65] Tests an neue ASPFactory anpassen --- .../dhbwstuttgart/sat/asp/writer/ASPFactory.java | 15 ++++++++++----- .../sat/asp/writer/ASPGenerator.java | 6 +++--- test/asp/ClingoTest.java | 3 ++- test/asp/UnifyWithoutWildcards.java | 6 ++++-- test/asp/typeinference/ASPTest.java | 5 +++-- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java index 30c06169..ab6ef51b 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java @@ -22,26 +22,29 @@ import java.util.*; public class ASPFactory implements TypeVisitor{ - public String generateASP(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException{ + public static String generateASP(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException{ ASPFactory factory = new ASPFactory(); - convertFC(fcClasses); + factory.convertFC(fcClasses); List> constraints1 = constraints.cartesianProduct().iterator().next(); for(Constraint constraint : constraints1){ for(Pair p : constraint){ - convertPair(p); + factory.convertPair(p); } } - return writer.getASPFile(); + return factory.writer.getASPFile(); } ASPWriter writer = new ASPWriter(); + boolean isFCType = false; private void convertFC(Collection classes) throws ClassNotFoundException { Set fc = FCGenerator.toFC(classes); + isFCType = true; for(Pair fcp : fc){ convertPair(fcp); } + isFCType = false; } private void convertPair(Pair p){ @@ -96,7 +99,8 @@ public class ASPFactory implements TypeVisitor{ params.add(param.acceptTV(this)); } String typeName = ASPStringConverter.toConstant(refType.getName()); - ASPStatement stmt = makeStatement(ASPRule.ASP_TYPE.toString(), pointer, typeName, convertParameterlist(params)); + String ruleName = isFCType?ASPRule.ASP_TYPE.toString():ASPRule.ASP_FCTYPE.toString(); + ASPStatement stmt = makeStatement(ruleName, pointer, typeName, convertParameterlist(params)); writer.add(stmt); return pointer; } @@ -110,6 +114,7 @@ public class ASPFactory implements TypeVisitor{ public String visit(TypePlaceholder typePlaceholder) { String name = ASPStringConverter.toConstant(typePlaceholder.getName()); ASPStatement stmt = makeStatement(ASPRule.ASP_TYPE_VAR.toString(), name); + writer.add(stmt); return name; } diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java index 3f999a41..a3752fcc 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java @@ -17,8 +17,7 @@ import java.util.List; public class ASPGenerator { ASPWriter writer = new ASPWriter(); - private final String asp; - +/* public ASPGenerator(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException { List> constraints1 = constraints.cartesianProduct().iterator().next(); List constraintPairs = new ArrayList<>(); @@ -27,9 +26,10 @@ public class ASPGenerator { } asp = toASP(constraintPairs, FCGenerator.toFC(fcClasses)); } + */ public String getASP(){ - return asp; + return ""; } private String toASP(List constraintSet, Collection fc){ diff --git a/test/asp/ClingoTest.java b/test/asp/ClingoTest.java index f47b644c..248cf5a2 100644 --- a/test/asp/ClingoTest.java +++ b/test/asp/ClingoTest.java @@ -2,6 +2,7 @@ package asp; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.sat.asp.parser.ASPParser; +import de.dhbwstuttgart.sat.asp.writer.ASPFactory; import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.sat.asp.Clingo; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; @@ -25,7 +26,7 @@ public class ClingoTest { @Test public void test() throws IOException, InterruptedException, ClassNotFoundException { String content = ""; - content = new ASPGenerator(this.getPairs(), this.getFC()).getASP(); + content = ASPFactory.generateASP(this.getPairs(), this.getFC()); PrintWriter writer = new PrintWriter(tempDirectory + "test.lp", "UTF-8"); writer.println(content); diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index 998ec56c..cb414f6c 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -4,6 +4,7 @@ import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.sat.asp.Clingo; import de.dhbwstuttgart.sat.asp.parser.ASPParser; +import de.dhbwstuttgart.sat.asp.writer.ASPFactory; import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; @@ -32,12 +33,13 @@ public class UnifyWithoutWildcards { RefType t2 = new RefType(new JavaClassName("Vector"), list, new NullToken()); testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); ResultSet resultSet = run(testSet); - System.out.println(resultSet); + System.out.println(resultSet.results); + assert resultSet.results.size() > 0; } public ResultSet run(ConstraintSet toTest) throws IOException, InterruptedException, ClassNotFoundException { String content = ""; - content = new ASPGenerator(toTest, this.getFC()).getASP(); + content = ASPFactory.generateASP(toTest, this.getFC()); PrintWriter writer = new PrintWriter(tempDirectory + "test.lp", "UTF-8"); writer.println(content); diff --git a/test/asp/typeinference/ASPTest.java b/test/asp/typeinference/ASPTest.java index cea141f9..112d2023 100644 --- a/test/asp/typeinference/ASPTest.java +++ b/test/asp/typeinference/ASPTest.java @@ -1,6 +1,7 @@ package asp.typeinference; import de.dhbwstuttgart.core.JavaTXCompiler; +import de.dhbwstuttgart.sat.asp.writer.ASPFactory; import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.SourceFile; @@ -55,8 +56,8 @@ public class ASPTest { } final ConstraintSet cons = compiler.getConstraints(); - ASPGenerator generator = new ASPGenerator(cons, allClasses); - System.out.println(generator.getASP()); + String asp = ASPFactory.generateASP(cons, allClasses); + System.out.println(asp); } static String readFile(String path, Charset encoding) From e8388e2748a74ae66ace9805fe6329cc0bef3166 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 7 Mar 2018 22:42:05 +0100 Subject: [PATCH 36/65] =?UTF-8?q?Aufr=C3=A4umen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sat/asp/writer/ASPFactory.java | 6 - .../sat/asp/writer/ASPGenerator.java | 104 ------------------ .../asp/writer/{model => }/ASPStatement.java | 2 +- .../sat/asp/writer/ASPWriter.java | 2 - .../sat/asp/writer/model/ASPFCType.java | 14 --- .../sat/asp/writer/model/ASPGenericType.java | 25 ----- .../sat/asp/writer/model/ASPPair.java | 24 ---- .../sat/asp/writer/model/ASPPairEquals.java | 15 --- .../sat/asp/writer/model/ASPPairSmaller.java | 17 --- .../asp/writer/model/ASPPairSmallerDot.java | 15 --- .../asp/writer/model/ASPParameterList.java | 45 -------- .../sat/asp/writer/model/ASPRefType.java | 26 ----- .../sat/asp/writer/model/ASPType.java | 5 - .../sat/asp/writer/model/ASPTypeVar.java | 27 ----- 14 files changed, 1 insertion(+), 326 deletions(-) delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java rename src/de/dhbwstuttgart/sat/asp/writer/{model => }/ASPStatement.java (91%) delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java delete mode 100644 src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java index ab6ef51b..8afce74c 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java @@ -4,18 +4,12 @@ import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; import de.dhbwstuttgart.sat.asp.ASPStringConverter; import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.model.ASPStatement; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.factory.NameGenerator; -import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory; import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.typeinference.constraints.Constraint; import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; import de.dhbwstuttgart.typeinference.constraints.Pair; -import de.dhbwstuttgart.typeinference.result.PairTPHEqualTPH; -import de.dhbwstuttgart.typeinference.result.PairTPHequalRefTypeOrWildcardType; -import de.dhbwstuttgart.typeinference.result.PairTPHsmallerTPH; -import de.dhbwstuttgart.typeinference.result.ResultSetVisitor; import de.dhbwstuttgart.typeinference.unify.model.PairOperator; import java.util.*; diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java deleted file mode 100644 index a3752fcc..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGenerator.java +++ /dev/null @@ -1,104 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer; - -import de.dhbwstuttgart.exceptions.NotImplementedException; -import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; -import de.dhbwstuttgart.sat.asp.ASPStringConverter; -import de.dhbwstuttgart.sat.asp.writer.model.*; -import de.dhbwstuttgart.syntaxtree.ClassOrInterface; -import de.dhbwstuttgart.syntaxtree.GenericTypeVar; -import de.dhbwstuttgart.syntaxtree.type.*; -import de.dhbwstuttgart.typeinference.constraints.Constraint; -import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; -import de.dhbwstuttgart.typeinference.constraints.Pair; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class ASPGenerator { - ASPWriter writer = new ASPWriter(); -/* - public ASPGenerator(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException { - List> constraints1 = constraints.cartesianProduct().iterator().next(); - List constraintPairs = new ArrayList<>(); - for(Constraint constraint : constraints1){ - constraintPairs.addAll(constraint); - } - asp = toASP(constraintPairs, FCGenerator.toFC(fcClasses)); - } - */ - - public String getASP(){ - return ""; - } - - private String toASP(List constraintSet, Collection fc){ - TypeConverter converter = new TypeConverter(); - for(Pair fcp : fc){ - //Wenn dieser Cast fehlschlägt stimmt etwas nicht. Alle Paare in der FC müssen smaller Operatoren haen - convert(fcp); - } - for(Pair cons : constraintSet){ - convert(cons); - } - - return writer.getASPFile(); - } - - private ASPPair convert(Pair pair){ - TypeConverter converter = new TypeConverter(); - ASPType ls = pair.TA1.acceptTV(converter); - ASPType rs = pair.TA2.acceptTV(converter); - if(pair.OperatorEqual()){ - return new ASPPairEquals(ls, rs,writer); - }else if(pair.OperatorSmallerDot()){ - return new ASPPairSmallerDot(ls, rs, writer); - }else if(pair.OperatorSmaller()){ - //Diese Cast müssen auch immer funktionieren, da in smaller Constraints nur RefTypes vorkommen - return new ASPPairSmaller(new ASPFCType((ASPRefType) ls), new ASPFCType((ASPRefType) rs), writer); - }else throw new NotImplementedException(); - } - - private ASPRefType convert(ClassOrInterface cl){ - List paramList = new ArrayList<>(); - for(GenericTypeVar gtv : cl.getGenerics()){ - paramList.add(new ASPGenericType(ASPStringConverter.toConstant(gtv.getName()))); - } - ASPParameterList params = new ASPParameterList(paramList, writer); - return new ASPRefType(ASPStringConverter.toConstant(cl.getClassName()), params); - } - - private class TypeConverter implements TypeVisitor{ - - @Override - public ASPType visit(RefType type) { - List paramList = new ArrayList<>(); - for(RefTypeOrTPHOrWildcardOrGeneric gtv : type.getParaList()){ - paramList.add(gtv.acceptTV(this)); - } - ASPParameterList params = new ASPParameterList(paramList, writer); - return new ASPRefType(ASPStringConverter.toConstant(type.getName()), params); - } - - @Override - public ASPType visit(SuperWildcardType superWildcardType) { - throw new NotImplementedException(); - } - - @Override - public ASPType visit(TypePlaceholder typePlaceholder) { - return new ASPTypeVar(ASPStringConverter.toConstant(typePlaceholder.getName()),writer); - } - - @Override - public ASPType visit(ExtendsWildcardType extendsWildcardType) { - throw new NotImplementedException(); - } - - @Override - public ASPType visit(GenericRefType genericRefType) { - return new ASPRefType(ASPStringConverter.toConstant(genericRefType.getParsedName()), - new ASPParameterList(new ArrayList<>(), writer)); - } - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPStatement.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPStatement.java similarity index 91% rename from src/de/dhbwstuttgart/sat/asp/writer/model/ASPStatement.java rename to src/de/dhbwstuttgart/sat/asp/writer/ASPStatement.java index 76bb63e8..8d342464 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPStatement.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPStatement.java @@ -1,4 +1,4 @@ -package de.dhbwstuttgart.sat.asp.writer.model; +package de.dhbwstuttgart.sat.asp.writer; public class ASPStatement { private final String stmt; diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java index 450950d9..e5e60882 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java @@ -1,7 +1,5 @@ package de.dhbwstuttgart.sat.asp.writer; -import de.dhbwstuttgart.sat.asp.writer.model.ASPStatement; - import java.util.HashSet; public class ASPWriter { diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java deleted file mode 100644 index 790fd5af..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPFCType.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; - -public class ASPFCType extends ASPRefType { - public ASPFCType(ASPRefType refType){ - super(refType.name, refType.params); - } - - public String toString(){ - return ASPRule.ASP_FCTYPE + "(" + name +"," + params.name + ")"; - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java deleted file mode 100644 index 327ce04a..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPGenericType.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; - -public class ASPGenericType implements ASPType{ - private final String name; - - public ASPGenericType(String name){ - this.name = name; - } - - public String toString(){ - return ASPRule.ASP_GENERIC_TYPE_NAME + "(" + name + ")"; - } - - private String toASP() { - return ASPRule.ASP_GENERIC_TYPE_NAME + "(" + name + ")"; - } - - @Override - public String getPointer() { - return name; - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java deleted file mode 100644 index e881f346..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPair.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; - -public abstract class ASPPair { - public final ASPType leftSide; - public final ASPType rightSide; - - public ASPPair(ASPType ls, ASPType rs, ASPWriter writer){ - this.leftSide = ls; - this.rightSide = rs; - writer.add(new ASPStatement(toASP())); - } - - private String toASP(){ - return this.getRuleName() + "(" + leftSide.getPointer() + ","+ rightSide.getPointer() + ")"; - } - - public String toString(){ - return toASP(); - } - - protected abstract String getRuleName(); -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java deleted file mode 100644 index bf6e2485..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairEquals.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; - -public class ASPPairEquals extends ASPPair{ - public ASPPairEquals(ASPType ls, ASPType rs, ASPWriter writer){ - super(ls, rs, writer); - } - - @Override - protected String getRuleName() { - return ASPRule.ASP_PAIR_EQUALS_NAME.toString(); - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java deleted file mode 100644 index 610e5c56..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmaller.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; - -import java.util.Map; - -public class ASPPairSmaller extends ASPPair{ - public ASPPairSmaller(ASPFCType ls, ASPFCType rs, ASPWriter writer){ - super(ls, rs, writer); - } - - @Override - protected String getRuleName() { - return ASPRule.ASP_PAIR_SMALLER_NAME.toString(); - } -} \ No newline at end of file diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java deleted file mode 100644 index b572ed99..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPPairSmallerDot.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; - -public class ASPPairSmallerDot extends ASPPair{ - public ASPPairSmallerDot(ASPType ls, ASPType rs, ASPWriter writer){ - super(ls, rs, writer); - } - - @Override - protected String getRuleName() { - return ASPRule.ASP_PAIR_SMALLER_DOT_NAME.toString(); - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java deleted file mode 100644 index fafa50f5..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPParameterList.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.ASPStringConverter; -import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; -import de.dhbwstuttgart.syntaxtree.factory.NameGenerator; - -import java.util.Iterator; -import java.util.List; - -public class ASPParameterList { - public final String name; - private final List types; - - public ASPParameterList(List types, ASPWriter writer){ - int paramNum = 0; - this.types = types; - if(types.size() == 0){ - name = ASPRule.ASP_PARAMLIST_END_POINTER.toString(); - }else{ - name = newName(); - String nextPointer = name; - Iterator it = types.iterator(); - while(it.hasNext()){ - ASPType t = it.next(); - String param = nextPointer + "," + t.toString() + ","; - nextPointer = newName(); - if(! it.hasNext())nextPointer = ASPRule.ASP_PARAMLIST_END_POINTER.toString(); - param += nextPointer; - writer.add(new ASPStatement(ASPRule.ASP_PARAMLIST_NAME + "(" + param + ")")); - writer.add(new ASPStatement(ASPRule.ASP_PARAMLISTNUMERATION_NAME + "(" + name + "," + t.getPointer() + "," + paramNum + ")")); - paramNum++; - } - } - } - - private String newName() { - return ASPStringConverter.toConstant(NameGenerator.makeNewName()); - } - - public String toString(){ - return name; - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java deleted file mode 100644 index 46a4d1c7..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPRefType.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.model.ASPRule; - -public class ASPRefType implements ASPType { - protected final ASPParameterList params; - protected final String name; - - public ASPRefType(String name, ASPParameterList params){ - this.name = name; - this.params = params; - } - - public ASPParameterList getParams() { - return params; - } - - public String toString(){ - return ASPRule.ASP_TYPE + "(" + name +"," + params.name + ")"; - } - - @Override - public String getPointer() { - return name; - } -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java deleted file mode 100644 index 201e36ad..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPType.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -public interface ASPType { - String getPointer(); -} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java b/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java deleted file mode 100644 index e10a88bf..00000000 --- a/src/de/dhbwstuttgart/sat/asp/writer/model/ASPTypeVar.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.dhbwstuttgart.sat.asp.writer.model; - -import de.dhbwstuttgart.sat.asp.model.ASPRule; -import de.dhbwstuttgart.sat.asp.writer.ASPWriter; - -public class ASPTypeVar implements ASPType{ - private final String name; - - public ASPTypeVar(String name, ASPWriter writer){ - this.name = name; - writer.add(new ASPStatement(this.toASP())); - } - - @Override - public String toString() { - return toASP(); - } - - private String toASP() { - return ASPRule.ASP_TYPE_VAR+"("+ name +")"; - } - - @Override - public String getPointer() { - return name; - } -} From 87cf6743528a6ae64e25a3cc0fb85dddce460b38 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 7 Mar 2018 23:07:53 +0100 Subject: [PATCH 37/65] Fehler in FCGenerator beheben --- .../parser/SyntaxTreeGenerator/FCGenerator.java | 5 +++-- test/asp/UnifyWithoutWildcards.java | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 24abec67..66cfb764 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -51,8 +51,9 @@ public class FCGenerator { //Generics mit gleichem Namen müssen den selben TPH bekommen for(GenericTypeVar gtv : forType.getGenerics()){ if(!gtvs.containsKey(gtv.getName())){ - gtvs.put(gtv.getName(), TypePlaceholder.fresh(new NullToken())); - newGTVs.put(gtv.getName(), TypePlaceholder.fresh(new NullToken())); + TypePlaceholder replacePlaceholder = TypePlaceholder.fresh(new NullToken()); + gtvs.put(gtv.getName(), replacePlaceholder); + newGTVs.put(gtv.getName(), replacePlaceholder); } params.add(gtvs.get(gtv.getName())); } diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index cb414f6c..2bf74d66 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -5,7 +5,6 @@ import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.sat.asp.Clingo; import de.dhbwstuttgart.sat.asp.parser.ASPParser; import de.dhbwstuttgart.sat.asp.writer.ASPFactory; -import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; import de.dhbwstuttgart.syntaxtree.type.*; From 9f2702276f5314fcad04da1073f6fa0fa8428d3d Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Thu, 8 Mar 2018 00:03:26 +0100 Subject: [PATCH 38/65] Fehler beheben --- src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java | 5 ++++- test/asp/UnifyWithoutWildcards.java | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java index 8afce74c..1777eabd 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPFactory.java @@ -69,6 +69,9 @@ public class ASPFactory implements TypeVisitor{ String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); Iterator it = pointers.iterator(); String p = pointer; + if(!it.hasNext()){ + return ASPRule.ASP_PARAMLIST_END_POINTER.toString(); + } while (it.hasNext()){ ASPStatement stmt; String type = it.next(); @@ -93,7 +96,7 @@ public class ASPFactory implements TypeVisitor{ params.add(param.acceptTV(this)); } String typeName = ASPStringConverter.toConstant(refType.getName()); - String ruleName = isFCType?ASPRule.ASP_TYPE.toString():ASPRule.ASP_FCTYPE.toString(); + String ruleName = isFCType?ASPRule.ASP_FCTYPE.toString():ASPRule.ASP_TYPE.toString(); ASPStatement stmt = makeStatement(ruleName, pointer, typeName, convertParameterlist(params)); writer.add(stmt); return pointer; diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index 2bf74d66..e1afc3c8 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -27,9 +27,10 @@ public class UnifyWithoutWildcards { @Test public void adapt() throws InterruptedException, IOException, ClassNotFoundException { ConstraintSet testSet = new ConstraintSet<>(); - List list = Arrays.asList(TypePlaceholder.fresh(new NullToken())); - RefType t1 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Matrix"), new NullToken()); - RefType t2 = new RefType(new JavaClassName("Vector"), list, new NullToken()); + List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + List list2 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + RefType t1 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Matrix"), list1, new NullToken()); + RefType t2 = new RefType(new JavaClassName("Vector"), list2, new NullToken()); testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); ResultSet resultSet = run(testSet); System.out.println(resultSet.results); From 3deaceec011318c17354d8236ff5e7500c2c6640 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Thu, 8 Mar 2018 01:41:38 +0100 Subject: [PATCH 39/65] =?UTF-8?q?UnifyWithoutWildcards=20Test=20l=C3=A4uft?= =?UTF-8?q?=20durch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java | 8 ++++---- test/asp/UnifyWithoutWildcards.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java index b3534f47..1de833d6 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java @@ -1,15 +1,12 @@ package de.dhbwstuttgart.sat.asp.parser; import de.dhbwstuttgart.exceptions.DebugException; +import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.sat.asp.ASPStringConverter; import de.dhbwstuttgart.sat.asp.model.ASPRule; import de.dhbwstuttgart.sat.asp.parser.model.ParsedType; -import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; -import de.dhbwstuttgart.sat.asp.writer.model.ASPParameterList; -import de.dhbwstuttgart.sat.asp.writer.model.ASPRefType; -import de.dhbwstuttgart.sat.asp.writer.model.ASPType; import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.typeinference.result.*; @@ -98,6 +95,9 @@ public class ASPParser { RefTypeOrTPHOrWildcardOrGeneric rsType = this.getType(rs); if(lsType instanceof TypePlaceholder && rsType instanceof RefType) return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder) lsType, rsType); + else if(lsType instanceof TypePlaceholder && rsType instanceof TypePlaceholder) + return new PairTPHEqualTPH((TypePlaceholder)lsType, (TypePlaceholder)rsType); + else throw new NotImplementedException(); } return null; } diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index e1afc3c8..1b33cbd5 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -27,10 +27,10 @@ public class UnifyWithoutWildcards { @Test public void adapt() throws InterruptedException, IOException, ClassNotFoundException { ConstraintSet testSet = new ConstraintSet<>(); - List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken()),TypePlaceholder.fresh(new NullToken())); List list2 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); RefType t1 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Matrix"), list1, new NullToken()); - RefType t2 = new RefType(new JavaClassName("Vector"), list2, new NullToken()); + RefType t2 = new RefType(new JavaClassName("java.util.HashMap"), list2, new NullToken()); testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); ResultSet resultSet = run(testSet); System.out.println(resultSet.results); From 83aaff140c67b1b750885c6a38fa54890ae2d15b Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Thu, 8 Mar 2018 01:44:40 +0100 Subject: [PATCH 40/65] =?UTF-8?q?Aufr=C3=A4umen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java | 4 ++++ test/asp/ClingoTest.java | 1 - test/asp/typeinference/ASPTest.java | 1 - 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java index 1de833d6..75acfe90 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java @@ -158,6 +158,9 @@ public class ASPParser { } private void parseType(String statement){ + //TODO: Diese Regel muss 3 Parameter parsen (TypPointer, TypName, ParameterlistenPointer) + throw new NotImplementedException(); + /* Pattern p = Pattern.compile(ASPRule.ASP_TYPE+"\\(([^,]+),([^,]+)\\)"); Matcher m = p.matcher(statement); boolean b = m.matches(); @@ -168,6 +171,7 @@ public class ASPParser { List params = this.getParams(rs); this.types.put(ls,new ParsedType(ls, params)); } + */ } private List getParams(String pointer) { diff --git a/test/asp/ClingoTest.java b/test/asp/ClingoTest.java index 248cf5a2..90635bde 100644 --- a/test/asp/ClingoTest.java +++ b/test/asp/ClingoTest.java @@ -3,7 +3,6 @@ package asp; import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.sat.asp.parser.ASPParser; import de.dhbwstuttgart.sat.asp.writer.ASPFactory; -import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.sat.asp.Clingo; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; diff --git a/test/asp/typeinference/ASPTest.java b/test/asp/typeinference/ASPTest.java index 112d2023..632d288e 100644 --- a/test/asp/typeinference/ASPTest.java +++ b/test/asp/typeinference/ASPTest.java @@ -2,7 +2,6 @@ package asp.typeinference; import de.dhbwstuttgart.core.JavaTXCompiler; import de.dhbwstuttgart.sat.asp.writer.ASPFactory; -import de.dhbwstuttgart.sat.asp.writer.ASPGenerator; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.SourceFile; import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; From dff72b0c97d7a59382cfb046ea00a4a5d972d151 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Mon, 12 Mar 2018 00:38:02 +0100 Subject: [PATCH 41/65] ResultSetOutputGenerator --- .../sat/asp/parser/ASPParser.java | 21 ++++++------ .../visual/ResultSetOutputGenerator.java | 34 +++++++++++++++++++ .../syntaxtree/visual/ResultSetPrinter.java | 20 +++++++++++ test/asp/UnifyWithoutWildcards.java | 3 +- 4 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 src/de/dhbwstuttgart/syntaxtree/visual/ResultSetOutputGenerator.java create mode 100644 src/de/dhbwstuttgart/syntaxtree/visual/ResultSetPrinter.java diff --git a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java index 75acfe90..9aa86891 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java @@ -130,6 +130,7 @@ public class ASPParser { } } private void parseParameter(String statement){ + //param(pointer, typ, nextPointer Pattern p = Pattern.compile(ASPRule.ASP_PARAMLIST_NAME+"\\(([^,]+),([^,]+),([^,]+)\\)"); Matcher m = p.matcher(statement); boolean b = m.matches(); @@ -137,7 +138,7 @@ public class ASPParser { if(m.groupCount()<3)throw new DebugException("Fehler in Regex"); String pointer = m.group(1); String type = m.group(2); - String next = m.group(2); + String next = m.group(3); if(next.equals(ASPRule.ASP_PARAMLIST_END_POINTER.toString()))next = null; if(this.parameterLists.containsKey(pointer)){ throw new DebugException("Fehler in Ergebnisparsen"); @@ -158,20 +159,18 @@ public class ASPParser { } private void parseType(String statement){ - //TODO: Diese Regel muss 3 Parameter parsen (TypPointer, TypName, ParameterlistenPointer) - throw new NotImplementedException(); - /* - Pattern p = Pattern.compile(ASPRule.ASP_TYPE+"\\(([^,]+),([^,]+)\\)"); + //Diese Regel muss 3 Parameter parsen (TypPointer, TypName, ParameterlistenPointer) + Pattern p = Pattern.compile(ASPRule.ASP_TYPE+"\\(([^,]+),([^,]+),([^,]+)\\)"); Matcher m = p.matcher(statement); boolean b = m.matches(); if(b){ - if(m.groupCount()<2)throw new DebugException("Fehler in Regex"); - String ls = m.group(1); - String rs = m.group(2); - List params = this.getParams(rs); - this.types.put(ls,new ParsedType(ls, params)); + if(m.groupCount()<3)throw new DebugException("Fehler in Regex"); + String pointer = m.group(1); + String name = m.group(2); + String paraList = m.group(3); + List params = this.getParams(paraList); + this.types.put(pointer,new ParsedType(name, params)); } - */ } private List getParams(String pointer) { diff --git a/src/de/dhbwstuttgart/syntaxtree/visual/ResultSetOutputGenerator.java b/src/de/dhbwstuttgart/syntaxtree/visual/ResultSetOutputGenerator.java new file mode 100644 index 00000000..f50b05a6 --- /dev/null +++ b/src/de/dhbwstuttgart/syntaxtree/visual/ResultSetOutputGenerator.java @@ -0,0 +1,34 @@ +package de.dhbwstuttgart.syntaxtree.visual; + +import de.dhbwstuttgart.syntaxtree.type.*; +import de.dhbwstuttgart.typeinference.result.*; + +public class ResultSetOutputGenerator extends OutputGenerator implements ResultSetVisitor{ + + public ResultSetOutputGenerator(StringBuilder out) { + super(out); + } + + @Override + public void visit(PairTPHsmallerTPH p) { + print(p, "<"); + } + + @Override + public void visit(PairTPHequalRefTypeOrWildcardType p) { + print(p, "=."); + } + + @Override + public void visit(PairTPHEqualTPH p) { + print(p, "=."); + } + + private void print(ResultPair p , String operator){ + out.append("("); + p.getLeft().accept((ResultSetVisitor) this); + out.append(" "+operator+" "); + p.getRight().accept((ResultSetVisitor) this); + out.append(")"); + } +} diff --git a/src/de/dhbwstuttgart/syntaxtree/visual/ResultSetPrinter.java b/src/de/dhbwstuttgart/syntaxtree/visual/ResultSetPrinter.java new file mode 100644 index 00000000..fc67a723 --- /dev/null +++ b/src/de/dhbwstuttgart/syntaxtree/visual/ResultSetPrinter.java @@ -0,0 +1,20 @@ +package de.dhbwstuttgart.syntaxtree.visual; + +import de.dhbwstuttgart.syntaxtree.SourceFile; +import de.dhbwstuttgart.typeinference.result.ResultPair; +import de.dhbwstuttgart.typeinference.result.ResultSet; + +import java.util.Set; + +public class ResultSetPrinter { + + public static String print(ResultSet toPrint){ + StringBuilder output = new StringBuilder(); + for(ResultPair p : toPrint.results){ + p.accept(new ResultSetOutputGenerator(output)); + output.append("\n"); + } + return output.toString(); + } + +} diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index 1b33cbd5..eadca649 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -8,6 +8,7 @@ import de.dhbwstuttgart.sat.asp.writer.ASPFactory; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; import de.dhbwstuttgart.syntaxtree.type.*; +import de.dhbwstuttgart.syntaxtree.visual.ResultSetPrinter; import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; import de.dhbwstuttgart.typeinference.constraints.Pair; import de.dhbwstuttgart.typeinference.result.ResultSet; @@ -33,7 +34,7 @@ public class UnifyWithoutWildcards { RefType t2 = new RefType(new JavaClassName("java.util.HashMap"), list2, new NullToken()); testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); ResultSet resultSet = run(testSet); - System.out.println(resultSet.results); + System.out.println(ResultSetPrinter.print(resultSet)); assert resultSet.results.size() > 0; } From 123f94aea75f80592f8bef947ff6e49912b045c4 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 13 Mar 2018 00:24:40 +0100 Subject: [PATCH 42/65] =?UTF-8?q?ANTLR=20Parser=20f=C3=BCr=20ASP=20Stateme?= =?UTF-8?q?nts=20implementieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 15 + src/de/dhbwstuttgart/sat/asp/Clingo.java | 3 +- .../sat/asp/parser/ASPParser.java | 62 +- .../sat/asp/parser/antlr/UnifyResult.g4 | 37 + .../sat/asp/parser/antlr/UnifyResult.tokens | 23 + .../parser/antlr/UnifyResultBaseListener.java | 159 +++++ .../asp/parser/antlr/UnifyResultLexer.java | 134 ++++ .../asp/parser/antlr/UnifyResultLexer.tokens | 23 + .../asp/parser/antlr/UnifyResultListener.java | 110 +++ .../asp/parser/antlr/UnifyResultParser.java | 639 ++++++++++++++++++ test/asp/UnifyWithoutWildcards.java | 4 +- 11 files changed, 1205 insertions(+), 4 deletions(-) create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.g4 create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.tokens create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultBaseListener.java create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.java create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.tokens create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultListener.java create mode 100644 src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultParser.java diff --git a/pom.xml b/pom.xml index ea7be6b3..ae0f670a 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,22 @@ de.dhbwstuttgart.parser.antlr + + + aspParser + + antlr4 + + + src/de/dhbwstuttgart/sat/asp/parser/antlr/ + src/de/dhbwstuttgart/sat/asp/parser/antlr/ + + -package + de.dhbwstuttgart.sat.asp.parser.antlr + + + diff --git a/src/de/dhbwstuttgart/sat/asp/Clingo.java b/src/de/dhbwstuttgart/sat/asp/Clingo.java index e0f29cb1..9f529bbe 100644 --- a/src/de/dhbwstuttgart/sat/asp/Clingo.java +++ b/src/de/dhbwstuttgart/sat/asp/Clingo.java @@ -36,7 +36,8 @@ public class Clingo { "/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/clingo-5.2.1-linux-x86_64/clingo"; List commands = new ArrayList<>(); commands.add(pathToClingo); - commands.add("--outf=2"); //use JSON-Output + //commands.add("--outf=2"); //use JSON-Output + commands.add("--outf=1"); //use JSON-Output for(File file : input){ commands.add(file.getPath()); } diff --git a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java index 9aa86891..cfb59933 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java @@ -6,9 +6,17 @@ import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.scope.JavaClassName; import de.dhbwstuttgart.sat.asp.ASPStringConverter; import de.dhbwstuttgart.sat.asp.model.ASPRule; +import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultBaseListener; +import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultLexer; +import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultListener; +import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultParser; import de.dhbwstuttgart.sat.asp.parser.model.ParsedType; import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.typeinference.result.*; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.tree.ParseTreeWalker; import javax.json.Json; import javax.json.JsonArray; @@ -17,6 +25,7 @@ import java.io.StringReader; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * Ablauf: @@ -26,7 +35,7 @@ import java.util.regex.Pattern; * TODO: Ãœberlegen welche Informationen noch nach der Unifizierung gebraucht werden * -> Eigentlich nur die korrekten Namen der Typen und TPHs */ -public class ASPParser { +public class ASPParser extends UnifyResultBaseListener { private final Collection originalTPHs; private ResultSet resultSet; private Map types = new HashMap<>(); @@ -42,7 +51,58 @@ public class ASPParser { return new ASPParser(toParse, oldPlaceholders).resultSet; } + @Override + public void enterParameter(UnifyResultParser.ParameterContext ctx) { + } + @Override + public void enterEquals(UnifyResultParser.EqualsContext ctx) { + List parameterList = ctx.parameterList().value().stream().map(v -> v.getText()).collect(Collectors.toList()); + if(parameterList.size()<2)throw new DebugException("Fehler in Regex"); + String ls = parameterList.get(0); + String rs = parameterList.get(1); + /* + RefTypeOrTPHOrWildcardOrGeneric lsType = this.getType(ls); + RefTypeOrTPHOrWildcardOrGeneric rsType = this.getType(rs); + if(lsType instanceof TypePlaceholder && rsType instanceof RefType) + return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder) lsType, rsType); + else if(lsType instanceof TypePlaceholder && rsType instanceof TypePlaceholder) + return new PairTPHEqualTPH((TypePlaceholder)lsType, (TypePlaceholder)rsType); + else throw new NotImplementedException(); + */ + } + + @Override + public void enterSmaller(UnifyResultParser.SmallerContext ctx) { + } + + @Override + public void enterTypeVar(UnifyResultParser.TypeVarContext ctx) { + } + + @Override + public void enterType(UnifyResultParser.TypeContext ctx) { + super.enterType(ctx); + } + + /* + private List parsedRule; + private List parseRule(String rule){ + UnifyResultLexer lexer = new UnifyResultLexer(CharStreams.fromString(rule)); + UnifyResultParser.AspruleContext parseTree = new UnifyResultParser(new CommonTokenStream(lexer)).asprule(); + parsedRule = new ArrayList<>(); + new ParseTreeWalker().walk(this, parseTree); + return parsedRule; + } + + @Override + public void enterAsprule(UnifyResultParser.AspruleContext ctx) { + super.enterAsprule(ctx); + for(int i = 0; i< ctx.getChildCount();i++){ + parsedRule.add(ctx.getChild(i).getText()); + } + } + */ private ASPParser(String toParse, Collection oldPlaceholders){ this.originalTPHs = oldPlaceholders; JsonObject jsonResult = Json.createReader(new StringReader(toParse)).readObject(); diff --git a/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.g4 b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.g4 new file mode 100644 index 00000000..98b6a5fb --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.g4 @@ -0,0 +1,37 @@ +grammar UnifyResult; + +answer : 'ANSWER' (resultSetRule '.')*; + +resultSetRule : + parameter + | equals + | smaller + | typeVar + | type + | otherRule + ; + +parameterList : '(' value (',' value)* ')'; +value : NAME + | resultSetRule ; + +parameter : PARAMLIST_NAME parameterList; +equals : EQUALS_NAME parameterList; +smaller : SMALLER_NAME parameterList; +typeVar : TYPEVAR_NAME parameterList; +type : TYPE_NAME parameterList; +otherRule : NAME parameterList; + +//TODO: Es sollte Regeln für das Result set geben, welche sich nicht mit den anderen überdecken, dann auch nur diese im Result ausgeben +PARAMLIST_NAME : 'param'; +EQUALS_NAME : 'equals'; +SMALLER_NAME : 'smaller'; +TYPEVAR_NAME : 'typeVar'; +TYPE_NAME : 'type'; +NAME : [a-zA-Z0-9_]+; + +WS : [ \t\r\n\u000C]+ -> skip + ; +LINE_COMMENT + : '%' ~[\r\n]* -> skip + ; diff --git a/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.tokens b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.tokens new file mode 100644 index 00000000..8f9c0e0a --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResult.tokens @@ -0,0 +1,23 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +PARAMLIST_NAME=6 +EQUALS_NAME=7 +SMALLER_NAME=8 +TYPEVAR_NAME=9 +TYPE_NAME=10 +NAME=11 +WS=12 +LINE_COMMENT=13 +'ANSWER'=1 +'.'=2 +'('=3 +','=4 +')'=5 +'param'=6 +'equals'=7 +'smaller'=8 +'typeVar'=9 +'type'=10 diff --git a/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultBaseListener.java b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultBaseListener.java new file mode 100644 index 00000000..f33525d7 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultBaseListener.java @@ -0,0 +1,159 @@ +// Generated from UnifyResult.g4 by ANTLR 4.7 +package de.dhbwstuttgart.sat.asp.parser.antlr; + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link UnifyResultListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +public class UnifyResultBaseListener implements UnifyResultListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnswer(UnifyResultParser.AnswerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnswer(UnifyResultParser.AnswerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResultSetRule(UnifyResultParser.ResultSetRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResultSetRule(UnifyResultParser.ResultSetRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParameterList(UnifyResultParser.ParameterListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParameterList(UnifyResultParser.ParameterListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterValue(UnifyResultParser.ValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitValue(UnifyResultParser.ValueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParameter(UnifyResultParser.ParameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParameter(UnifyResultParser.ParameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEquals(UnifyResultParser.EqualsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEquals(UnifyResultParser.EqualsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSmaller(UnifyResultParser.SmallerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSmaller(UnifyResultParser.SmallerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTypeVar(UnifyResultParser.TypeVarContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTypeVar(UnifyResultParser.TypeVarContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType(UnifyResultParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType(UnifyResultParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOtherRule(UnifyResultParser.OtherRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOtherRule(UnifyResultParser.OtherRuleContext ctx) { } + + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.java b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.java new file mode 100644 index 00000000..b8660eba --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.java @@ -0,0 +1,134 @@ +// Generated from UnifyResult.g4 by ANTLR 4.7 +package de.dhbwstuttgart.sat.asp.parser.antlr; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class UnifyResultLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, PARAMLIST_NAME=6, EQUALS_NAME=7, + SMALLER_NAME=8, TYPEVAR_NAME=9, TYPE_NAME=10, NAME=11, WS=12, LINE_COMMENT=13; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + public static final String[] ruleNames = { + "T__0", "T__1", "T__2", "T__3", "T__4", "PARAMLIST_NAME", "EQUALS_NAME", + "SMALLER_NAME", "TYPEVAR_NAME", "TYPE_NAME", "NAME", "WS", "LINE_COMMENT" + }; + + private static final String[] _LITERAL_NAMES = { + null, "'ANSWER'", "'.'", "'('", "','", "')'", "'param'", "'equals'", "'smaller'", + "'typeVar'", "'type'" + }; + private static final String[] _SYMBOLIC_NAMES = { + null, null, null, null, null, null, "PARAMLIST_NAME", "EQUALS_NAME", "SMALLER_NAME", + "TYPEVAR_NAME", "TYPE_NAME", "NAME", "WS", "LINE_COMMENT" + }; + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public UnifyResultLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "UnifyResult.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\17c\b\1\4\2\t\2\4"+ + "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ + "\13\4\f\t\f\4\r\t\r\4\16\t\16\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4"+ + "\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3"+ + "\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13"+ + "\3\13\3\13\3\13\3\13\3\f\6\fP\n\f\r\f\16\fQ\3\r\6\rU\n\r\r\r\16\rV\3\r"+ + "\3\r\3\16\3\16\7\16]\n\16\f\16\16\16`\13\16\3\16\3\16\2\2\17\3\3\5\4\7"+ + "\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\3\2\5\6\2\62;C\\"+ + "aac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2e\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3"+ + "\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2"+ + "\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\3\35"+ + "\3\2\2\2\5$\3\2\2\2\7&\3\2\2\2\t(\3\2\2\2\13*\3\2\2\2\r,\3\2\2\2\17\62"+ + "\3\2\2\2\219\3\2\2\2\23A\3\2\2\2\25I\3\2\2\2\27O\3\2\2\2\31T\3\2\2\2\33"+ + "Z\3\2\2\2\35\36\7C\2\2\36\37\7P\2\2\37 \7U\2\2 !\7Y\2\2!\"\7G\2\2\"#\7"+ + "T\2\2#\4\3\2\2\2$%\7\60\2\2%\6\3\2\2\2&\'\7*\2\2\'\b\3\2\2\2()\7.\2\2"+ + ")\n\3\2\2\2*+\7+\2\2+\f\3\2\2\2,-\7r\2\2-.\7c\2\2./\7t\2\2/\60\7c\2\2"+ + "\60\61\7o\2\2\61\16\3\2\2\2\62\63\7g\2\2\63\64\7s\2\2\64\65\7w\2\2\65"+ + "\66\7c\2\2\66\67\7n\2\2\678\7u\2\28\20\3\2\2\29:\7u\2\2:;\7o\2\2;<\7c"+ + "\2\2<=\7n\2\2=>\7n\2\2>?\7g\2\2?@\7t\2\2@\22\3\2\2\2AB\7v\2\2BC\7{\2\2"+ + "CD\7r\2\2DE\7g\2\2EF\7X\2\2FG\7c\2\2GH\7t\2\2H\24\3\2\2\2IJ\7v\2\2JK\7"+ + "{\2\2KL\7r\2\2LM\7g\2\2M\26\3\2\2\2NP\t\2\2\2ON\3\2\2\2PQ\3\2\2\2QO\3"+ + "\2\2\2QR\3\2\2\2R\30\3\2\2\2SU\t\3\2\2TS\3\2\2\2UV\3\2\2\2VT\3\2\2\2V"+ + "W\3\2\2\2WX\3\2\2\2XY\b\r\2\2Y\32\3\2\2\2Z^\7\'\2\2[]\n\4\2\2\\[\3\2\2"+ + "\2]`\3\2\2\2^\\\3\2\2\2^_\3\2\2\2_a\3\2\2\2`^\3\2\2\2ab\b\16\2\2b\34\3"+ + "\2\2\2\6\2QV^\3\b\2\2"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.tokens b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.tokens new file mode 100644 index 00000000..8f9c0e0a --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultLexer.tokens @@ -0,0 +1,23 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +PARAMLIST_NAME=6 +EQUALS_NAME=7 +SMALLER_NAME=8 +TYPEVAR_NAME=9 +TYPE_NAME=10 +NAME=11 +WS=12 +LINE_COMMENT=13 +'ANSWER'=1 +'.'=2 +'('=3 +','=4 +')'=5 +'param'=6 +'equals'=7 +'smaller'=8 +'typeVar'=9 +'type'=10 diff --git a/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultListener.java b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultListener.java new file mode 100644 index 00000000..6158b123 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultListener.java @@ -0,0 +1,110 @@ +// Generated from UnifyResult.g4 by ANTLR 4.7 +package de.dhbwstuttgart.sat.asp.parser.antlr; +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link UnifyResultParser}. + */ +public interface UnifyResultListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link UnifyResultParser#answer}. + * @param ctx the parse tree + */ + void enterAnswer(UnifyResultParser.AnswerContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#answer}. + * @param ctx the parse tree + */ + void exitAnswer(UnifyResultParser.AnswerContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#resultSetRule}. + * @param ctx the parse tree + */ + void enterResultSetRule(UnifyResultParser.ResultSetRuleContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#resultSetRule}. + * @param ctx the parse tree + */ + void exitResultSetRule(UnifyResultParser.ResultSetRuleContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#parameterList}. + * @param ctx the parse tree + */ + void enterParameterList(UnifyResultParser.ParameterListContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#parameterList}. + * @param ctx the parse tree + */ + void exitParameterList(UnifyResultParser.ParameterListContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#value}. + * @param ctx the parse tree + */ + void enterValue(UnifyResultParser.ValueContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#value}. + * @param ctx the parse tree + */ + void exitValue(UnifyResultParser.ValueContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#parameter}. + * @param ctx the parse tree + */ + void enterParameter(UnifyResultParser.ParameterContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#parameter}. + * @param ctx the parse tree + */ + void exitParameter(UnifyResultParser.ParameterContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#equals}. + * @param ctx the parse tree + */ + void enterEquals(UnifyResultParser.EqualsContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#equals}. + * @param ctx the parse tree + */ + void exitEquals(UnifyResultParser.EqualsContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#smaller}. + * @param ctx the parse tree + */ + void enterSmaller(UnifyResultParser.SmallerContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#smaller}. + * @param ctx the parse tree + */ + void exitSmaller(UnifyResultParser.SmallerContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#typeVar}. + * @param ctx the parse tree + */ + void enterTypeVar(UnifyResultParser.TypeVarContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#typeVar}. + * @param ctx the parse tree + */ + void exitTypeVar(UnifyResultParser.TypeVarContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#type}. + * @param ctx the parse tree + */ + void enterType(UnifyResultParser.TypeContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#type}. + * @param ctx the parse tree + */ + void exitType(UnifyResultParser.TypeContext ctx); + /** + * Enter a parse tree produced by {@link UnifyResultParser#otherRule}. + * @param ctx the parse tree + */ + void enterOtherRule(UnifyResultParser.OtherRuleContext ctx); + /** + * Exit a parse tree produced by {@link UnifyResultParser#otherRule}. + * @param ctx the parse tree + */ + void exitOtherRule(UnifyResultParser.OtherRuleContext ctx); +} \ No newline at end of file diff --git a/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultParser.java b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultParser.java new file mode 100644 index 00000000..bf0789f1 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/parser/antlr/UnifyResultParser.java @@ -0,0 +1,639 @@ +// Generated from UnifyResult.g4 by ANTLR 4.7 +package de.dhbwstuttgart.sat.asp.parser.antlr; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class UnifyResultParser extends Parser { + static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, PARAMLIST_NAME=6, EQUALS_NAME=7, + SMALLER_NAME=8, TYPEVAR_NAME=9, TYPE_NAME=10, NAME=11, WS=12, LINE_COMMENT=13; + public static final int + RULE_answer = 0, RULE_resultSetRule = 1, RULE_parameterList = 2, RULE_value = 3, + RULE_parameter = 4, RULE_equals = 5, RULE_smaller = 6, RULE_typeVar = 7, + RULE_type = 8, RULE_otherRule = 9; + public static final String[] ruleNames = { + "answer", "resultSetRule", "parameterList", "value", "parameter", "equals", + "smaller", "typeVar", "type", "otherRule" + }; + + private static final String[] _LITERAL_NAMES = { + null, "'ANSWER'", "'.'", "'('", "','", "')'", "'param'", "'equals'", "'smaller'", + "'typeVar'", "'type'" + }; + private static final String[] _SYMBOLIC_NAMES = { + null, null, null, null, null, null, "PARAMLIST_NAME", "EQUALS_NAME", "SMALLER_NAME", + "TYPEVAR_NAME", "TYPE_NAME", "NAME", "WS", "LINE_COMMENT" + }; + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "UnifyResult.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public UnifyResultParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + public static class AnswerContext extends ParserRuleContext { + public List resultSetRule() { + return getRuleContexts(ResultSetRuleContext.class); + } + public ResultSetRuleContext resultSetRule(int i) { + return getRuleContext(ResultSetRuleContext.class,i); + } + public AnswerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_answer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterAnswer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitAnswer(this); + } + } + + public final AnswerContext answer() throws RecognitionException { + AnswerContext _localctx = new AnswerContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_answer); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(20); + match(T__0); + setState(26); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PARAMLIST_NAME) | (1L << EQUALS_NAME) | (1L << SMALLER_NAME) | (1L << TYPEVAR_NAME) | (1L << TYPE_NAME) | (1L << NAME))) != 0)) { + { + { + setState(21); + resultSetRule(); + setState(22); + match(T__1); + } + } + setState(28); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ResultSetRuleContext extends ParserRuleContext { + public ParameterContext parameter() { + return getRuleContext(ParameterContext.class,0); + } + public EqualsContext equals() { + return getRuleContext(EqualsContext.class,0); + } + public SmallerContext smaller() { + return getRuleContext(SmallerContext.class,0); + } + public TypeVarContext typeVar() { + return getRuleContext(TypeVarContext.class,0); + } + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public OtherRuleContext otherRule() { + return getRuleContext(OtherRuleContext.class,0); + } + public ResultSetRuleContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_resultSetRule; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterResultSetRule(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitResultSetRule(this); + } + } + + public final ResultSetRuleContext resultSetRule() throws RecognitionException { + ResultSetRuleContext _localctx = new ResultSetRuleContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_resultSetRule); + try { + setState(35); + _errHandler.sync(this); + switch (_input.LA(1)) { + case PARAMLIST_NAME: + enterOuterAlt(_localctx, 1); + { + setState(29); + parameter(); + } + break; + case EQUALS_NAME: + enterOuterAlt(_localctx, 2); + { + setState(30); + equals(); + } + break; + case SMALLER_NAME: + enterOuterAlt(_localctx, 3); + { + setState(31); + smaller(); + } + break; + case TYPEVAR_NAME: + enterOuterAlt(_localctx, 4); + { + setState(32); + typeVar(); + } + break; + case TYPE_NAME: + enterOuterAlt(_localctx, 5); + { + setState(33); + type(); + } + break; + case NAME: + enterOuterAlt(_localctx, 6); + { + setState(34); + otherRule(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ParameterListContext extends ParserRuleContext { + public List value() { + return getRuleContexts(ValueContext.class); + } + public ValueContext value(int i) { + return getRuleContext(ValueContext.class,i); + } + public ParameterListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_parameterList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterParameterList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitParameterList(this); + } + } + + public final ParameterListContext parameterList() throws RecognitionException { + ParameterListContext _localctx = new ParameterListContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_parameterList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(37); + match(T__2); + setState(38); + value(); + setState(43); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==T__3) { + { + { + setState(39); + match(T__3); + setState(40); + value(); + } + } + setState(45); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(46); + match(T__4); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ValueContext extends ParserRuleContext { + public TerminalNode NAME() { return getToken(UnifyResultParser.NAME, 0); } + public ResultSetRuleContext resultSetRule() { + return getRuleContext(ResultSetRuleContext.class,0); + } + public ValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_value; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterValue(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitValue(this); + } + } + + public final ValueContext value() throws RecognitionException { + ValueContext _localctx = new ValueContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_value); + try { + setState(50); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(48); + match(NAME); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(49); + resultSetRule(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ParameterContext extends ParserRuleContext { + public TerminalNode PARAMLIST_NAME() { return getToken(UnifyResultParser.PARAMLIST_NAME, 0); } + public ParameterListContext parameterList() { + return getRuleContext(ParameterListContext.class,0); + } + public ParameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_parameter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterParameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitParameter(this); + } + } + + public final ParameterContext parameter() throws RecognitionException { + ParameterContext _localctx = new ParameterContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_parameter); + try { + enterOuterAlt(_localctx, 1); + { + setState(52); + match(PARAMLIST_NAME); + setState(53); + parameterList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class EqualsContext extends ParserRuleContext { + public TerminalNode EQUALS_NAME() { return getToken(UnifyResultParser.EQUALS_NAME, 0); } + public ParameterListContext parameterList() { + return getRuleContext(ParameterListContext.class,0); + } + public EqualsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_equals; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterEquals(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitEquals(this); + } + } + + public final EqualsContext equals() throws RecognitionException { + EqualsContext _localctx = new EqualsContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_equals); + try { + enterOuterAlt(_localctx, 1); + { + setState(55); + match(EQUALS_NAME); + setState(56); + parameterList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SmallerContext extends ParserRuleContext { + public TerminalNode SMALLER_NAME() { return getToken(UnifyResultParser.SMALLER_NAME, 0); } + public ParameterListContext parameterList() { + return getRuleContext(ParameterListContext.class,0); + } + public SmallerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_smaller; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterSmaller(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitSmaller(this); + } + } + + public final SmallerContext smaller() throws RecognitionException { + SmallerContext _localctx = new SmallerContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_smaller); + try { + enterOuterAlt(_localctx, 1); + { + setState(58); + match(SMALLER_NAME); + setState(59); + parameterList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeVarContext extends ParserRuleContext { + public TerminalNode TYPEVAR_NAME() { return getToken(UnifyResultParser.TYPEVAR_NAME, 0); } + public ParameterListContext parameterList() { + return getRuleContext(ParameterListContext.class,0); + } + public TypeVarContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeVar; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterTypeVar(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitTypeVar(this); + } + } + + public final TypeVarContext typeVar() throws RecognitionException { + TypeVarContext _localctx = new TypeVarContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_typeVar); + try { + enterOuterAlt(_localctx, 1); + { + setState(61); + match(TYPEVAR_NAME); + setState(62); + parameterList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeContext extends ParserRuleContext { + public TerminalNode TYPE_NAME() { return getToken(UnifyResultParser.TYPE_NAME, 0); } + public ParameterListContext parameterList() { + return getRuleContext(ParameterListContext.class,0); + } + public TypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitType(this); + } + } + + public final TypeContext type() throws RecognitionException { + TypeContext _localctx = new TypeContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_type); + try { + enterOuterAlt(_localctx, 1); + { + setState(64); + match(TYPE_NAME); + setState(65); + parameterList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OtherRuleContext extends ParserRuleContext { + public TerminalNode NAME() { return getToken(UnifyResultParser.NAME, 0); } + public ParameterListContext parameterList() { + return getRuleContext(ParameterListContext.class,0); + } + public OtherRuleContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_otherRule; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).enterOtherRule(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof UnifyResultListener ) ((UnifyResultListener)listener).exitOtherRule(this); + } + } + + public final OtherRuleContext otherRule() throws RecognitionException { + OtherRuleContext _localctx = new OtherRuleContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_otherRule); + try { + enterOuterAlt(_localctx, 1); + { + setState(67); + match(NAME); + setState(68); + parameterList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\17I\4\2\t\2\4\3\t"+ + "\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\3"+ + "\2\3\2\3\2\3\2\7\2\33\n\2\f\2\16\2\36\13\2\3\3\3\3\3\3\3\3\3\3\3\3\5\3"+ + "&\n\3\3\4\3\4\3\4\3\4\7\4,\n\4\f\4\16\4/\13\4\3\4\3\4\3\5\3\5\5\5\65\n"+ + "\5\3\6\3\6\3\6\3\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\3\13\3"+ + "\13\3\13\3\13\2\2\f\2\4\6\b\n\f\16\20\22\24\2\2\2F\2\26\3\2\2\2\4%\3\2"+ + "\2\2\6\'\3\2\2\2\b\64\3\2\2\2\n\66\3\2\2\2\f9\3\2\2\2\16<\3\2\2\2\20?"+ + "\3\2\2\2\22B\3\2\2\2\24E\3\2\2\2\26\34\7\3\2\2\27\30\5\4\3\2\30\31\7\4"+ + "\2\2\31\33\3\2\2\2\32\27\3\2\2\2\33\36\3\2\2\2\34\32\3\2\2\2\34\35\3\2"+ + "\2\2\35\3\3\2\2\2\36\34\3\2\2\2\37&\5\n\6\2 &\5\f\7\2!&\5\16\b\2\"&\5"+ + "\20\t\2#&\5\22\n\2$&\5\24\13\2%\37\3\2\2\2% \3\2\2\2%!\3\2\2\2%\"\3\2"+ + "\2\2%#\3\2\2\2%$\3\2\2\2&\5\3\2\2\2\'(\7\5\2\2(-\5\b\5\2)*\7\6\2\2*,\5"+ + "\b\5\2+)\3\2\2\2,/\3\2\2\2-+\3\2\2\2-.\3\2\2\2.\60\3\2\2\2/-\3\2\2\2\60"+ + "\61\7\7\2\2\61\7\3\2\2\2\62\65\7\r\2\2\63\65\5\4\3\2\64\62\3\2\2\2\64"+ + "\63\3\2\2\2\65\t\3\2\2\2\66\67\7\b\2\2\678\5\6\4\28\13\3\2\2\29:\7\t\2"+ + "\2:;\5\6\4\2;\r\3\2\2\2<=\7\n\2\2=>\5\6\4\2>\17\3\2\2\2?@\7\13\2\2@A\5"+ + "\6\4\2A\21\3\2\2\2BC\7\f\2\2CD\5\6\4\2D\23\3\2\2\2EF\7\r\2\2FG\5\6\4\2"+ + "G\25\3\2\2\2\6\34%-\64"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index eadca649..f4422ff7 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -28,8 +28,8 @@ public class UnifyWithoutWildcards { @Test public void adapt() throws InterruptedException, IOException, ClassNotFoundException { ConstraintSet testSet = new ConstraintSet<>(); - List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken()),TypePlaceholder.fresh(new NullToken())); - List list2 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + List list2 = Arrays.asList(TypePlaceholder.fresh(new NullToken()),TypePlaceholder.fresh(new NullToken())); RefType t1 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Matrix"), list1, new NullToken()); RefType t2 = new RefType(new JavaClassName("java.util.HashMap"), list2, new NullToken()); testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); From bb5945898a0bd490000f8a96089ade4edf61569b Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 13 Mar 2018 01:57:21 +0100 Subject: [PATCH 43/65] Bug in ASTFactory beseitigen --- pom.xml | 6 ++++ .../syntaxtree/factory/ASTFactory.java | 36 ++++++++++++------- test/javFiles/Vector.jav | 6 +--- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index ea7be6b3..1b97e501 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,12 @@ asm-all [4.0.0,) + diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index fa930f58..c438bc67 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -89,14 +89,21 @@ public class ASTFactory { return new Field(field.getName(), createType(field.getType(), jreClass, null), field.getModifiers(), new NullToken()); } + //private static RefType createType(Class classType) { + // return createClass(classType).getType(); + //} + private static de.dhbwstuttgart.syntaxtree.Constructor createConstructor(Constructor constructor, Class inClass) { String name = constructor.getName(); RefTypeOrTPHOrWildcardOrGeneric returnType = createType(inClass, new JavaClassName(inClass.getName()), name); Parameter[] jreParams = constructor.getParameters(); + Type[] jreGenericParams = constructor.getGenericParameterTypes(); List params = new ArrayList<>(); - for(Parameter jreParam : jreParams){ - RefTypeOrTPHOrWildcardOrGeneric paramType = createType(jreParam.getType(),new JavaClassName(inClass.getName()), name); - params.add(new FormalParameter(jreParam.getName(),paramType, new NullToken())); + int i = 0; + for(Type jreParam : jreGenericParams){ + RefTypeOrTPHOrWildcardOrGeneric paramType = createType(jreParam,new JavaClassName(inClass.getName()), name); + params.add(new FormalParameter(jreParams[i].getName(),paramType, new NullToken())); + i++; } ParameterList parameterList = new ParameterList(params, new NullToken()); Block block = new Block(new ArrayList(), new NullToken()); @@ -109,21 +116,26 @@ public class ASTFactory { } return new de.dhbwstuttgart.syntaxtree.Constructor(modifier, name,returnType, parameterList, block, gtvDeclarations, offset, new ArrayList<>()); - } - - //private static RefType createType(Class classType) { - // return createClass(classType).getType(); - //} + } public static Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass){ String name = jreMethod.getName(); RefTypeOrTPHOrWildcardOrGeneric returnType; - returnType = createType(jreMethod.getReturnType(),new JavaClassName(inClass.getName()), name); + Type jreRetType; + if(jreMethod.getGenericReturnType()!=null){ + jreRetType = jreMethod.getGenericReturnType(); + }else{ + jreRetType = jreMethod.getReturnType(); + } + returnType = createType(jreRetType,new JavaClassName(inClass.getName()), name); Parameter[] jreParams = jreMethod.getParameters(); + Type[] jreGenericParams = jreMethod.getGenericParameterTypes(); List params = new ArrayList<>(); - for(Parameter jreParam : jreParams){ - RefTypeOrTPHOrWildcardOrGeneric paramType = createType(jreParam.getType(),new JavaClassName(inClass.getName()), name); - params.add(new FormalParameter(jreParam.getName(),paramType, new NullToken())); + int i = 0; + for(Type jreParam : jreGenericParams){ + RefTypeOrTPHOrWildcardOrGeneric paramType = createType(jreParam,new JavaClassName(inClass.getName()), name); + params.add(new FormalParameter(jreParams[i].getName(),paramType, new NullToken())); + i++; } ParameterList parameterList = new ParameterList(params, new NullToken()); Block block = new Block(new ArrayList(), new NullToken()); diff --git a/test/javFiles/Vector.jav b/test/javFiles/Vector.jav index ef3533a6..40072fe4 100644 --- a/test/javFiles/Vector.jav +++ b/test/javFiles/Vector.jav @@ -3,10 +3,6 @@ import java.util.Vector; class MyVector{ id(x){ - return id2(x); -} - -id2(x){ -return id(x); + return (x.elementAt(0)); } } \ No newline at end of file From 4a2b901465e5c73149d958b82a1b8fbb01e5ab06 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 13 Mar 2018 14:53:27 +0100 Subject: [PATCH 44/65] =?UTF-8?q?aufr=C3=A4umen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/dhbwstuttgart/sat/asp/model/ASPRule.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java b/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java index 24ed9269..20d221f9 100644 --- a/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java +++ b/src/de/dhbwstuttgart/sat/asp/model/ASPRule.java @@ -1,12 +1,10 @@ package de.dhbwstuttgart.sat.asp.model; public enum ASPRule { - ASP_GENERIC_TYPE_NAME("genericType"), ASP_PAIR_EQUALS_NAME("equals"), ASP_PAIR_SMALLER_NAME("smaller"), ASP_PAIR_SMALLER_DOT_NAME("smallerDot"), ASP_PARAMLIST_NAME("param"), - ASP_PARAMLISTNUMERATION_NAME("paramNum"), ASP_PARAMLIST_END_POINTER("null"), ASP_TYPE("type"), ASP_FCTYPE("typeFC"), From 6a5ababa519065da29bf37d7adf33fbf9ab49063 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 14 Mar 2018 14:32:36 +0100 Subject: [PATCH 45/65] =?UTF-8?q?ANTLR=20Parsetreewalker=20f=C3=BCr=20ASP?= =?UTF-8?q?=20Result=20implementieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sat/asp/parser/ASPParser.java | 181 ++++++++---------- .../sat/asp/parser/model/ParsedType.java | 4 +- 2 files changed, 83 insertions(+), 102 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java index cfb59933..ce43a01f 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java @@ -8,14 +8,12 @@ import de.dhbwstuttgart.sat.asp.ASPStringConverter; import de.dhbwstuttgart.sat.asp.model.ASPRule; import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultBaseListener; import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultLexer; -import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultListener; import de.dhbwstuttgart.sat.asp.parser.antlr.UnifyResultParser; import de.dhbwstuttgart.sat.asp.parser.model.ParsedType; import de.dhbwstuttgart.syntaxtree.type.*; import de.dhbwstuttgart.typeinference.result.*; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.TokenStream; import org.antlr.v4.runtime.tree.ParseTreeWalker; import javax.json.Json; @@ -36,11 +34,13 @@ import java.util.stream.Collectors; * -> Eigentlich nur die korrekten Namen der Typen und TPHs */ public class ASPParser extends UnifyResultBaseListener { - private final Collection originalTPHs; + private Collection originalTPHs; private ResultSet resultSet; private Map types = new HashMap<>(); private Set tphs = new HashSet<>(); private Map parameterLists = new HashMap<>(); + private Set equalsRelations = new HashSet<>(); + private Set smallerRelations = new HashSet<>(); /** * Parst clingo output welcher als JSON (option --outf=2) ausgibt @@ -53,36 +53,74 @@ public class ASPParser extends UnifyResultBaseListener { @Override public void enterParameter(UnifyResultParser.ParameterContext ctx) { + //Linked List (pointer, Type, nextPointer) + List params = parseParameterList(ctx.parameterList()); + parameterLists.put(params.get(0), new ParameterListNode(params.get(1), params.get(2))); + } + + private static class Relation { + public final String right; + public final String left; + + Relation(String leftType, String rightType){ + this.left = leftType; + this.right = rightType; + } + + @Override + public int hashCode() { + return (left+right).hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof Relation) + return (right+left).equals(((Relation) obj).left+((Relation) obj).right); + return super.equals(obj); + } + } + + private List parseParameterList(UnifyResultParser.ParameterListContext ctx){ + return ctx.value().stream().map(v -> + //ASPStringConverter.fromConstant(v.getText()) + v.getText() + ).collect(Collectors.toList()); } @Override public void enterEquals(UnifyResultParser.EqualsContext ctx) { - List parameterList = ctx.parameterList().value().stream().map(v -> v.getText()).collect(Collectors.toList()); - if(parameterList.size()<2)throw new DebugException("Fehler in Regex"); + List parameterList = parseParameterList(ctx.parameterList()); + if(parameterList.size()<2)throw new DebugException("Fehler in Equals-Regel"); String ls = parameterList.get(0); String rs = parameterList.get(1); - /* - RefTypeOrTPHOrWildcardOrGeneric lsType = this.getType(ls); - RefTypeOrTPHOrWildcardOrGeneric rsType = this.getType(rs); - if(lsType instanceof TypePlaceholder && rsType instanceof RefType) - return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder) lsType, rsType); - else if(lsType instanceof TypePlaceholder && rsType instanceof TypePlaceholder) - return new PairTPHEqualTPH((TypePlaceholder)lsType, (TypePlaceholder)rsType); - else throw new NotImplementedException(); - */ + equalsRelations.add(new Relation(ls, rs)); + } @Override public void enterSmaller(UnifyResultParser.SmallerContext ctx) { + List parameterList = parseParameterList(ctx.parameterList()); + if(parameterList.size()<2)throw new DebugException("Fehler in Smaller-Regel"); + String ls = parameterList.get(0); + String rs = parameterList.get(1); + smallerRelations.add(new Relation(ls, rs)); } @Override public void enterTypeVar(UnifyResultParser.TypeVarContext ctx) { + List parameterList = parseParameterList(ctx.parameterList()); + if(parameterList.size()<1)throw new DebugException("Fehler in typeVar-Regel"); + tphs.add(parameterList.get(0)); } @Override - public void enterType(UnifyResultParser.TypeContext ctx) { - super.enterType(ctx); + public void enterType(UnifyResultParser.TypeContext ctx){ + List parameterList = parseParameterList(ctx.parameterList()); + if(parameterList.size()<3)throw new DebugException("Fehler in Type-Regel"); + String name = parameterList.get(0); + String typeName = parameterList.get(1); + String paramPointer = parameterList.get(2); + types.put(name, new ParsedType(typeName, paramPointer)); } /* @@ -104,62 +142,46 @@ public class ASPParser extends UnifyResultBaseListener { } */ private ASPParser(String toParse, Collection oldPlaceholders){ + System.out.println(toParse); this.originalTPHs = oldPlaceholders; + + /* JsonObject jsonResult = Json.createReader(new StringReader(toParse)).readObject(); JsonArray results = jsonResult.getJsonArray("Call").getJsonObject(0). getJsonArray("Witnesses").getJsonObject(0). getJsonArray("Value"); + //Im ersten Schritt werden alle Regeln geparst + String completeResult = ""; + for(int i = 0; i ret = new HashSet<>(); //Zuerst die params und typeVars: - for(int i = 0; i parsedType.params).collect(Collectors.toList())){ } + //Dann die Equalsdot Statements - for(int i = 0; i params = new ArrayList<>(); ParsedType t = types.get(name); - for(String param : t.params){ + + for(String param : getParams(t.params)){ params.add(this.getType(param)); } return new RefType(new JavaClassName(ASPStringConverter.fromConstant(t.name)), params, new NullToken()); @@ -189,49 +212,6 @@ public class ASPParser extends UnifyResultBaseListener { this.nextNode = next; } } - private void parseParameter(String statement){ - //param(pointer, typ, nextPointer - Pattern p = Pattern.compile(ASPRule.ASP_PARAMLIST_NAME+"\\(([^,]+),([^,]+),([^,]+)\\)"); - Matcher m = p.matcher(statement); - boolean b = m.matches(); - if(b){ - if(m.groupCount()<3)throw new DebugException("Fehler in Regex"); - String pointer = m.group(1); - String type = m.group(2); - String next = m.group(3); - if(next.equals(ASPRule.ASP_PARAMLIST_END_POINTER.toString()))next = null; - if(this.parameterLists.containsKey(pointer)){ - throw new DebugException("Fehler in Ergebnisparsen"); - } - this.parameterLists.put(pointer,new ParameterListNode(type, next)); - } - } - - private void parseTypeVar(String statement){ - Pattern p = Pattern.compile(ASPRule.ASP_TYPE_VAR+"\\(([^,]+)\\)"); - Matcher m = p.matcher(statement); - boolean b = m.matches(); - if(b){ - if(m.groupCount()<1)throw new DebugException("Fehler in Regex"); - String name = m.group(1); - this.tphs.add(name); - } - } - - private void parseType(String statement){ - //Diese Regel muss 3 Parameter parsen (TypPointer, TypName, ParameterlistenPointer) - Pattern p = Pattern.compile(ASPRule.ASP_TYPE+"\\(([^,]+),([^,]+),([^,]+)\\)"); - Matcher m = p.matcher(statement); - boolean b = m.matches(); - if(b){ - if(m.groupCount()<3)throw new DebugException("Fehler in Regex"); - String pointer = m.group(1); - String name = m.group(2); - String paraList = m.group(3); - List params = this.getParams(paraList); - this.types.put(pointer,new ParsedType(name, params)); - } - } private List getParams(String pointer) { List params = new ArrayList<>(); @@ -239,6 +219,7 @@ public class ASPParser extends UnifyResultBaseListener { while(pointer != null){ if(!parameterLists.containsKey(pointer)) throw new DebugException("Fehler in Ergebnisparsen"); + //TODO: Fehler in ASP. Die adapt Regel muss erkennen, wenn die Parameterliste auf der linken Seite kürzer ist und diese Rechtzeitig beenden ParameterListNode param = parameterLists.get(pointer); pointer = param.nextNode; params.add(param.type); diff --git a/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java b/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java index c49ce831..d9e06e50 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/model/ParsedType.java @@ -4,8 +4,8 @@ import java.util.List; public class ParsedType { public final String name; - public final List params; - public ParsedType(String name, List params){ + public final String params; + public ParsedType(String name, String params){ this.name = name; this.params = params; } From 7e5aa852d7fb90dd7b8215266df9bc23b4d237df Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 10:35:46 +0100 Subject: [PATCH 46/65] Fehler fix --- src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java index ce43a01f..80ebfc38 100644 --- a/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java +++ b/src/de/dhbwstuttgart/sat/asp/parser/ASPParser.java @@ -142,7 +142,7 @@ public class ASPParser extends UnifyResultBaseListener { } */ private ASPParser(String toParse, Collection oldPlaceholders){ - System.out.println(toParse); + //System.out.println(toParse); this.originalTPHs = oldPlaceholders; /* @@ -215,8 +215,8 @@ public class ASPParser extends UnifyResultBaseListener { private List getParams(String pointer) { List params = new ArrayList<>(); - if(pointer.equals(ASPRule.ASP_PARAMLIST_END_POINTER.toString()))return params; while(pointer != null){ + if(pointer.equals(ASPRule.ASP_PARAMLIST_END_POINTER.toString()))return params; if(!parameterLists.containsKey(pointer)) throw new DebugException("Fehler in Ergebnisparsen"); //TODO: Fehler in ASP. Die adapt Regel muss erkennen, wenn die Parameterliste auf der linken Seite kürzer ist und diese Rechtzeitig beenden From 7a9c0a1e69df380e14075f54c6688e7e3390bafc Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 11:09:29 +0100 Subject: [PATCH 47/65] LambdaRunnableTest fix --- test/javFiles/LambdaRunnable.jav | 3 +++ test/visualisation/ToString.java | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 test/visualisation/ToString.java diff --git a/test/javFiles/LambdaRunnable.jav b/test/javFiles/LambdaRunnable.jav index 982680c3..37924ea2 100644 --- a/test/javFiles/LambdaRunnable.jav +++ b/test/javFiles/LambdaRunnable.jav @@ -1,3 +1,6 @@ +import java.lang.Runnable; +import java.lang.String; +import java.lang.System; public class LamRunnable{ diff --git a/test/visualisation/ToString.java b/test/visualisation/ToString.java new file mode 100644 index 00000000..00b8ddea --- /dev/null +++ b/test/visualisation/ToString.java @@ -0,0 +1,5 @@ +package visualisation; + +public class ToString { + +} From e1f579664a367978b10566465c3999afc87323c8 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 11:12:06 +0100 Subject: [PATCH 48/65] Fix Generics in MethodCall --- src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 8d87218d..0cadc085 100644 --- a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -349,7 +349,7 @@ public class TYPEStmt implements StatementVisitor{ */ methodConstraint.add(new Pair(forMethod.receiver.getType(), assumption.getReceiverType(resolver), PairOperator.SMALLERDOT)); - methodConstraint.add(new Pair(assumption.getReturnType(), forMethod.getType(), + methodConstraint.add(new Pair(assumption.getReturnType(resolver), forMethod.getType(), PairOperator.EQUALSDOT)); methodConstraint.addAll(generateParameterConstraints(forMethod, assumption, info, resolver)); return methodConstraint; @@ -442,7 +442,7 @@ public class TYPEStmt implements StatementVisitor{ protected Constraint generateConstructorConstraint(NewClass forConstructor, MethodAssumption assumption, TypeInferenceBlockInformation info, GenericsResolver resolver){ Constraint methodConstraint = new Constraint(); - methodConstraint.add(new Pair(assumption.getReturnType(), forConstructor.getType(), + methodConstraint.add(new Pair(assumption.getReturnType(resolver), forConstructor.getType(), PairOperator.SMALLERDOT)); methodConstraint.addAll(generateParameterConstraints(forConstructor, assumption, info, resolver)); return methodConstraint; From 77be216ee51a78bd83bee581ec00247e0742dd9d Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 11:15:59 +0100 Subject: [PATCH 49/65] Fix --- .../typeinference/assumptions/FieldAssumption.java | 5 +++-- .../typeinference/assumptions/MethodAssumption.java | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java b/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java index 62867a26..e039dcbe 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java @@ -1,5 +1,6 @@ package de.dhbwstuttgart.typeinference.assumptions; +import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.TypeScope; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; @@ -25,7 +26,7 @@ public class FieldAssumption extends Assumption{ } public RefTypeOrTPHOrWildcardOrGeneric getReceiverType(GenericsResolver resolver) { - - return null; + //TODO + throw new NotImplementedException(); } } diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java b/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java index 4656318c..e17281e5 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java @@ -37,7 +37,8 @@ public class MethodAssumption extends Assumption{ return receiver; } - public RefTypeOrTPHOrWildcardOrGeneric getReturnType() { + public RefTypeOrTPHOrWildcardOrGeneric getReturnType(GenericsResolver resolver) { + if(retType instanceof GenericRefType)return resolver.resolve(retType); return retType; } From a71e56ea9793f9ffb05d99b9b8a7c159e6053a2d Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 11:15:59 +0100 Subject: [PATCH 50/65] Fix --- .../typeinference/assumptions/FieldAssumption.java | 5 +++-- .../typeinference/assumptions/MethodAssumption.java | 3 ++- src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java | 2 +- test/typeinference/JavaTXCompilerTest.java | 4 ++++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java b/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java index 62867a26..e039dcbe 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/FieldAssumption.java @@ -1,5 +1,6 @@ package de.dhbwstuttgart.typeinference.assumptions; +import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.TypeScope; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; @@ -25,7 +26,7 @@ public class FieldAssumption extends Assumption{ } public RefTypeOrTPHOrWildcardOrGeneric getReceiverType(GenericsResolver resolver) { - - return null; + //TODO + throw new NotImplementedException(); } } diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java b/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java index 4656318c..e17281e5 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/MethodAssumption.java @@ -37,7 +37,8 @@ public class MethodAssumption extends Assumption{ return receiver; } - public RefTypeOrTPHOrWildcardOrGeneric getReturnType() { + public RefTypeOrTPHOrWildcardOrGeneric getReturnType(GenericsResolver resolver) { + if(retType instanceof GenericRefType)return resolver.resolve(retType); return retType; } diff --git a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 0cadc085..19f212bf 100644 --- a/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -393,7 +393,7 @@ public class TYPEStmt implements StatementVisitor{ for(Method m : cl.getMethods()){ if(m.getName().equals(name) && m.getParameterList().getFormalparalist().size() == numArgs){ - RefTypeOrTPHOrWildcardOrGeneric retType = info.checkGTV(m.getReturnType()); + RefTypeOrTPHOrWildcardOrGeneric retType = m.getReturnType();//info.checkGTV(m.getReturnType()); ret.add(new MethodAssumption(cl, retType, convertParams(m.getParameterList(),info), createTypeScope(cl, m))); diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index 87551476..3ba22bc6 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -49,6 +49,10 @@ public class JavaTXCompilerTest { execute(new File(rootDirectory+"Generics.jav")); } @Test + public void genericsMethodCall() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"MethodCallGenerics.jav")); + } + @Test public void faculty() throws IOException, ClassNotFoundException { execute(new File(rootDirectory+"Faculty.jav")); } From 79810be94fd2f111f91e5971632dd080ffacc01b Mon Sep 17 00:00:00 2001 From: Andreas Stadelmeier Date: Wed, 21 Mar 2018 14:21:50 +0100 Subject: [PATCH 51/65] =?UTF-8?q?FC=20Generator=20ber=C3=BCcksichtig=20int?= =?UTF-8?q?erfaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SyntaxTreeGenerator/FCGenerator.java | 85 ++++++++++--------- .../SyntaxTreeGenerator.java | 14 +-- .../syntaxtree/ClassOrInterface.java | 9 +- 3 files changed, 60 insertions(+), 48 deletions(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 24abec67..ceb3b817 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 ed96d2e6..72606713 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 5d5fc3e2..72097fc0 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 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 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; + } } From ae7a63fbca6509f0665794fa6c884575364f04cc Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 14:22:30 +0100 Subject: [PATCH 52/65] Tests fix --- .../parser/SyntaxTreeGenerator/FCGenerator.java | 2 +- test/javFiles/MethodCallGenerics.jav | 14 ++++++++++++++ test/typeinference/JavaTXCompilerTest.java | 3 ++- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 test/javFiles/MethodCallGenerics.jav diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 24abec67..43743378 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -56,7 +56,7 @@ 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 diff --git a/test/javFiles/MethodCallGenerics.jav b/test/javFiles/MethodCallGenerics.jav new file mode 100644 index 00000000..0d02509b --- /dev/null +++ b/test/javFiles/MethodCallGenerics.jav @@ -0,0 +1,14 @@ +import java.lang.String; + +class Generics { + // A mt1(A a, B b){ + B mt1(B a, B b){ + return mt1(a, a); + } +} + +class Test { + methode(String s){ + return new Generics().mt1(s,s); + } +} diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index 3ba22bc6..7c4c3582 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -50,7 +50,8 @@ public class JavaTXCompilerTest { } @Test public void genericsMethodCall() throws IOException, ClassNotFoundException { - execute(new File(rootDirectory+"MethodCallGenerics.jav")); + TestResultSet result = execute(new File(rootDirectory+"MethodCallGenerics.jav")); + //TODO: Hier sollte der Rückgabetyp der Methode String sein } @Test public void faculty() throws IOException, ClassNotFoundException { From 6b1a4eddfcf70eb29f9e0f1a2919cf0bcc59b667 Mon Sep 17 00:00:00 2001 From: Andreas Stadelmeier Date: Wed, 21 Mar 2018 14:40:47 +0100 Subject: [PATCH 53/65] =?UTF-8?q?Java=209=20zu=20Java=208=20=C3=A4ndern.?= =?UTF-8?q?=20Sollte=20ausreichen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1b97e501..6dcac215 100644 --- a/pom.xml +++ b/pom.xml @@ -83,8 +83,8 @@ org.apache.maven.plugins maven-compiler-plugin - 9 - 9 + 8 + 8 From 161c1a1b53031cbbee47221504c6bc8461576c34 Mon Sep 17 00:00:00 2001 From: Andreas Stadelmeier Date: Wed, 21 Mar 2018 15:15:31 +0100 Subject: [PATCH 54/65] =?UTF-8?q?Test=20anf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/finiteClosure/SuperInterfacesTest.java | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/finiteClosure/SuperInterfacesTest.java diff --git a/test/finiteClosure/SuperInterfacesTest.java b/test/finiteClosure/SuperInterfacesTest.java new file mode 100644 index 00000000..f00bf068 --- /dev/null +++ b/test/finiteClosure/SuperInterfacesTest.java @@ -0,0 +1,31 @@ +package finiteClosure; + +import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class SuperInterfacesTest { + @Test + public void test() throws ClassNotFoundException { + Collection classes = new ArrayList<>(); + classes.add(ASTFactory.createClass(TestClass.class)); + System.out.println(FCGenerator.toFC(classes)); + } +} + +class TestClass implements Test2, Test3{ + +} + +interface Test2 { + +} + +interface Test3{ + +} \ No newline at end of file From 45ccfb58e309627bfd963f10a1d9ca6beb08842b Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 17:10:40 +0100 Subject: [PATCH 55/65] Test commit --- .../dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 43743378..24abec67 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -56,7 +56,7 @@ 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 From dd18c7c40e63edc0250a7e86ca59bba4bc4e5e27 Mon Sep 17 00:00:00 2001 From: Andreas Stadelmeier Date: Wed, 21 Mar 2018 15:15:31 +0100 Subject: [PATCH 56/65] =?UTF-8?q?Test=20anf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/finiteClosure/SuperInterfacesTest.java | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/finiteClosure/SuperInterfacesTest.java diff --git a/test/finiteClosure/SuperInterfacesTest.java b/test/finiteClosure/SuperInterfacesTest.java new file mode 100644 index 00000000..f00bf068 --- /dev/null +++ b/test/finiteClosure/SuperInterfacesTest.java @@ -0,0 +1,31 @@ +package finiteClosure; + +import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class SuperInterfacesTest { + @Test + public void test() throws ClassNotFoundException { + Collection classes = new ArrayList<>(); + classes.add(ASTFactory.createClass(TestClass.class)); + System.out.println(FCGenerator.toFC(classes)); + } +} + +class TestClass implements Test2, Test3{ + +} + +interface Test2 { + +} + +interface Test3{ + +} \ No newline at end of file From 9a735e86dd2e8c59870ecf567f81460ee1741dd9 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 17:26:43 +0100 Subject: [PATCH 57/65] =?UTF-8?q?GenericFC=20Test=20anf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/finiteClosure/SuperInterfacesTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/finiteClosure/SuperInterfacesTest.java b/test/finiteClosure/SuperInterfacesTest.java index f00bf068..0e1368c3 100644 --- a/test/finiteClosure/SuperInterfacesTest.java +++ b/test/finiteClosure/SuperInterfacesTest.java @@ -16,16 +16,31 @@ public class SuperInterfacesTest { classes.add(ASTFactory.createClass(TestClass.class)); System.out.println(FCGenerator.toFC(classes)); } + + @Test + public void testGeneric() throws ClassNotFoundException { + Collection classes = new ArrayList<>(); + classes.add(ASTFactory.createClass(TestClassGeneric.class)); + System.out.println(FCGenerator.toFC(classes)); + } } class TestClass implements Test2, Test3{ } +class TestClassGeneric implements Test4{ + +} + interface Test2 { } interface Test3{ +} + +interface Test4{ + } \ No newline at end of file From 06bb978cf6f1929adcbb95a5787fd2a066f5a4e1 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 21 Mar 2018 18:08:33 +0100 Subject: [PATCH 58/65] Testfall erweitern --- .../dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java | 2 +- test/finiteClosure/SuperInterfacesTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index ceb3b817..1714570e 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -81,7 +81,7 @@ public class FCGenerator { //Hier vermerken, welche Typen im der Superklasse ausgetauscht werden müssen Iterator itGenParams = superClass.getGenerics().iterator(); Iterator itSetParams = superType.getParaList().iterator(); - while(itGenParams.hasNext()){ + while(itSetParams.hasNext()){ RefTypeOrTPHOrWildcardOrGeneric setType = itSetParams.next(); //In diesem Typ die GTVs durch TPHs und Einsetzungen austauschen: RefTypeOrTPHOrWildcardOrGeneric setSetType = setType.acceptTV(new TypeExchanger(gtvs)); diff --git a/test/finiteClosure/SuperInterfacesTest.java b/test/finiteClosure/SuperInterfacesTest.java index 0e1368c3..d96e5ecc 100644 --- a/test/finiteClosure/SuperInterfacesTest.java +++ b/test/finiteClosure/SuperInterfacesTest.java @@ -21,6 +21,7 @@ public class SuperInterfacesTest { public void testGeneric() throws ClassNotFoundException { Collection classes = new ArrayList<>(); classes.add(ASTFactory.createClass(TestClassGeneric.class)); + //TODO: Die ASTFactory generiert hier den Supertyp falsch. Es fehlt die Parameterliste System.out.println(FCGenerator.toFC(classes)); } } From 72f27fab7a8ca4bb430a17c2ffcadbca669da948 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Thu, 22 Mar 2018 11:17:51 +0100 Subject: [PATCH 59/65] Fehler in ASTFactory Generierung von Superinterfaces beheben --- src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java | 9 +++++++-- test/finiteClosure/SuperInterfacesTest.java | 1 - 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index c438bc67..67e1b14c 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -59,7 +59,7 @@ public class ASTFactory { superClass = (RefType) createType(java.lang.Object.class, name, ""); } List implementedInterfaces = new ArrayList<>(); - for(java.lang.Class jreInterface : jreClass.getInterfaces()){ + for(Type jreInterface : jreClass.getGenericInterfaces()){ implementedInterfaces.add((RefType) createType(jreInterface, name, "")); } GenericDeclarationList genericDeclarationList = createGenerics(jreClass.getTypeParameters(), jreClass, null); @@ -193,7 +193,12 @@ public class ASTFactory { params.add(createType(t, parentClass, parentMethod)); } } - RefType ret = new RefType(new JavaClassName(type.getTypeName()), params, new NullToken()); + String name = type.getTypeName(); + if(name.contains("<")){ //Komischer fix. Type von Generischen Typen kann die Generics im Namen enthalten Type + //Diese entfernen: + name = name.split("<")[0]; + } + RefType ret = new RefType(new JavaClassName(name), params, new NullToken()); return ret; } } diff --git a/test/finiteClosure/SuperInterfacesTest.java b/test/finiteClosure/SuperInterfacesTest.java index d96e5ecc..0e1368c3 100644 --- a/test/finiteClosure/SuperInterfacesTest.java +++ b/test/finiteClosure/SuperInterfacesTest.java @@ -21,7 +21,6 @@ public class SuperInterfacesTest { public void testGeneric() throws ClassNotFoundException { Collection classes = new ArrayList<>(); classes.add(ASTFactory.createClass(TestClassGeneric.class)); - //TODO: Die ASTFactory generiert hier den Supertyp falsch. Es fehlt die Parameterliste System.out.println(FCGenerator.toFC(classes)); } } From bcee5e5209a667625338c0ea79f4f5be35ebe241 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Thu, 22 Mar 2018 11:41:59 +0100 Subject: [PATCH 60/65] Fehler im Parsen von Package beheben --- .../SyntaxTreeGenerator/SyntaxTreeGenerator.java | 14 ++++++++++++-- test/javFiles/Package.jav | 5 +++++ test/typeinference/JavaTXCompilerTest.java | 4 ++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 test/javFiles/Package.jav diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java index 72606713..b7f14f19 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java @@ -73,6 +73,7 @@ public class SyntaxTreeGenerator{ } public SourceFile convert(Java8Parser.CompilationUnitContext ctx, PackageCrawler packageCrawler) throws ClassNotFoundException{ + if(ctx.packageDeclaration()!=null)this.pkgName = convert(ctx.packageDeclaration()); List classes = new ArrayList<>(); Map imports = GatherNames.getImports(ctx, packageCrawler); this.imports = imports.keySet().stream().map(name -> reg.getName(name)).collect(Collectors.toSet()); @@ -89,6 +90,15 @@ public class SyntaxTreeGenerator{ return new SourceFile(this.pkgName, classes, this.imports); } + private String convert(Java8Parser.PackageDeclarationContext packageDeclarationContext) { + String ret = ""; + for(TerminalNode identifier : packageDeclarationContext.Identifier()){ + ret += identifier.getText()+"."; + } + ret = ret.substring(0, ret.length()-1); + return ret; + } + public Method convert(Java8Parser.MethodDeclarationContext methodDeclarationContext, JavaClassName parentClass, RefType superClass, GenericsRegistry generics) { Java8Parser.MethodHeaderContext header = methodDeclarationContext.methodHeader(); int modifiers = SyntaxTreeGenerator.convert(methodDeclarationContext.methodModifier()); @@ -165,8 +175,8 @@ public class SyntaxTreeGenerator{ } } String className = this.pkgName + (this.pkgName.length()>0?".":"") + ctx.Identifier().getText(); - JavaClassName name = reg.getName(className); - if(! name.toString().equals(className)){ + JavaClassName name = reg.getName(className); //Holt den Package Namen mit dazu + if(! name.toString().equals(className)){ //Kommt die Klasse schon in einem anderen Package vor? throw new TypeinferenceException("Name " + className + " bereits vorhanden in " + reg.getName(className).toString() ,ctx.getStart()); } diff --git a/test/javFiles/Package.jav b/test/javFiles/Package.jav new file mode 100644 index 00000000..bbc1e51d --- /dev/null +++ b/test/javFiles/Package.jav @@ -0,0 +1,5 @@ +package strucType.input; + +class Neu +{ +} \ No newline at end of file diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index 7c4c3582..ba004cb5 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -66,6 +66,10 @@ public class JavaTXCompilerTest { execute(new File(rootDirectory+"Matrix.jav")); } @Test + public void packageTests() throws IOException, ClassNotFoundException { + execute(new File(rootDirectory+"Package.jav")); + } + @Test public void vector() throws IOException, ClassNotFoundException { execute(new File(rootDirectory+"Vector.jav")); } From daf684deef0a3e07e8d93bf20a16d83a9c15fb89 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Fri, 23 Mar 2018 16:54:32 +0100 Subject: [PATCH 61/65] =?UTF-8?q?ASP=20Factory=20f=C3=BCr=20Algorithmus=20?= =?UTF-8?q?von=20Herr=20Gencay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sat/asp/model/ASPGencayRule.java | 25 +++ .../sat/asp/writer/ASPGencayFactory.java | 155 ++++++++++++++++++ test/asp/UnifyWithoutWildcards.java | 3 +- test/asp/gencay/GeneratorTest.java | 50 ++++++ 4 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java create mode 100644 src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java create mode 100644 test/asp/gencay/GeneratorTest.java diff --git a/src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java b/src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java new file mode 100644 index 00000000..867acd58 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java @@ -0,0 +1,25 @@ +package de.dhbwstuttgart.sat.asp.model; + +public enum ASPGencayRule { + ASP_PAIR_EQUALS_NAME("equals"), + ASP_PAIR_SMALLER_NAME("sub"), + ASP_PAIR_SMALLER_DOT_NAME("subEq"), + ASP_PARAMLIST_NAME("paramEq"), + ASP_FC_PARAMLIST_NAME("param"), + ASP_PARAMLIST_END_POINTER("null"), + ASP_TYPE("typeEq"), + ASP_FCTYPE("type"), + ASP_TYPE_VAR("var"), + ASP_GENERIC_VAR("pph"); + + private final String text; + + private ASPGencayRule(final String text) { + this.text = text; + } + + @Override + public String toString() { + return text; + } +} diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java new file mode 100644 index 00000000..5a56c7a7 --- /dev/null +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java @@ -0,0 +1,155 @@ +package de.dhbwstuttgart.sat.asp.writer; + +import de.dhbwstuttgart.exceptions.NotImplementedException; +import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator; +import de.dhbwstuttgart.sat.asp.ASPStringConverter; +import de.dhbwstuttgart.sat.asp.model.ASPGencayRule; +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.factory.NameGenerator; +import de.dhbwstuttgart.syntaxtree.type.*; +import de.dhbwstuttgart.typeinference.constraints.Constraint; +import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; +import de.dhbwstuttgart.typeinference.constraints.Pair; +import de.dhbwstuttgart.typeinference.unify.model.PairOperator; + +import java.sql.Ref; +import java.util.*; + +public class ASPGencayFactory implements TypeVisitor { + + ASPWriter writer = new ASPWriter(); + boolean isFCType = false; + + public static String generateASP(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException{ + ASPGencayFactory factory = new ASPGencayFactory(); + factory.convertFC(fcClasses); + List> constraints1 = constraints.cartesianProduct().iterator().next(); + for(Constraint constraint : constraints1){ + for(Pair p : constraint){ + factory.convertPair(p); + } + } + + return factory.writer.getASPFile(); + } + + private void convertFC(Collection classes) throws ClassNotFoundException { + Set fc = FCGenerator.toFC(classes); + isFCType = true; + for(Pair fcp : fc){ + generateTheta((RefType) fcp.TA1); + generateTheta((RefType) fcp.TA2); + convertPair(fcp); + } + isFCType = false; + } + + private void generateTheta(RefType t){ + String statement = "theta"+t.getParaList().size() + "("; + statement += ASPStringConverter.toConstant(t.getName()); + statement+=")"; + writer.add(new ASPStatement(statement)); + } + + private void convertPair(Pair p){ + String ls = p.TA1.acceptTV(this); + String rs = p.TA2.acceptTV(this); + ASPStatement pairStmt = null; + if(p.GetOperator().equals(PairOperator.SMALLERDOT)){ + pairStmt = makeStatement(ASPGencayRule.ASP_PAIR_SMALLER_DOT_NAME.toString(), ls, rs); + }else if(p.GetOperator().equals(PairOperator.EQUALSDOT)){ + pairStmt = makeStatement(ASPGencayRule.ASP_PAIR_EQUALS_NAME.toString(), ls, rs); + }else if(p.GetOperator().equals(PairOperator.SMALLER)){ + pairStmt = makeStatement(ASPGencayRule.ASP_PAIR_SMALLER_NAME.toString(), ls, rs); + }else throw new NotImplementedException(); + writer.add(pairStmt); + } + + private ASPStatement makeStatement(String rule, String... params){ + String stmt = rule + "("; + for(String param : params){ + stmt += param + ","; + } + stmt = stmt.substring(0,stmt.length()-1); + stmt += ")"; + return new ASPStatement(stmt); + } + + private String convertParameterlist(List pointers){ + if(pointers.size()==1)return pointers.get(0); + String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + Iterator it = pointers.iterator(); + String p = pointer; + String paramname = ASPGencayRule.ASP_PARAMLIST_NAME.toString(); + if(this.isFCType)paramname = ASPGencayRule.ASP_FC_PARAMLIST_NAME.toString(); + if(!it.hasNext()){ + return ASPGencayRule.ASP_PARAMLIST_END_POINTER.toString(); + } + while (it.hasNext()){ + ASPStatement stmt; + String type = it.next(); + String nextP = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + if(it.hasNext()){ + stmt = makeStatement(paramname, p, type, nextP); + }else{ + stmt = makeStatement(paramname, p, type, + ASPGencayRule.ASP_PARAMLIST_END_POINTER.toString()); + } + p = nextP; + writer.add(stmt); + } + return pointer; + } + + @Override + public String visit(RefType refType) { + String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + List params = new ArrayList<>(); + params = generateParameter(refType); + params.remove(0); //Das erste ist der eigentliche Typ kein parameter + String typeName = ASPStringConverter.toConstant(refType.getName()); + String ruleName = isFCType? ASPGencayRule.ASP_FCTYPE.toString(): ASPGencayRule.ASP_TYPE.toString(); + ASPStatement stmt = makeStatement(ruleName, pointer, typeName, convertParameterlist(params)); + writer.add(stmt); + return pointer; + } + + /** + * Erstellt die Parameterliste, wobei type auch schon als Parameter betrachtet wird. + */ + List generateParameter(RefType type){ + List ret = new ArrayList<>(); + ret.add(ASPStringConverter.toConstant(type.getName())); + for(RefTypeOrTPHOrWildcardOrGeneric param : type.getParaList()){ + if(param instanceof RefType){ + ret.addAll(generateParameter((RefType) param)); + }else if(param instanceof TypePlaceholder){ + ret.add(param.acceptTV(this)); + }else throw new NotImplementedException(); + } + return ret; + } + + @Override + public String visit(SuperWildcardType superWildcardType) { + throw new NotImplementedException(); + } + + @Override + public String visit(TypePlaceholder typePlaceholder) { + String name = ASPStringConverter.toConstant(typePlaceholder.getName()); + ASPStatement stmt = makeStatement(ASPGencayRule.ASP_TYPE_VAR.toString(), name); + writer.add(stmt); + return name; + } + + @Override + public String visit(ExtendsWildcardType extendsWildcardType) { + throw new NotImplementedException(); + } + + @Override + public String visit(GenericRefType genericRefType) { + throw new NotImplementedException(); + } +} diff --git a/test/asp/UnifyWithoutWildcards.java b/test/asp/UnifyWithoutWildcards.java index f4422ff7..6f69d639 100644 --- a/test/asp/UnifyWithoutWildcards.java +++ b/test/asp/UnifyWithoutWildcards.java @@ -81,7 +81,8 @@ public class UnifyWithoutWildcards { return new ArrayList<>(); } } - private Collection getInvolvedTPHS(ConstraintSet toTest) { + + protected Collection getInvolvedTPHS(ConstraintSet toTest) { List ret = new ArrayList<>(); toTest.map((Pair p)-> { ret.addAll(p.TA1.acceptTV(new TPHExtractor())); diff --git a/test/asp/gencay/GeneratorTest.java b/test/asp/gencay/GeneratorTest.java new file mode 100644 index 00000000..d7e457b2 --- /dev/null +++ b/test/asp/gencay/GeneratorTest.java @@ -0,0 +1,50 @@ +package asp.gencay; + +import asp.UnifyWithoutWildcards; +import de.dhbwstuttgart.parser.NullToken; +import de.dhbwstuttgart.parser.scope.JavaClassName; +import de.dhbwstuttgart.sat.asp.Clingo; +import de.dhbwstuttgart.sat.asp.parser.ASPParser; +import de.dhbwstuttgart.sat.asp.writer.ASPFactory; +import de.dhbwstuttgart.sat.asp.writer.ASPGencayFactory; +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; +import de.dhbwstuttgart.syntaxtree.type.RefType; +import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; +import de.dhbwstuttgart.syntaxtree.visual.ResultSetPrinter; +import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; +import de.dhbwstuttgart.typeinference.constraints.Pair; +import de.dhbwstuttgart.typeinference.result.ResultSet; +import de.dhbwstuttgart.typeinference.unify.model.PairOperator; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.*; +import java.util.concurrent.ArrayBlockingQueue; + +public class GeneratorTest extends UnifyWithoutWildcards{ + @Test + public void matrix() throws InterruptedException, IOException, ClassNotFoundException { + ConstraintSet testSet = new ConstraintSet<>(); + List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + List list2 = Arrays.asList(TypePlaceholder.fresh(new NullToken()),TypePlaceholder.fresh(new NullToken())); + RefType t1 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Matrix"), list1, new NullToken()); + RefType t2 = new RefType(new JavaClassName("java.util.HashMap"), list2, new NullToken()); + testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); + String resultSet = ASPGencayFactory.generateASP(testSet, this.getFC()); + System.out.println(resultSet); + } + + private Collection getFC() { + Set ret = new HashSet<>(); + ret.add(ASTFactory.createClass(Matrix.class)); + //ret.add(ASTFactory.createObjectClass()); + //ret.add(ASTFactory.createClass(java.util.List.class)); + return ret; + } +} + +class Matrix extends Vector> {} \ No newline at end of file From 4886976752ff34b0b6946562ee45561d0787b5cd Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Fri, 23 Mar 2018 17:20:15 +0100 Subject: [PATCH 62/65] Fehler in FCGenerator beheben --- .../SyntaxTreeGenerator/FCGenerator.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 211da847..01908522 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -43,8 +43,16 @@ public class FCGenerator { return getSuperTypes(forType, availableClasses, new HashMap<>()); } - //TODO: implements Interface auch als superklassen beachten - private static List getSuperTypes(ClassOrInterface forType, Collection availableClasses, HashMap gtvs) throws ClassNotFoundException { + /** + * + * @param forType + * @param availableClasses + * @param gtvs + * @return + * @throws ClassNotFoundException + */ + private static List getSuperTypes(ClassOrInterface forType, Collection availableClasses, + HashMap gtvs) throws ClassNotFoundException { List params = new ArrayList<>(); //Die GTVs, die in forType hinzukommen: HashMap newGTVs = new HashMap<>(); @@ -79,7 +87,7 @@ public class FCGenerator { 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 + //Hier vermerken, welche Typen in der Superklasse ausgetauscht werden müssen Iterator itGenParams = superClass.getGenerics().iterator(); Iterator itSetParams = superType.getParaList().iterator(); while(itSetParams.hasNext()){ @@ -89,7 +97,9 @@ public class FCGenerator { newGTVs.put(itGenParams.next().getName(), setSetType); } - RefTypeOrTPHOrWildcardOrGeneric superRefType = superType.acceptTV(new TypeExchanger(newGTVs)); + //Für den superType kann man nun zum Austauschen der Generics wieder die gtvs nehmen: + //Die newGTVs sind nur für den superClass ClassOrInterface welches möglicherweise per reflection geladen wurde abgestimmt + RefTypeOrTPHOrWildcardOrGeneric superRefType = superType.acceptTV(new TypeExchanger(gtvs)); RefTypeOrTPHOrWildcardOrGeneric t1 = new RefType(forType.getClassName(), params, new NullToken()); RefTypeOrTPHOrWildcardOrGeneric t2 = superRefType; From 87a2ed811767df6bc408c0eabad27ad154d8df41 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 27 Mar 2018 14:25:54 +0200 Subject: [PATCH 63/65] =?UTF-8?q?APS=20GeneratorTest.simple=20anf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sat/asp/writer/ASPGencayFactory.java | 53 +++++++++++++++---- test/asp/gencay/GeneratorTest.java | 15 +++++- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java index 5a56c7a7..77ea36f3 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java @@ -12,11 +12,18 @@ import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; import de.dhbwstuttgart.typeinference.constraints.Pair; import de.dhbwstuttgart.typeinference.unify.model.PairOperator; -import java.sql.Ref; import java.util.*; -public class ASPGencayFactory implements TypeVisitor { +public class ASPGencayFactory implements TypeVisitor { + /* TODO: + * Alle TPHs müssen als var(tph) definiert sein + * Wenn es eine Variable ist, dann direkt in die type-Regel schreiben: type(p, type, tph) + * Für die FCTypen eindeutige Namen für die pph-Regeln + * (ergibt sich von selbst, weil man einfach den Namen der TPH in der FC verwenden kann) + * paramOrder wird benötigt! + * + */ ASPWriter writer = new ASPWriter(); boolean isFCType = false; @@ -45,15 +52,14 @@ public class ASPGencayFactory implements TypeVisitor { } private void generateTheta(RefType t){ - String statement = "theta"+t.getParaList().size() + "("; - statement += ASPStringConverter.toConstant(t.getName()); - statement+=")"; - writer.add(new ASPStatement(statement)); + String rule = "theta"+t.getParaList().size() ; + String name = ASPStringConverter.toConstant(t.getName()); + writer.add(makeStatement(rule, name)); } private void convertPair(Pair p){ - String ls = p.TA1.acceptTV(this); - String rs = p.TA2.acceptTV(this); + String ls = generateFCType((RefType) p.TA1); + String rs = generateFCType((RefType) p.TA2); ASPStatement pairStmt = null; if(p.GetOperator().equals(PairOperator.SMALLERDOT)){ pairStmt = makeStatement(ASPGencayRule.ASP_PAIR_SMALLER_DOT_NAME.toString(), ls, rs); @@ -65,6 +71,24 @@ public class ASPGencayFactory implements TypeVisitor { writer.add(pairStmt); } + private String generateFCType(RefType refType){ + String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + String paramPointer = ASPGencayRule.ASP_PARAMLIST_END_POINTER.toString(); + if(refType.getParaList().size() > 1)throw new NotImplementedException(); + if(refType.getParaList().size() > 0){ + TypePlaceholder typePlaceholder = (TypePlaceholder) refType.getParaList().get(0); + String pphName = ASPStringConverter.toConstant(typePlaceholder.getName()); + ASPStatement paramStmt = makeStatement(ASPGencayRule.ASP_GENERIC_VAR.toString(), + pointer, pphName); + writer.add(paramStmt); + } + String typeName = ASPStringConverter.toConstant(refType.getName()); + String ruleName = isFCType? ASPGencayRule.ASP_FCTYPE.toString(): ASPGencayRule.ASP_TYPE.toString(); + ASPStatement stmt = makeStatement(ruleName, pointer, typeName, paramPointer); + writer.add(stmt); + return pointer; + } + private ASPStatement makeStatement(String rule, String... params){ String stmt = rule + "("; for(String param : params){ @@ -76,7 +100,7 @@ public class ASPGencayFactory implements TypeVisitor { } private String convertParameterlist(List pointers){ - if(pointers.size()==1)return pointers.get(0); + //if(pointers.size()==1)return pointers.get(0); String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); Iterator it = pointers.iterator(); String p = pointer; @@ -104,7 +128,7 @@ public class ASPGencayFactory implements TypeVisitor { @Override public String visit(RefType refType) { String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); - List params = new ArrayList<>(); + List params = null; params = generateParameter(refType); params.remove(0); //Das erste ist der eigentliche Typ kein parameter String typeName = ASPStringConverter.toConstant(refType.getName()); @@ -138,7 +162,14 @@ public class ASPGencayFactory implements TypeVisitor { @Override public String visit(TypePlaceholder typePlaceholder) { String name = ASPStringConverter.toConstant(typePlaceholder.getName()); - ASPStatement stmt = makeStatement(ASPGencayRule.ASP_TYPE_VAR.toString(), name); + + ASPStatement stmt = null; + if(isFCType){ + stmt = makeStatement(ASPGencayRule.ASP_GENERIC_VAR.toString(), name); + } else { + stmt = makeStatement(ASPGencayRule.ASP_TYPE_VAR.toString(), name); + } + writer.add(stmt); return name; } diff --git a/test/asp/gencay/GeneratorTest.java b/test/asp/gencay/GeneratorTest.java index d7e457b2..2c9fc46f 100644 --- a/test/asp/gencay/GeneratorTest.java +++ b/test/asp/gencay/GeneratorTest.java @@ -27,7 +27,20 @@ import java.util.concurrent.ArrayBlockingQueue; public class GeneratorTest extends UnifyWithoutWildcards{ @Test - public void matrix() throws InterruptedException, IOException, ClassNotFoundException { + public void simple() throws ClassNotFoundException { + ConstraintSet testSet = new ConstraintSet<>(); + List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + List list2 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); + RefType t1 = new RefType(new JavaClassName("java.util.List"), list1, new NullToken()); + RefType t2 = new RefType(new JavaClassName("java.util.List"), list2, new NullToken()); + testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT)); + String resultSet = ASPGencayFactory.generateASP(testSet, + new HashSet<>(Arrays.asList(ASTFactory.createClass(List.class)))); + System.out.println(resultSet); + } + + @Test + public void matrix() throws ClassNotFoundException { ConstraintSet testSet = new ConstraintSet<>(); List list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken())); List list2 = Arrays.asList(TypePlaceholder.fresh(new NullToken()),TypePlaceholder.fresh(new NullToken())); From 000c16b90779cddf914bc930d1f515aafbe0ee3c Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 27 Mar 2018 23:56:12 +0200 Subject: [PATCH 64/65] Gencoy ASP Generator implementieren --- .../sat/asp/model/ASPGencayRule.java | 3 +- .../sat/asp/writer/ASPGencayFactory.java | 128 ++++++++++++++---- .../sat/asp/writer/ASPWriter.java | 6 + 3 files changed, 111 insertions(+), 26 deletions(-) diff --git a/src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java b/src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java index 867acd58..e16592cc 100644 --- a/src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java +++ b/src/de/dhbwstuttgart/sat/asp/model/ASPGencayRule.java @@ -10,7 +10,8 @@ public enum ASPGencayRule { ASP_TYPE("typeEq"), ASP_FCTYPE("type"), ASP_TYPE_VAR("var"), - ASP_GENERIC_VAR("pph"); + ASP_GENERIC_VAR("pph"), + ASP_PARAMLIST_ORDER("paramOrder"); private final String text; diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java index 77ea36f3..11408c25 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPGencayFactory.java @@ -22,11 +22,39 @@ public class ASPGencayFactory implements TypeVisitor { * Für die FCTypen eindeutige Namen für die pph-Regeln * (ergibt sich von selbst, weil man einfach den Namen der TPH in der FC verwenden kann) * paramOrder wird benötigt! - * + * Nur bei parameterlisten > 1 + * paramOrder(paralistPointer, parameter, num) + * (ähnlich meiner paramNum) + * Trennung von FC und Eq: + * sub -> type -> param + * ...Eq -> typeEq -> paramEq + * type..(_,_,_p): p kann sein: + * 1. Variable + * 2. ParameterPointer + * 3. null */ ASPWriter writer = new ASPWriter(); boolean isFCType = false; + private static List generateVar(ConstraintSet constraints){ + List ret = new ArrayList<>(); + for(TypePlaceholder tph : getInvolvedTPHS(constraints)){ + ret.add(makeStatement(ASPGencayRule.ASP_TYPE_VAR.toString(), + ASPStringConverter.toConstant(tph.getName()))); + } + return ret; + } + + protected static Collection getInvolvedTPHS(ConstraintSet toTest) { + List ret = new ArrayList<>(); + toTest.map((Pair p)-> { + ret.addAll(p.TA1.acceptTV(new TPHExtractor())); + ret.addAll(p.TA2.acceptTV(new TPHExtractor())); + return p; + }); + return ret; + } + public static String generateASP(ConstraintSet constraints, Collection fcClasses) throws ClassNotFoundException{ ASPGencayFactory factory = new ASPGencayFactory(); factory.convertFC(fcClasses); @@ -36,6 +64,7 @@ public class ASPGencayFactory implements TypeVisitor { factory.convertPair(p); } } + factory.writer.addAll(generateVar(constraints)); return factory.writer.getASPFile(); } @@ -58,8 +87,8 @@ public class ASPGencayFactory implements TypeVisitor { } private void convertPair(Pair p){ - String ls = generateFCType((RefType) p.TA1); - String rs = generateFCType((RefType) p.TA2); + String ls = p.TA1.acceptTV(this); + String rs = p.TA2.acceptTV(this); ASPStatement pairStmt = null; if(p.GetOperator().equals(PairOperator.SMALLERDOT)){ pairStmt = makeStatement(ASPGencayRule.ASP_PAIR_SMALLER_DOT_NAME.toString(), ls, rs); @@ -71,25 +100,7 @@ public class ASPGencayFactory implements TypeVisitor { writer.add(pairStmt); } - private String generateFCType(RefType refType){ - String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); - String paramPointer = ASPGencayRule.ASP_PARAMLIST_END_POINTER.toString(); - if(refType.getParaList().size() > 1)throw new NotImplementedException(); - if(refType.getParaList().size() > 0){ - TypePlaceholder typePlaceholder = (TypePlaceholder) refType.getParaList().get(0); - String pphName = ASPStringConverter.toConstant(typePlaceholder.getName()); - ASPStatement paramStmt = makeStatement(ASPGencayRule.ASP_GENERIC_VAR.toString(), - pointer, pphName); - writer.add(paramStmt); - } - String typeName = ASPStringConverter.toConstant(refType.getName()); - String ruleName = isFCType? ASPGencayRule.ASP_FCTYPE.toString(): ASPGencayRule.ASP_TYPE.toString(); - ASPStatement stmt = makeStatement(ruleName, pointer, typeName, paramPointer); - writer.add(stmt); - return pointer; - } - - private ASPStatement makeStatement(String rule, String... params){ + private static ASPStatement makeStatement(String rule, String... params){ String stmt = rule + "("; for(String param : params){ stmt += param + ","; @@ -125,8 +136,38 @@ public class ASPGencayFactory implements TypeVisitor { return pointer; } + //Wird zum erstellen der pph(..) Regeln gebraucht + private String currentFCTypePointer = ""; @Override public String visit(RefType refType) { + String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); + currentFCTypePointer = pointer; + String paramPointer = ASPGencayRule.ASP_PARAMLIST_END_POINTER.toString(); + if(refType.getParaList().size() == 1 ){ + if(refType.getParaList().get(0) instanceof TypePlaceholder){ + TypePlaceholder typePlaceholder = (TypePlaceholder) refType.getParaList().get(0); + paramPointer = typePlaceholder.acceptTV(this); + } + }else{ + List params = null; + params = generateParameter(refType); + params.remove(0); + paramPointer = convertParameterlist(params); + if(refType.getParaList().size()>1){ + //paramOrder generieren: + for(String param : params) { + ASPStatement pOstmt = makeStatement(ASPGencayRule.ASP_PARAMLIST_ORDER.toString(), + paramPointer, param); + writer.add(pOstmt); + } + } + } + String typeName = ASPStringConverter.toConstant(refType.getName()); + String ruleName = isFCType? ASPGencayRule.ASP_FCTYPE.toString(): ASPGencayRule.ASP_TYPE.toString(); + ASPStatement stmt = makeStatement(ruleName, pointer, typeName, paramPointer); + writer.add(stmt); + return pointer; + /* String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName()); List params = null; params = generateParameter(refType); @@ -136,12 +177,16 @@ public class ASPGencayFactory implements TypeVisitor { ASPStatement stmt = makeStatement(ruleName, pointer, typeName, convertParameterlist(params)); writer.add(stmt); return pointer; + */ } /** * Erstellt die Parameterliste, wobei type auch schon als Parameter betrachtet wird. + * Die RefTypes werden nicht zu extra type-Regeln umgewandelt. Es wird nur ihr Name als Konstante benutzt + * Das funktioniert, weil nacher das ParamOrder zuteilt, welche Typen zusammenhängen. + * Diese funktion nur verwenden, wenn auch ein paramOrder generiert wird */ - List generateParameter(RefType type){ + private List generateParameter(RefType type){ List ret = new ArrayList<>(); ret.add(ASPStringConverter.toConstant(type.getName())); for(RefTypeOrTPHOrWildcardOrGeneric param : type.getParaList()){ @@ -165,7 +210,8 @@ public class ASPGencayFactory implements TypeVisitor { ASPStatement stmt = null; if(isFCType){ - stmt = makeStatement(ASPGencayRule.ASP_GENERIC_VAR.toString(), name); + stmt = makeStatement(ASPGencayRule.ASP_GENERIC_VAR.toString(), + currentFCTypePointer, name); } else { stmt = makeStatement(ASPGencayRule.ASP_TYPE_VAR.toString(), name); } @@ -183,4 +229,36 @@ public class ASPGencayFactory implements TypeVisitor { public String visit(GenericRefType genericRefType) { throw new NotImplementedException(); } -} + + private static class TPHExtractor implements TypeVisitor>{ + @Override + public List visit(RefType refType) { + ArrayList ret = new ArrayList<>(); + for(RefTypeOrTPHOrWildcardOrGeneric param : refType.getParaList()){ + ret.addAll(param.acceptTV(this)); + } + return ret; + } + + @Override + public List visit(SuperWildcardType superWildcardType) { + return superWildcardType.getInnerType().acceptTV(this); + } + + @Override + public List visit(TypePlaceholder typePlaceholder) { + return Arrays.asList(typePlaceholder); + } + + @Override + public List visit(ExtendsWildcardType extendsWildcardType) { + return extendsWildcardType.getInnerType().acceptTV(this); + } + + @Override + public List visit(GenericRefType genericRefType) { + return new ArrayList<>(); + } + } + +} \ No newline at end of file diff --git a/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java b/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java index e5e60882..57aef860 100644 --- a/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java +++ b/src/de/dhbwstuttgart/sat/asp/writer/ASPWriter.java @@ -1,6 +1,8 @@ package de.dhbwstuttgart.sat.asp.writer; +import java.util.Collection; import java.util.HashSet; +import java.util.List; public class ASPWriter { @@ -17,4 +19,8 @@ public class ASPWriter { } return ret; } + + public void addAll(Collection aspStatements) { + content.addAll(aspStatements); + } } From 22ff521d08790c7a336d3ca74bcda6955ddb332f Mon Sep 17 00:00:00 2001 From: Andreas Stadelmeier Date: Wed, 28 Mar 2018 15:35:04 +0200 Subject: [PATCH 65/65] =?UTF-8?q?Aufr=C3=A4umen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java index 01908522..c4fc5b58 100644 --- a/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java +++ b/src/de/dhbwstuttgart/parser/SyntaxTreeGenerator/FCGenerator.java @@ -161,8 +161,6 @@ public class FCGenerator { public RefTypeOrTPHOrWildcardOrGeneric visit(GenericRefType genericRefType) { if(! gtvs.containsKey(genericRefType.getParsedName())) throw new DebugException("Dieser Fall darf nicht auftreten"); - //TODO: Diesen Dirty-Hack beseitigen. Fehler tritt bei java.lang.invoke.LambdaFormEditor$Transform$Kind auf. - //return UnifyTypeFactory.convert(ASTFactory.createObjectType()); return gtvs.get(genericRefType.getParsedName()); }