diff --git a/pom.xml b/pom.xml
index b90b76e2..f6a1fc87 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 fec01c10..8ae7da1e 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 07471ae1..3fd10cf5 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 ce0b4462..ca191b7d 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 00000000..96feb4dc
--- /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 19b218f6..c8c9802b 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 7166d0c4..4241af34 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 665bd380..04ee340c 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 8834f859..a2abf30b 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 14c86b65..2551260b 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 5b17538e..4627dc30 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 00000000..29f623fc
--- /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 3c7ea452..6fb4722e 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 e2393354..43718582 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 00000000..6e2477a5
--- /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