diff --git a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java index dcf98357..96a1c19b 100644 --- a/src/de/dhbwstuttgart/bytecode/BytecodeGen.java +++ b/src/de/dhbwstuttgart/bytecode/BytecodeGen.java @@ -131,20 +131,28 @@ public class BytecodeGen implements ASTVisitor { superClass = classOrInterface.getSuperClass().acceptTV(new TypeToDescriptor()); resultSet = rs; tphExtractor.setResultSet(resultSet); + // Nur einmal ausführen!! if(!isVisited) { classOrInterface.accept(tphExtractor); getCommonTPHS(tphExtractor); - + + ArrayList tphsClass = new ArrayList<>(); + for(TypePlaceholder t : tphExtractor.allTPHS.keySet()) { + if(!tphExtractor.allTPHS.get(t)) + tphsClass.add(t); + } + String sig = null; /* if class has generics then creates signature * Signature looks like: * Superclass */ if(classOrInterface.getGenerics().iterator().hasNext() || !commonPairs.isEmpty() || - classOrInterface.getSuperClass().acceptTV(new TypeToSignature()).contains("<")) { - Signature signature = new Signature(classOrInterface, genericsAndBounds,commonPairs); + classOrInterface.getSuperClass().acceptTV(new TypeToSignature()).contains("<") + || !tphsClass.isEmpty()) { + Signature signature = new Signature(classOrInterface, genericsAndBounds,commonPairs,tphsClass); sig = signature.toString(); System.out.println("Signature: => " + sig); } @@ -388,9 +396,21 @@ public class BytecodeGen implements ASTVisitor { @Override public void visit(Field field) { System.out.println("In Field ---"); + String des = "L"; + if(resultSet.resolveType(field.getType()).resolvedType instanceof TypePlaceholder) { + des += Type.getInternalName(Object.class); + } else { + des += resultSet.resolveType(field.getType()).resolvedType.acceptTV(new TypeToDescriptor()); + } + des +=";"; + System.out.println(des); + String sig = resultSet.resolveType(field.getType()).resolvedType.acceptTV(new TypeToSignature()); + System.out.println(sig); + if(sig.charAt(sig.length()-1) != (";").charAt(0)) { + sig +=";"; + } cw.visitField(field.modifier, field.getName(), - "L"+resultSet.resolveType(field.getType()).resolvedType.acceptTV(new TypeToDescriptor())+";", - resultSet.resolveType(field.getType()).resolvedType.acceptTV(new TypeToSignature()), + des, sig, null); } diff --git a/src/de/dhbwstuttgart/bytecode/signature/Signature.java b/src/de/dhbwstuttgart/bytecode/signature/Signature.java index f74d2eef..ef0d1d47 100644 --- a/src/de/dhbwstuttgart/bytecode/signature/Signature.java +++ b/src/de/dhbwstuttgart/bytecode/signature/Signature.java @@ -41,11 +41,14 @@ public class Signature { private ResultSet resultSet; private ArrayList commonPairs; private HashMap> methodConstraints; + private ArrayList tphsClass; - public Signature(ClassOrInterface classOrInterface, HashMap genericsAndBounds,ArrayList commonPairs) { + public Signature(ClassOrInterface classOrInterface, HashMap genericsAndBounds, + ArrayList commonPairs, ArrayList tphsClass) { this.classOrInterface = classOrInterface; this.genericsAndBounds = genericsAndBounds; this.commonPairs = commonPairs; + this.tphsClass = tphsClass; sw = new SignatureWriter(); createSignatureForClassOrInterface(); } @@ -395,6 +398,14 @@ public class Signature { } } } + for(TypePlaceholder t : tphsClass) { + String n = t.getName()+"$"; + String bound = Type.getInternalName(Object.class); + sw.visitFormalTypeParameter(n); + sw.visitClassBound().visitClassType(bound); + genericsAndBounds.put(n, bound); + sw.visitClassBound().visitEnd(); + } String sClass = classOrInterface.getSuperClass().acceptTV(new TypeToSignature()); sw.visitSuperclass().visitClassType(sClass.substring(1, sClass.length()-1)); sw.visitEnd(); diff --git a/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java b/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java index bcaaf2b5..3950b65e 100644 --- a/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java +++ b/src/de/dhbwstuttgart/bytecode/utilities/Simplify.java @@ -15,7 +15,7 @@ import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; public class Simplify { - + private static int a = 6; public static HashMap> simplifyConstraints(String name, TPHExtractor tphExtractor) { // 1. check if there are any simple cycles like L set L=R and: diff --git a/test/bytecode/FieldTph.java b/test/bytecode/FieldTph.java new file mode 100644 index 00000000..3edb43d1 --- /dev/null +++ b/test/bytecode/FieldTph.java @@ -0,0 +1,43 @@ +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 FieldTph { + + 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; + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + path = System.getProperty("user.dir")+"/test/bytecode/javFiles/FieldTph.jav"; + fileToTest = new File(path); + compiler = new JavaTXCompiler(fileToTest); + compiler.generateBytecode(System.getProperty("user.dir")+"/testBytecode/generatedBC/"); + pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/"; + loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); + classToTest = loader.loadClass("FieldTph"); + instanceOfClass = classToTest.getDeclaredConstructor().newInstance(); + } + + @Test + public void test() { + Field[] fields = classToTest.getFields(); + assertEquals(1, fields.length); + } + +} diff --git a/test/bytecode/javFiles/FieldTph.jav b/test/bytecode/javFiles/FieldTph.jav new file mode 100644 index 00000000..fc74e539 --- /dev/null +++ b/test/bytecode/javFiles/FieldTph.jav @@ -0,0 +1,4 @@ +public class FieldTph { + a; + +} \ No newline at end of file