diff --git a/pom.xml b/pom.xml index b90b76e25..f6a1fc87b 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ http://maven.apache.org/maven-v4_0_0.xsd"> JavaTXcompiler jar - 0.1 + 0.2 JavaTXcompiler http://maven.apache.org @@ -127,7 +127,7 @@ http://maven.apache.org/maven-v4_0_0.xsd"> - de.dhbwstuttgart:JavaTXcompiler:0.1 + de.dhbwstuttgart:JavaTXcompiler:0.2 org.reflections:reflections:0.9.11 diff --git a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java index fec01c104..8ae7da1eb 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -29,6 +29,7 @@ import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH; import de.dhbwstuttgart.bytecode.utilities.NormalConstructor; import de.dhbwstuttgart.bytecode.utilities.NormalMethod; import de.dhbwstuttgart.bytecode.utilities.Simplify; +import de.dhbwstuttgart.bytecode.utilities.SimplifyResult; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal; import de.dhbwstuttgart.syntaxtree.*; import de.dhbwstuttgart.syntaxtree.statement.Literal; @@ -81,6 +82,17 @@ public class BytecodeGen implements ASTVisitor { ArrayList methodNameAndParamsT = new ArrayList<>(); + private HashMap simplifyResults = new HashMap<>(); + private List> simplifyResultsList = new ArrayList<>(); + + public List> getSimplifyResultsList() { + return simplifyResultsList; + } + + public void setSimplifyResultsList(List> simplifyResultsList) { + this.simplifyResultsList = simplifyResultsList; + } + public BytecodeGen(HashMap classFiles, List listOfResultSets,SourceFile sf ,String path) { this.classFiles = classFiles; this.listOfResultSets = listOfResultSets; @@ -94,6 +106,7 @@ public class BytecodeGen implements ASTVisitor { System.out.println("in Class: " + cl.getClassName().toString()); BytecodeGen classGen = new BytecodeGen(classFiles, listOfResultSets, sf, path); cl.accept(classGen); + simplifyResultsList.add(classGen.getSimplifyResults()); classGen.writeClass(cl.getClassName().toString()); } } @@ -173,6 +186,10 @@ public class BytecodeGen implements ASTVisitor { right = null; } } + + SimplifyResult sRes = new SimplifyResult(consClass, tphsClass, new HashMap<>()); + simplifyResults.put(className, sRes); + Signature signature = new Signature(classOrInterface, genericsAndBounds,commonPairs,tphsClass, consClass); sig = signature.toString(); System.out.println("Signature: => " + sig); @@ -339,7 +356,7 @@ public class BytecodeGen implements ASTVisitor { System.out.println(acc); /*Prüfe, ob die Rückgabe-Type der Methode eine Type-Variable ist*/ - boolean hasGenInParameterList = genericsAndBounds.containsKey(retType) || retType.subSequence(0, 4).equals("TPH ") || + boolean hasGenInParameterList = genericsAndBounds.containsKey(retType) || retType.contains("TPH ") || resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToSignature()).contains("<"); /*Wenn die Rückgabe-Type eine Typ-variable ist, erzeuge direkt die Signature, wenn nicht, * prüfe, ob einer der Parameter Typ-Variable als Typ hat*/ @@ -347,7 +364,7 @@ public class BytecodeGen implements ASTVisitor { for(String paramName : methodParamsAndTypes.keySet()) { String typeOfParam = methodParamsAndTypes.get(paramName).acceptTV(new TypeToDescriptor()); String sigOfParam = methodParamsAndTypes.get(paramName).acceptTV(new TypeToSignature()); - if(genericsAndBounds.containsKey(typeOfParam)||typeOfParam.substring(0, 4).equals("TPH ")||sigOfParam.contains("<")) { + if(genericsAndBounds.containsKey(typeOfParam)||typeOfParam.contains("TPH ")||sigOfParam.contains("<")) { hasGenInParameterList = true; break; } @@ -370,6 +387,14 @@ public class BytecodeGen implements ASTVisitor { // ArrayList pairs = simplifyPairs(method.name,tphExtractor.allPairs,tphExtractor.allCons); Signature signature = new Signature(method, genericsAndBoundsMethod, genericsAndBounds,methodParamsAndTypes,resultSet,constraints); sig = signature.toString(); + if(simplifyResults.containsKey(className)) { + simplifyResults.get(className).getMethodsConstraints().put(methParamTypes, constraints); + } else { + SimplifyResult sRes = new SimplifyResult(new ArrayList<>(), new ArrayList<>(), new HashMap<>()); + sRes.getMethodsConstraints().put(methParamTypes, constraints); + simplifyResults.put(className, sRes); + } + } System.out.println(method.getName()+" ==> "+sig); NormalMethod meth = new NormalMethod(method,genericsAndBounds,genericsAndBoundsMethod,hasGen); @@ -386,6 +411,10 @@ public class BytecodeGen implements ASTVisitor { mv.visitEnd(); } + public HashMap getSimplifyResults() { + return simplifyResults; + } + @Override public void visit(ParameterList formalParameters) { paramsAndLocals = new HashMap<>(); diff --git a/src/main/java/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java b/src/main/java/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java index 07471ae1b..3fd10cf5e 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/descriptor/DescriptorToString.java @@ -1,5 +1,6 @@ package de.dhbwstuttgart.bytecode.descriptor; +import java.util.HashMap; import java.util.Iterator; import org.objectweb.asm.Type; @@ -44,17 +45,28 @@ public class DescriptorToString implements DescriptorVisitor{ if(method.hasGen()) { String fpDesc = fp.getType().acceptTV(new TypeToDescriptor()); if(method.getGenericsAndBoundsMethod().containsKey(fpDesc)) { - desc += "L"+method.getGenericsAndBoundsMethod().get(fpDesc)+ ";"; + String bound = getBound(fpDesc, method.getGenericsAndBoundsMethod()); + desc += "L"+bound+ ";"; }else if(method.getGenericsAndBounds().containsKey(fpDesc)){ - desc += "L"+method.getGenericsAndBounds().get(fpDesc)+ ";"; + String bound = getBound(fpDesc, method.getGenericsAndBounds()); + desc += "L"+bound+ ";"; }else { // desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";"; String resType = resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()); - if(resType.subSequence(0, 4).equals("TPH ")) { + if(resType.contains("TPH ")/*resType.subSequence(0, 4).equals("TPH ")*/) { // Bound ist immer Object desc += "L"+Type.getInternalName(Object.class)+ ";"; } else { - desc += "L"+resType+ ";"; + // TODO:: + if(method.getGenericsAndBounds().containsKey(resType)) { + String bound = getBound(resType, method.getGenericsAndBounds()); + desc += "L"+bound+ ";"; + }else if(method.getGenericsAndBoundsMethod().containsKey(resType)) { + String bound = getBound(resType, method.getGenericsAndBoundsMethod()); + desc += "L"+bound+ ";"; + } else { + desc += "L"+resType+ ";"; + } } } } @@ -78,11 +90,21 @@ public class DescriptorToString implements DescriptorVisitor{ desc += ")L"+method.getGenericsAndBounds().get(ret)+ ";"; }else { String resType = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor()); - if(resType.subSequence(0, 4).equals("TPH ")) { + if(resType.contains("TPH ")/*resType.subSequence(0, 4).equals("TPH ")*/) { // desc += ")" + "L"+method.getGenericsAndBoundsMethod().get(resType.substring(4)+"$")+ ";"; desc += ")" + "L"+Type.getInternalName(Object.class)+ ";"; } else { - desc += ")" + "L"+resType+ ";"; + // TODO:: + if(method.getGenericsAndBounds().containsKey(resType)) { + String bound = getBound(resType, method.getGenericsAndBounds()); + desc += ")L"+bound+ ";"; + }else if(method.getGenericsAndBoundsMethod().containsKey(resType)) { + String bound = getBound(resType, method.getGenericsAndBoundsMethod()); + desc += ")L"+bound+ ";"; + } else { + desc += ")L"+resType+ ";"; + } +// desc += ")" + "L"+resType+ ";"; } } }else { @@ -93,6 +115,15 @@ public class DescriptorToString implements DescriptorVisitor{ return desc; } + private String getBound(String fpDesc, HashMap genericsAndBounds) { + String start = genericsAndBounds.get(fpDesc); + while(genericsAndBounds.containsKey(start)) { + start = genericsAndBounds.get(start); + } + + return start; + } + @Override public String visit(NormalConstructor constructor) { String desc = "("; @@ -131,7 +162,7 @@ public class DescriptorToString implements DescriptorVisitor{ while(itr.hasNext()) { FormalParameter fp = itr.next(); String d = resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()); - if(d.substring(0, 4).equals("TPH ") ||d.contains("<")) { + if(d.contains("TPH ") ||d.contains("<")) { desc += "L"+Type.getInternalName(Object.class)+ ";"; }else { desc = desc + "L"+ d + ";"; @@ -140,7 +171,7 @@ public class DescriptorToString implements DescriptorVisitor{ String retType = resultSet.resolveType(lambdaExpression.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor()); - if(retType.substring(0, 4).equals("TPH ")|| retType.contains("<")){ + if(retType.contains("TPH ")|| retType.contains("<")){ desc += ")L"+Type.getInternalName(Object.class)+ ";"; }else { desc = desc + ")"+"L"+retType+";"; @@ -156,7 +187,7 @@ public class DescriptorToString implements DescriptorVisitor{ RefTypeOrTPHOrWildcardOrGeneric rt = itr.next(); String d = resultSet.resolveType(rt).resolvedType.acceptTV(new TypeToDescriptor()); - if(d.substring(0, 4).equals("TPH ") ||d.contains("<")) { + if(d.contains("TPH ") ||d.contains("<")) { desc += "L"+Type.getInternalName(Object.class)+ ";"; }else { desc += "L"+ d + ";"; @@ -165,7 +196,7 @@ public class DescriptorToString implements DescriptorVisitor{ } String retType = resultSet.resolveType(samMethod.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor()); - if(retType.substring(0, 4).equals("TPH ")|| retType.contains("<")){ + if(retType.contains("TPH ")|| retType.contains("<")){ desc += ")L"+Type.getInternalName(Object.class)+ ";"; }else { desc = desc + ")"+"L"+retType+";"; @@ -179,7 +210,7 @@ public class DescriptorToString implements DescriptorVisitor{ for(Expression e : methodFromMethodCall.getArgList().getArguments()) { String d = resultSet.resolveType(e.getType()).resolvedType.acceptTV(new TypeToDescriptor()); - if(d.substring(0, 4).equals("TPH ") ||d.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")) { + if(d.contains("TPH ") ||d.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")) { desc += "L"+Type.getInternalName(Object.class)+ ";"; }else { if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(d)) { @@ -196,7 +227,7 @@ public class DescriptorToString implements DescriptorVisitor{ System.out.println("DescriptorToString retType = " + retType); if(retType.equals("void")) { desc += ")V"; - }else if(retType.substring(0, 4).equals("TPH ")|| retType.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")){ + }else if(retType.contains("TPH ")|| retType.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")){ desc += ")L"+Type.getInternalName(Object.class)+ ";"; }else { if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(retType)) { diff --git a/src/main/java/de/dhbwstuttgart/bytecode/signature/Signature.java b/src/main/java/de/dhbwstuttgart/bytecode/signature/Signature.java index ce0b4462c..ca191b7d8 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/signature/Signature.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -290,7 +290,8 @@ public class Signature { break; case "GRT": GenericRefType g = (GenericRefType) t; - sv.visitTypeVariable(g.acceptTV(new TypeToSignature()).substring(1)); +// sv.visitTypeVariable(g.acceptTV(new TypeToSignature()).substring(1)); + sv.visitTypeVariable(g.acceptTV(new TypeToSignature())); break; case "TPH": RefTypeOrTPHOrWildcardOrGeneric r = resultSet.resolveType(t).resolvedType; @@ -301,16 +302,27 @@ public class Signature { // das braucht man nicht es reicht: sv.visitTypeVariable(r.acceptTV(new TypeToSignature()) // String sig2 = r.acceptTV(new TypeToSignature()); - String eqTPH = getEqualTPH(methodConstraints, sig2.substring(1, sig2.length()-1))+"$"; - if(!(r instanceof TypePlaceholder)) { + if(r instanceof GenericRefType) { + sv.visitTypeVariable(sig2); + }else if(!(r instanceof TypePlaceholder)) { if(sig2.contains("$$")) { System.out.println(" Signature FUN$$: "+r); sv.visitInterface().visitClassType(sig2.substring(1, sig2.length())); } else { - sv.visitClassType(sig2.substring(1, sig2.length())); + // Kann zwischen GenericRefType und RefType nicht unterscheiden + // Deswegen wird immer geprüft, ob der Name in Generic Maps liegt + String n = sig2.substring(1, sig2.length()-1); +// if(genericsAndBoundsMethod.containsKey(n) || genericsAndBounds.containsKey(n)) { +// sv.visitTypeVariable(n); +// } else { + sv.visitClassType(n); + sv.visitEnd(); +// } +// sv.visitClassType(n); } } else { + String eqTPH = getEqualTPH(methodConstraints, sig2.substring(1, sig2.length()-1))+"$"; System.out.println(r.getClass()+" Signature TPH: "+r.acceptTV(new TypeToSignature())); sv.visitTypeVariable(eqTPH); } @@ -456,10 +468,15 @@ public class Signature { String boundDesc = b.acceptTV(new TypeToDescriptor()); // System.out.println("GetBounds: " + boundDesc); // Ensure that <...> extends java.lang.Object OR ... - sw.visitClassBound().visitClassType(boundDesc); + if(b instanceof GenericRefType) { + sw.visitClassBound().visitTypeVariable(boundDesc); + } else { + sw.visitClassBound().visitClassType(boundDesc); + sw.visitClassBound().visitEnd(); + } genAndBounds.put(g.getName(), boundDesc); } - sw.visitClassBound().visitEnd(); +// sw.visitClassBound().visitEnd(); } public String toString() { diff --git a/src/main/java/de/dhbwstuttgart/bytecode/utilities/SimplifyResult.java b/src/main/java/de/dhbwstuttgart/bytecode/utilities/SimplifyResult.java new file mode 100644 index 000000000..96feb4dce --- /dev/null +++ b/src/main/java/de/dhbwstuttgart/bytecode/utilities/SimplifyResult.java @@ -0,0 +1,42 @@ +/** + * + */ +package de.dhbwstuttgart.bytecode.utilities; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +import de.dhbwstuttgart.bytecode.constraint.TPHConstraint; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; + +/** + * @author fayez + * + */ +public class SimplifyResult { + private final ArrayList classConstraints; + private final ArrayList tphsClass; + private final HashMap>> methodsConstraints; + + public SimplifyResult(ArrayList classConstraints, ArrayList tphsClass, + HashMap>> methodsConstraints) { + super(); + this.classConstraints = classConstraints; + this.tphsClass = tphsClass; + this.methodsConstraints = methodsConstraints; + } + + public ArrayList getClassConstraints() { + return classConstraints; + } + + public HashMap>> getMethodsConstraints() { + return methodsConstraints; + } + + public ArrayList getTphsClass() { + return tphsClass; + } + +} diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index 19b218f69..c8c9802b9 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.core; import de.dhbwstuttgart.bytecode.BytecodeGen; +import de.dhbwstuttgart.bytecode.utilities.SimplifyResult; import de.dhbwstuttgart.environment.CompilationEnvironment; import de.dhbwstuttgart.parser.JavaTXParser; import de.dhbwstuttgart.parser.NullToken; @@ -58,7 +59,14 @@ public class JavaTXCompiler { Boolean resultmodel = false; public final Map sourceFiles = new HashMap<>(); Boolean log = true; //gibt an ob ein Log-File nach System.getProperty("user.dir")+"src/test/java/logFiles" geschrieben werden soll? - + + /** + * Äußerste Liste der Source-Files. + * Danach Liste der Klassen in Source File. + * Danach Map Klassenname + */ + private List>> simplifyResultsSF = new ArrayList<>(); + public JavaTXCompiler(File sourceFile) throws IOException, ClassNotFoundException { this(Arrays.asList(sourceFile)); } @@ -650,6 +658,7 @@ public class JavaTXCompiler { BytecodeGen bytecodeGen = new BytecodeGen(classFiles,typeinferenceResult,sf,path); // BytecodeGen bytecodeGen = new BytecodeGen(classFiles,typeinferenceResult.get(0)); bytecodeGen.visit(sf); + this.simplifyResultsSF.add(bytecodeGen.getSimplifyResultsList()); this.writeClassFile(bytecodeGen.getClassFiles(), path); } } @@ -666,4 +675,8 @@ public class JavaTXCompiler { System.out.println(name+".class file generated"); } } + + public List>> getSimplifyResults() { + return simplifyResultsSF; + } } diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java index 7166d0c4c..4241af341 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java @@ -100,7 +100,7 @@ public class UnifyTypeFactory { } ret = new ReferenceType(t.getName().toString(),new TypeParams(params)); }else{ - ret = new ReferenceType(t.getName().toString()); + ret = new ReferenceType(t.getName().toString(), false); } return ret; } @@ -136,7 +136,7 @@ public class UnifyTypeFactory { } public static UnifyType convert(GenericRefType t, Boolean innerType){ - return new ReferenceType(t.getParsedName()); + return new ReferenceType(t.getParsedName(), true); } public static UnifyType convert(WildcardType t, Boolean innerType){ @@ -222,12 +222,15 @@ public class UnifyTypeFactory { return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder)tl, (RefType) tr); }else if(tr instanceof WildcardType){ return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder)tl, (WildcardType) tr); + }else if(tr instanceof GenericRefType){ + return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder)tl, (GenericRefType) tr); }else throw new NotImplementedException(); }else throw new NotImplementedException(); } public static RefTypeOrTPHOrWildcardOrGeneric convert(ReferenceType t, Map tphs) { if(JavaClassName.Void.equals(t.getName()))return new Void(new NullToken()); + if (t.isGenTypeVar()) return new GenericRefType(t.getName(),new NullToken()); RefType ret = new RefType(new JavaClassName(t.getName()),convert(t.getTypeParams(), tphs),new NullToken()); return ret; } diff --git a/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java b/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java index 665bd3803..04ee340c4 100644 --- a/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java +++ b/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsert.java @@ -1,9 +1,6 @@ package de.dhbwstuttgart.typedeployment; -import org.antlr.v4.runtime.Token; - import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Set; diff --git a/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java b/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java index 8834f8596..a2abf30be 100644 --- a/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java +++ b/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java @@ -32,7 +32,7 @@ public class TypeInsertFactory { ResolvedType resolvedType = resultSet.resolveType(type); TypeInsertPoint insertPoint = new TypeInsertPoint(offset, new TypeToInsertString(resolvedType.resolvedType).insert); - return new TypeInsert(insertPoint, new HashSet<>(Arrays.asList(createGenericInsert(resolvedType.additionalGenerics, cl, m)))); + return new TypeInsert(insertPoint, new HashSet<>()); } private static TypeInsertPoint createGenericInsert(Set toInsert, ClassOrInterface cl, Method m){ diff --git a/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertPoint.java b/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertPoint.java index 14c86b658..2551260ba 100644 --- a/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertPoint.java +++ b/src/main/java/de/dhbwstuttgart/typedeployment/TypeInsertPoint.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.stream.Collectors; public class TypeInsertPoint { - public final Token point; + public Token point; private String insertString; public TypeInsertPoint(Token point, String toInsert){ @@ -28,6 +28,14 @@ public class TypeInsertPoint { return insertString; } + public Token getToken() { + return this.point; + } + + public void setToken(Token point) { + this.point = point; + } + /* PL 2018-06-19 * Zwei TypeInsertPoint's sind gleich, wenn ihre point's gleich sind * eingefuegt damit man TypeReplaceMarker vergleichen kann diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java index 5b17538e0..4627dc30c 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java @@ -11,28 +11,45 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor; * @author Florian Steurer * */ -public final class ReferenceType extends UnifyType { +public class ReferenceType extends UnifyType { /** * The buffered hashCode */ private final int hashCode; + /** + * gibt an, ob der ReferenceType eine generische Typvariable ist + */ + private final boolean genericTypeVar; + public UnifyType accept(UnifyTypeVisitor visitor, T ht) { return visitor.visit(this, ht); } + public ReferenceType(String name, Boolean genericTypeVar) { + super(name, new TypeParams()); + hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode(); + this.genericTypeVar = genericTypeVar; + } + public ReferenceType(String name, UnifyType... params) { super(name, new TypeParams(params)); hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode(); + genericTypeVar = false; } public ReferenceType(String name, TypeParams params) { super(name, params); hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode(); + genericTypeVar = false; } + public boolean isGenTypeVar () { + return genericTypeVar; + } + @Override Set smArg(IFiniteClosure fc, Set fBounded) { return fc.smArg(this, fBounded); diff --git a/src/test/java/bytecode/TypedIDTest.java b/src/test/java/bytecode/TypedIDTest.java new file mode 100644 index 000000000..29f623fcf --- /dev/null +++ b/src/test/java/bytecode/TypedIDTest.java @@ -0,0 +1,38 @@ +package bytecode; + +import static org.junit.Assert.*; + +import java.io.File; +import java.lang.reflect.Field; +import java.net.URL; +import java.net.URLClassLoader; + +import org.junit.BeforeClass; +import org.junit.Test; + +import de.dhbwstuttgart.core.JavaTXCompiler; + +public class TypedIDTest { + + private static String path; + private static File fileToTest; + private static JavaTXCompiler compiler; + private static ClassLoader loader; + private static Class classToTest; + private static String pathToClassFile; + private static Object instanceOfClass; + + + @Test + public void test() throws Exception { + path = System.getProperty("user.dir")+"/src/test/resources/bytecode/javFiles/TypedID.jav"; + fileToTest = new File(path); + compiler = new JavaTXCompiler(fileToTest); + compiler.generateBytecode(System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/"); + pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/"; + loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); + classToTest = loader.loadClass("TypedID"); + instanceOfClass = classToTest.getDeclaredConstructor().newInstance(); + } + +} diff --git a/src/test/java/bytecode/applyLambdaTest.java b/src/test/java/bytecode/applyLambdaTest.java index 3c7ea4526..6fb4722e2 100644 --- a/src/test/java/bytecode/applyLambdaTest.java +++ b/src/test/java/bytecode/applyLambdaTest.java @@ -1,3 +1,4 @@ + package bytecode; import static org.junit.Assert.assertEquals; diff --git a/src/test/resources/bytecode/javFiles/Id.jav b/src/test/resources/bytecode/javFiles/Id.jav index e23933540..437185820 100644 --- a/src/test/resources/bytecode/javFiles/Id.jav +++ b/src/test/resources/bytecode/javFiles/Id.jav @@ -1,6 +1,7 @@ -public class Id { +public class Id { + + id(A b){ + return b; + } +} - id(FTU b){ - return b; - } - } \ No newline at end of file diff --git a/src/test/resources/bytecode/javFiles/TypedID.jav b/src/test/resources/bytecode/javFiles/TypedID.jav new file mode 100644 index 000000000..6e2477a58 --- /dev/null +++ b/src/test/resources/bytecode/javFiles/TypedID.jav @@ -0,0 +1,6 @@ +public class TypedID/* */ { + + id(K b){ + return b; + } +} \ No newline at end of file