Compare commits
94 Commits
unify-test
...
classloade
Author | SHA1 | Date | |
---|---|---|---|
|
fe1154d212 | ||
|
592de5310e | ||
|
e4e3704c7b | ||
|
21bc3e5193 | ||
|
44368f2a2a | ||
|
aa94ce8ad9 | ||
|
d63c27579c | ||
|
b38340fc60 | ||
|
e913bfa768 | ||
|
98997d686f | ||
|
5c97d80eb0 | ||
|
23384f413d | ||
|
a5662cdd9a | ||
|
28400c8bde | ||
|
b68004a214 | ||
|
8d72b58fcc | ||
|
e581050a61 | ||
|
1ec7a78b14 | ||
|
8ec1c5148b | ||
|
bf80361c1f | ||
|
a9d6e08a20 | ||
|
d55e6b3b75 | ||
|
a6287b1551 | ||
|
5500180c6b | ||
|
0c1ca3d200 | ||
|
f3d6fcb417 | ||
|
d1138540de | ||
|
647c9e6c21 | ||
|
6779f10b08 | ||
|
ac3f8ece0e | ||
|
f63346649b | ||
|
abdff6c8d2 | ||
|
691d31df5e | ||
|
2e421cccaa | ||
|
bd0b2e6058 | ||
|
0c9c8ef321 | ||
|
4b4087ae24 | ||
|
19989bfe11 | ||
|
f59a7d221e | ||
|
c1c12fa33c | ||
|
7fd03d505e | ||
|
4391adfb0f | ||
|
d0b6dbcd30 | ||
|
306af907c5 | ||
|
75eaee6644 | ||
|
0378c17e7d | ||
|
3e67da6e34 | ||
|
1d16b9f2b9 | ||
|
afd2c21ca8 | ||
|
74622550c2 | ||
|
bb75fca0d7 | ||
|
c82abcaae5 | ||
|
a3b4ea9b1c | ||
|
af5b23e31a | ||
|
09a6aec65d | ||
|
766e71bb3a | ||
|
802d7726d4 | ||
|
c68d773486 | ||
|
00bbd5279f | ||
|
6c783a18c7 | ||
|
8c195601d5 | ||
|
37f8f2e1e0 | ||
|
0903efda0d | ||
|
6e9eae38ca | ||
|
0138e4fe2d | ||
|
9741b5e14e | ||
|
c2030123d5 | ||
|
25fb7a2e28 | ||
|
d1637b8eb9 | ||
|
9abda637a1 | ||
|
82c0837d1f | ||
|
a41e9804a0 | ||
|
25c685c705 | ||
|
3ecb202a90 | ||
|
efdb58e67c | ||
|
eed8f32cb7 | ||
|
87d0a46ba5 | ||
|
5b75250fcf | ||
|
7f29b39195 | ||
|
7a4bc32974 | ||
|
dfddc44f29 | ||
|
347d86a379 | ||
|
d77f2176f2 | ||
|
4f39eccecb | ||
|
669e7f111f | ||
|
32d12677bf | ||
|
92b2f5c9cc | ||
|
c1e6526b43 | ||
|
0194e30206 | ||
|
3c36c61077 | ||
|
857d63322e | ||
|
b801e144c3 | ||
|
f6669f8c13 | ||
|
2b7aef5e87 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -23,3 +23,6 @@ bin
|
|||||||
|
|
||||||
#
|
#
|
||||||
manually/
|
manually/
|
||||||
|
|
||||||
|
logFiles/**
|
||||||
|
!logFiles/.gitkeep
|
||||||
|
22
PlugInBau.txt
Normal file
22
PlugInBau.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
Repositories: Branches: JavaCompilerCore: simplyRes
|
||||||
|
JavaCompilerPlugin: copy_libs
|
||||||
|
JavaCompilerCore > mvn install -Dskip.test=true
|
||||||
|
|
||||||
|
[INFO] Installing /Users/pl/workspace_oxygen/JavaCompilerCore/target/JavaTXcompiler-0.2.jar to /Users/pl/.m2/repository/de/dhbwstuttgart/JavaTXcompiler/0.2/JavaTXcompiler-0.2.jar
|
||||||
|
[INFO] Installing /Users/pl/workspace_oxygen/JavaCompilerCore/pom.xml to /Users/pl/.m2/repository/de/dhbwstuttgart/JavaTXcompiler/0.2/JavaTXcompiler-0.2.pom
|
||||||
|
[INFO] Installing /Users/pl/workspace_oxygen/JavaCompilerCore/target/JavaTXcompiler-0.2-jar-with-dependencies.jar to /Users/pl/.m2/repository/de/dhbwstuttgart/JavaTXcompiler/0.2/JavaTXcompiler-0.2-jar-with-dependencies.jar
|
||||||
|
[INFO] ------------------------------------------------------------------------
|
||||||
|
[INFO] BUILD SUCCESS
|
||||||
|
[INFO] ------------------------------------------------------------------------
|
||||||
|
[INFO] Total time: 23.279 s
|
||||||
|
[INFO] Finished at: 2019-09-17T09:31:30+02:00
|
||||||
|
[INFO] -------------------------------------
|
||||||
|
|
||||||
|
JavaCompilerCore > cd target
|
||||||
|
|
||||||
|
JavaCompilerCore/target > cp JavaTXcompiler-0.2.jar ../../Plugin_JCC/JavaCompilerPlugin/bundles/JavaCompilerPlugin.Plugin/lib/JavaTXcompiler.jar
|
||||||
|
|
||||||
|
Im Eclipse: Plugin_JCC/JavaCompilerPlugin> mvn install
|
||||||
|
|
||||||
|
Plugin_JCC/JavaCompilerPlugin/releng/JavaCompilerPlugin.Update/target > cp JavaCompilerPlugin.Update-0.1.0-SNAPSHOT.zip ~/webdav/public_html/javatx/javatx_XXXXXX.zip
|
||||||
|
|
19
abgabeprotokoll.md
Normal file
19
abgabeprotokoll.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# JavaTXCompiler Klasse
|
||||||
|
* Konstruktor hat einen weiteren Parameter
|
||||||
|
* contextPath
|
||||||
|
* Arrays aus URLs (file-urls)
|
||||||
|
* Parameter ist Optional
|
||||||
|
* wird er gesetzt, so werden Classfiles aus den übergebenen Pfaden geladen
|
||||||
|
* die übergebenen Pfade müssen dabei die Source-Roots sein
|
||||||
|
* Beispiel:
|
||||||
|
`import de.test.Klasse;`
|
||||||
|
* `Klasse.class` liegt in `output/de/test/Klasse.class`
|
||||||
|
* dann muss contextpath auf `output` gesetzt werden
|
||||||
|
* wird der Parameter nicht übergeben, so wird der Sourceroot auf das Verzeichnis gesetzt, in dem der Compiler ausgeführt wird
|
||||||
|
* dies ist das Verhalten vom javac Compiler
|
||||||
|
|
||||||
|
* generateBytecode - Methode hat neuen Parameter: path
|
||||||
|
* wird hier null übergeben, so wird die class-File in den gleichen Ordner wie die übergebene .jav File geschrieben
|
||||||
|
* wird hier ein Pfad übergeben, so gilt dieser als output root.
|
||||||
|
* Klassen werden in outputRoot/package/name/KlassenName.class geschrieben
|
||||||
|
|
25
doc/Generics/generics.tex
Normal file
25
doc/Generics/generics.tex
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
\documentclass{article}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\section{Generics sind notwendig}
|
||||||
|
Generics können nicht ignoriert werden.
|
||||||
|
Folgender Fall ist Typisierbar:
|
||||||
|
|
||||||
|
\begin{program}
|
||||||
|
<T> T m1(T x){
|
||||||
|
return m2(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
m2(x){
|
||||||
|
m1(1);
|
||||||
|
m2("Test");
|
||||||
|
return m1(x);
|
||||||
|
}
|
||||||
|
\end{program}
|
||||||
|
|
||||||
|
Beim weglassen des Generics T wäre es aber nicht mehr möglich.
|
||||||
|
Dann erhält jeder Constraint, welcher in Verbindung mit der Methode m1 steht
|
||||||
|
den selben TPH.
|
||||||
|
|
||||||
|
\end{document}
|
0
logFiles/.gitkeep
Normal file
0
logFiles/.gitkeep
Normal file
8
pom.xml
8
pom.xml
@@ -14,7 +14,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.0</version>
|
<version>4.11</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -110,6 +110,11 @@ http://maven.apache.org/maven-v4_0_0.xsd">
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifest>
|
||||||
|
<mainClass>de.dhbwstuttgart.core.ConsoleInterface</mainClass>
|
||||||
|
</manifest>
|
||||||
|
</archive>
|
||||||
<descriptorRefs>
|
<descriptorRefs>
|
||||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||||
</descriptorRefs>
|
</descriptorRefs>
|
||||||
@@ -164,6 +169,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
|
|||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<tycho.version>0.23.0</tycho.version>
|
<tycho.version>0.23.0</tycho.version>
|
||||||
|
<mainClass>de.dhbwstuttgart.core.ConsoleInterface</mainClass>
|
||||||
</properties>
|
</properties>
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
<repository>
|
<repository>
|
||||||
|
@@ -61,7 +61,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
assign.accept(bytecodeGenMethod);
|
assign.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(assign.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(assign.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,9 +70,9 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
binary.accept(bytecodeGenMethod);
|
binary.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0)) {
|
if(argListMethCall.get(0)) {
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(binary.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(binary.getType()));
|
||||||
} else {
|
} else {
|
||||||
bytecodeGenMethod.doBoxing(bytecodeGenMethod.getResolvedType(binary.getType()));
|
bytecodeGenMethod.doBoxing(bytecodeGenMethod.getResolver().getResolvedType(binary.getType()));
|
||||||
}
|
}
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
@@ -88,7 +88,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
castExpr.accept(bytecodeGenMethod);
|
castExpr.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(castExpr.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(castExpr.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
fieldVar.accept(bytecodeGenMethod);
|
fieldVar.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(fieldVar.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(fieldVar.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
instanceOf.accept(bytecodeGenMethod);
|
instanceOf.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(instanceOf.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(instanceOf.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
localVar.accept(bytecodeGenMethod);
|
localVar.accept(bytecodeGenMethod);
|
||||||
if(!bytecodeGenMethod.isBinaryExp) {
|
if(!bytecodeGenMethod.isBinaryExp) {
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(localVar.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(localVar.getType()));
|
||||||
}
|
}
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
methodCall.accept(bytecodeGenMethod);
|
methodCall.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(methodCall.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(methodCall.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
methodCall.accept(bytecodeGenMethod);
|
methodCall.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(methodCall.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(methodCall.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
aThis.accept(bytecodeGenMethod);
|
aThis.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(aThis.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(aThis.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,7 +242,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
unaryExpr.accept(bytecodeGenMethod);
|
unaryExpr.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(unaryExpr.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(unaryExpr.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
literal.accept(bytecodeGenMethod);
|
literal.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
if(argListMethCall.get(0))
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(literal.getType()));
|
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolver().getResolvedType(literal.getType()));
|
||||||
argListMethCall.remove(0);
|
argListMethCall.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,14 +1,15 @@
|
|||||||
package de.dhbwstuttgart.bytecode;
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.NoSuchElementException;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.DirectoryClassLoader;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import org.objectweb.asm.ClassWriter;
|
import org.objectweb.asm.ClassWriter;
|
||||||
import org.objectweb.asm.FieldVisitor;
|
import org.objectweb.asm.FieldVisitor;
|
||||||
import org.objectweb.asm.MethodVisitor;
|
import org.objectweb.asm.MethodVisitor;
|
||||||
@@ -16,17 +17,18 @@ import org.objectweb.asm.Opcodes;
|
|||||||
import org.objectweb.asm.Type;
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.Exception.BytecodeGeneratorError;
|
import de.dhbwstuttgart.bytecode.Exception.BytecodeGeneratorError;
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
|
||||||
import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString;
|
import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString;
|
||||||
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
||||||
import de.dhbwstuttgart.bytecode.signature.Signature;
|
import de.dhbwstuttgart.bytecode.signature.Signature;
|
||||||
import de.dhbwstuttgart.bytecode.signature.TypeToSignature;
|
import de.dhbwstuttgart.bytecode.signature.TypeToSignature;
|
||||||
import de.dhbwstuttgart.bytecode.signature.TypeToString;
|
import de.dhbwstuttgart.bytecode.signature.TypeToString;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericGenratorResultForSourceFile;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResult;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResultForClass;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.MethodUtility;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.NormalConstructor;
|
import de.dhbwstuttgart.bytecode.utilities.NormalConstructor;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.NormalMethod;
|
import de.dhbwstuttgart.bytecode.utilities.NormalMethod;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.Simplify;
|
import de.dhbwstuttgart.bytecode.utilities.Resolver;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.SimplifyResult;
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
import de.dhbwstuttgart.syntaxtree.ASTVisitor;
|
import de.dhbwstuttgart.syntaxtree.ASTVisitor;
|
||||||
@@ -73,7 +75,6 @@ import de.dhbwstuttgart.syntaxtree.type.RefType;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import de.dhbwstuttgart.typeinference.result.GenericInsertPair;
|
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
public class BytecodeGen implements ASTVisitor {
|
public class BytecodeGen implements ASTVisitor {
|
||||||
@@ -83,12 +84,13 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
String type;
|
String type;
|
||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric THISTYPE = null;
|
public static RefTypeOrTPHOrWildcardOrGeneric THISTYPE = null;
|
||||||
String className;
|
private JavaClassName className;
|
||||||
|
private String pkgName;
|
||||||
private boolean isInterface;
|
private boolean isInterface;
|
||||||
private Collection<ResultSet> listOfResultSets;
|
private Collection<ResultSet> listOfResultSets;
|
||||||
private ResultSet resultSet;
|
private ResultSet resultSet;
|
||||||
private SourceFile sf;
|
private SourceFile sf;
|
||||||
private String path;
|
private File path;
|
||||||
|
|
||||||
private Optional<Constructor> fieldInitializations;
|
private Optional<Constructor> fieldInitializations;
|
||||||
|
|
||||||
@@ -96,7 +98,7 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
|
|
||||||
private String superClass;
|
private String superClass;
|
||||||
|
|
||||||
private ArrayList<String> tphsClass;
|
private List<String> tphsClass;
|
||||||
|
|
||||||
// stores parameter, local vars and the next index on the local variable table,
|
// stores parameter, local vars and the next index on the local variable table,
|
||||||
// which use for aload_i, astore_i,...
|
// which use for aload_i, astore_i,...
|
||||||
@@ -106,45 +108,39 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
|
|
||||||
private int constructorPos = 0;
|
private int constructorPos = 0;
|
||||||
|
|
||||||
private final TPHExtractor tphExtractor = new TPHExtractor();
|
|
||||||
private final ArrayList<GenericInsertPair> commonPairs = new ArrayList<>();
|
|
||||||
|
|
||||||
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes = new HashMap<>();
|
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes = new HashMap<>();
|
||||||
byte[] bytecode;
|
byte[] bytecode;
|
||||||
HashMap<String, byte[]> classFiles;
|
HashMap<JavaClassName, byte[]> classFiles;
|
||||||
|
|
||||||
private final ArrayList<String> methodNameAndParamsT = new ArrayList<>();
|
private final ArrayList<String> methodNameAndParamsT = new ArrayList<>();
|
||||||
private final ArrayList<String> fieldNameAndParamsT = new ArrayList<>();
|
private final ArrayList<String> fieldNameAndParamsT = new ArrayList<>();
|
||||||
|
|
||||||
private HashMap<String, SimplifyResult> simplifyResults = new HashMap<>();
|
|
||||||
private List<HashMap<String, SimplifyResult>> simplifyResultsList = new ArrayList<>();
|
|
||||||
|
|
||||||
private final ArrayList<String> fieldNameSignature = new ArrayList<>();
|
private final ArrayList<String> fieldNameSignature = new ArrayList<>();
|
||||||
|
|
||||||
public List<HashMap<String, SimplifyResult>> getSimplifyResultsList() {
|
private List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles;
|
||||||
return simplifyResultsList;
|
private GenericsGeneratorResultForClass generatedGenerics;
|
||||||
}
|
|
||||||
|
|
||||||
public void setSimplifyResultsList(List<HashMap<String, SimplifyResult>> simplifyResultsList) {
|
private Resolver resolver;
|
||||||
this.simplifyResultsList = simplifyResultsList;
|
private final DirectoryClassLoader classLoader;
|
||||||
}
|
|
||||||
|
|
||||||
public BytecodeGen(HashMap<String, byte[]> classFiles, Collection<ResultSet> listOfResultSets, SourceFile sf,
|
public BytecodeGen(HashMap<JavaClassName, byte[]> classFiles, Collection<ResultSet> listOfResultSets, List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles, SourceFile sf,
|
||||||
String path) {
|
File path, DirectoryClassLoader classLoader) {
|
||||||
this.classFiles = classFiles;
|
this.classFiles = classFiles;
|
||||||
this.listOfResultSets = listOfResultSets;
|
this.listOfResultSets = listOfResultSets;
|
||||||
|
this.simplifyResultsForAllSourceFiles = simplifyResultsForAllSourceFiles;
|
||||||
this.sf = sf;
|
this.sf = sf;
|
||||||
this.path = path;
|
this.path = path;
|
||||||
|
this.pkgName = sf.getPkgName();
|
||||||
|
this.classLoader = classLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(SourceFile sourceFile) {
|
public void visit(SourceFile sourceFile) {
|
||||||
for (ClassOrInterface cl : sourceFile.getClasses()) {
|
for (ClassOrInterface cl : sourceFile.getClasses()) {
|
||||||
System.out.println("in Class: " + cl.getClassName().toString());
|
System.out.println("in Class: " + cl.getClassName().toString());
|
||||||
BytecodeGen classGen = new BytecodeGen(classFiles, listOfResultSets, sf, path);
|
BytecodeGen classGen = new BytecodeGen(classFiles, listOfResultSets, simplifyResultsForAllSourceFiles, sf, path, classLoader);
|
||||||
cl.accept(classGen);
|
cl.accept(classGen);
|
||||||
simplifyResultsList.add(classGen.getSimplifyResults());
|
classGen.writeClass(cl.getClassName());
|
||||||
classGen.writeClass(cl.getClassName().toString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,24 +148,24 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
* Associates the bytecode of the class that was build with the classWriter
|
* Associates the bytecode of the class that was build with the classWriter
|
||||||
* {@link #cw} with the class name in the map {@link #classFiles}
|
* {@link #cw} with the class name in the map {@link #classFiles}
|
||||||
*
|
*
|
||||||
* @param name name of the class with which the the bytecode is to be associated
|
* @param name name of the class with which the bytecode is to be associated
|
||||||
*/
|
*/
|
||||||
private void writeClass(String name) {
|
private void writeClass(JavaClassName name) {
|
||||||
bytecode = cw.toByteArray();
|
bytecode = cw.toByteArray();
|
||||||
classFiles.put(name, bytecode);
|
classFiles.put(name, bytecode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap<String, byte[]> getClassFiles() {
|
public HashMap<JavaClassName, byte[]> getClassFiles() {
|
||||||
return classFiles;
|
return classFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(ClassOrInterface classOrInterface) {
|
public void visit(ClassOrInterface classOrInterface) {
|
||||||
|
|
||||||
className = classOrInterface.getClassName().toString();
|
className = classOrInterface.getClassName();
|
||||||
|
|
||||||
cw.visitSource(className + ".jav", null);
|
cw.visitSource(className.getClassName() + ".jav", null);
|
||||||
|
|
||||||
isInterface = (classOrInterface.getModifiers() & 512) == 512;
|
isInterface = (classOrInterface.getModifiers() & 512) == 512;
|
||||||
|
|
||||||
@@ -179,77 +175,36 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
fieldInitializations = classOrInterface.getfieldInitializations();
|
fieldInitializations = classOrInterface.getfieldInitializations();
|
||||||
|
|
||||||
// resultSet = listOfResultSets.get(0);
|
// resultSet = listOfResultSets.get(0);
|
||||||
boolean isConsWithNoParamsVisited = false;
|
|
||||||
boolean isVisited = false;
|
boolean isVisited = false;
|
||||||
List<ResultSet> listOfResultSetsList = new ArrayList<>(listOfResultSets);
|
List<ResultSet> listOfResultSetsList = new ArrayList<>(listOfResultSets);
|
||||||
|
generatedGenerics = simplifyResultsForAllSourceFiles.stream().map(sr->sr.getSimplifyResultsByName(className)).findFirst().get();
|
||||||
for (int i = 0; i < listOfResultSetsList.size(); i++) {
|
for (int i = 0; i < listOfResultSetsList.size(); i++) {
|
||||||
//for (ResultSet rs : listOfResultSets) {
|
//for (ResultSet rs : listOfResultSets) {
|
||||||
superClass = classOrInterface.getSuperClass().acceptTV(new TypeToDescriptor());
|
superClass = classOrInterface.getSuperClass().acceptTV(new TypeToDescriptor());
|
||||||
resultSet = listOfResultSetsList.get(i);
|
resultSet = listOfResultSetsList.get(i);
|
||||||
tphExtractor.setResultSet(resultSet);
|
resolver = new Resolver(resultSet);
|
||||||
|
// tphExtractor.setResultSet(resultSet);
|
||||||
|
|
||||||
|
|
||||||
// Nur einmal ausführen!!
|
// Nur einmal ausführen!!
|
||||||
if (!isVisited) {
|
if (!isVisited) {
|
||||||
classOrInterface.accept(tphExtractor);
|
|
||||||
|
|
||||||
getCommonTPHS(tphExtractor);
|
|
||||||
|
|
||||||
tphsClass = new ArrayList<>();
|
|
||||||
for (String t : tphExtractor.allTPHS.keySet()) {
|
|
||||||
if (!tphExtractor.allTPHS.get(t))
|
|
||||||
tphsClass.add(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
String sig = null;
|
String sig = null;
|
||||||
/*
|
/*
|
||||||
* if class has generics then creates signature Signature looks like:
|
* if class has generics then creates signature Signature looks like:
|
||||||
* <E:Ljava/...>Superclass
|
* <E:Ljava/...>Superclass
|
||||||
*/
|
*/
|
||||||
if (classOrInterface.getGenerics().iterator().hasNext() || !commonPairs.isEmpty()
|
if (classOrInterface.getGenerics().iterator().hasNext() || classOrInterface.getSuperClass().acceptTV(new TypeToSignature()).contains("<")
|
||||||
|| classOrInterface.getSuperClass().acceptTV(new TypeToSignature()).contains("<")
|
|| !generatedGenerics.getClassConstraints().isEmpty()) {
|
||||||
|| !tphsClass.isEmpty()) {
|
|
||||||
HashMap<TPHConstraint, HashSet<String>> constraints = Simplify
|
|
||||||
.simplifyConstraintsClass(tphExtractor, tphsClass);
|
|
||||||
ArrayList<TPHConstraint> consClass = new ArrayList<>();
|
|
||||||
for (TPHConstraint cons : constraints.keySet()) {
|
|
||||||
String right = null;
|
|
||||||
boolean isToAdd = false;
|
|
||||||
for (String tph : tphsClass) {
|
|
||||||
if (cons.getLeft().equals(tph)) {
|
|
||||||
|
|
||||||
consClass.add(cons);
|
List<GenericsGeneratorResult> consClass = generatedGenerics.getClassConstraints();
|
||||||
try {
|
//
|
||||||
right = getTPH(cons.getRight());
|
Signature signature = new Signature(classOrInterface, genericsAndBounds, consClass);
|
||||||
isToAdd = true;
|
sig = signature.createSignatureForClassOrInterface();
|
||||||
} catch (NoSuchElementException e) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isToAdd) {
|
|
||||||
tphsClass.add(right);
|
|
||||||
removeFromMethod(right);
|
|
||||||
right = null;
|
|
||||||
isToAdd = false;
|
|
||||||
}
|
|
||||||
// if(right != null) {
|
|
||||||
// tphsClass.add(right);
|
|
||||||
// removeFromMethod(right);
|
|
||||||
// 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);
|
System.out.println("Signature: => " + sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
cw.visit(Opcodes.V1_8, acc, classOrInterface.getClassName().toString(), sig,
|
cw.visit(Opcodes.V1_8, acc, classOrInterface.getClassName().toString().replace(".", "/"), sig,
|
||||||
classOrInterface.getSuperClass().acceptTV(new TypeToDescriptor()), null);
|
classOrInterface.getSuperClass().acceptTV(new TypeToDescriptor()), null);
|
||||||
|
|
||||||
isVisited = true;
|
isVisited = true;
|
||||||
@@ -260,12 +215,7 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (Constructor c : classOrInterface.getConstructors()) {
|
for (Constructor c : classOrInterface.getConstructors()) {
|
||||||
// if(!isConsWithNoParamsVisited) {
|
|
||||||
c.accept(this);
|
c.accept(this);
|
||||||
// }
|
|
||||||
|
|
||||||
// if(!c.getParameterList().iterator().hasNext())
|
|
||||||
// isConsWithNoParamsVisited = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Method m : classOrInterface.getMethods()) {
|
for (Method m : classOrInterface.getMethods()) {
|
||||||
@@ -276,69 +226,20 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeFromMethod(String name) {
|
|
||||||
for (MethodAndTPH m : tphExtractor.ListOfMethodsAndTph) {
|
|
||||||
ArrayList<String> toRemove = new ArrayList<>();
|
|
||||||
for (String tph : m.getTphs()) {
|
|
||||||
if (tph.equals(name)) {
|
|
||||||
toRemove.add(tph);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!toRemove.isEmpty()) {
|
|
||||||
m.getTphs().removeAll(toRemove);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getTPH(String name) {
|
|
||||||
for (String tph : tphExtractor.allTPHS.keySet()) {
|
|
||||||
if (tph.equals(name))
|
|
||||||
return tph;
|
|
||||||
}
|
|
||||||
throw new NoSuchElementException("TPH " + name + " does not exist");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getCommonTPHS(TPHExtractor tphExtractor) {
|
|
||||||
// Gemeinsame TPHs
|
|
||||||
ArrayList<String> cTPHs = new ArrayList<>();
|
|
||||||
// Alle TPHs der Felder speichern
|
|
||||||
for (String tph : tphExtractor.allTPHS.keySet()) {
|
|
||||||
if (!tphExtractor.allTPHS.get(tph))
|
|
||||||
cTPHs.add(tph);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Constructor field) {
|
public void visit(Constructor field) {
|
||||||
System.out.println("ResultSet: ");
|
|
||||||
resultSet.results.forEach(a -> {
|
|
||||||
System.out.println(a.getLeft().toString() + " = " + a.getRight().toString());
|
|
||||||
});
|
|
||||||
System.out.println("---------------");
|
|
||||||
|
|
||||||
// stores generics and their bounds of method
|
// stores generics and their bounds of method
|
||||||
HashMap<String, String> genericsAndBoundsMethod = new HashMap<>();
|
HashMap<String, String> genericsAndBoundsMethod = new HashMap<>();
|
||||||
|
|
||||||
field.getParameterList().accept(this);
|
field.getParameterList().accept(this);
|
||||||
|
|
||||||
String methParamTypes = field.name + "%%";
|
String id = MethodUtility.createID(resolver, field);
|
||||||
|
|
||||||
Iterator<FormalParameter> itr = field.getParameterList().iterator();
|
if (methodNameAndParamsT.contains(id)) {
|
||||||
while (itr.hasNext()) {
|
|
||||||
FormalParameter fp = itr.next();
|
|
||||||
methParamTypes += resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()) + ";";
|
|
||||||
// methParamTypes += resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToSignature())+";";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (methodNameAndParamsT.contains(methParamTypes)) {
|
|
||||||
System.out.println("ignore - Method: " + field.name + " , paramsType: " + methParamTypes);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
methodNameAndParamsT.add(methParamTypes);
|
methodNameAndParamsT.add(id);
|
||||||
System.out.println("Method: " + field.name + " , paramsType: " + methParamTypes);
|
System.out.println("Constructor: " + field.name + " , paramsType: " + id);
|
||||||
|
|
||||||
String desc = null;
|
String desc = null;
|
||||||
boolean hasGen = false;
|
boolean hasGen = false;
|
||||||
@@ -353,10 +254,11 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
}
|
}
|
||||||
String sig = null;
|
String sig = null;
|
||||||
if (hasGen) {
|
if (hasGen) {
|
||||||
HashMap<TPHConstraint, HashSet<String>> constraints = Simplify.simplifyConstraints(field.name, tphExtractor,
|
List<GenericsGeneratorResult> constraints = generatedGenerics.getClassConstraints();
|
||||||
tphsClass);
|
Signature signature = new Signature(genericsAndBounds,
|
||||||
Signature signature = new Signature(field, genericsAndBounds, methodParamsAndTypes, resultSet, constraints);
|
methodParamsAndTypes, resultSet, constraints);
|
||||||
sig = signature.toString();
|
|
||||||
|
sig = signature.createSignatureForConstructor(field);
|
||||||
}
|
}
|
||||||
if (field.getParameterList().iterator().hasNext())
|
if (field.getParameterList().iterator().hasNext())
|
||||||
System.out.println(field.getParameterList().iterator().next().getType().acceptTV(new TypeToDescriptor()));
|
System.out.println(field.getParameterList().iterator().next().getType().acceptTV(new TypeToDescriptor()));
|
||||||
@@ -372,7 +274,7 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
constructorPos += 1;
|
constructorPos += 1;
|
||||||
|
|
||||||
BytecodeGenMethod gen = new BytecodeGenMethod(className, superClass, resultSet, field, mv, paramsAndLocals, cw,
|
BytecodeGenMethod gen = new BytecodeGenMethod(className, superClass, resultSet, field, mv, paramsAndLocals, cw,
|
||||||
genericsAndBoundsMethod, genericsAndBounds, isInterface, classFiles, sf, path, block, constructorPos);
|
genericsAndBoundsMethod, genericsAndBounds, isInterface, classFiles, sf, path, block, constructorPos, classLoader);
|
||||||
if (!field.getParameterList().iterator().hasNext()
|
if (!field.getParameterList().iterator().hasNext()
|
||||||
&& !(field.block.statements.get(field.block.statements.size() - 1) instanceof ReturnVoid)) {
|
&& !(field.block.statements.get(field.block.statements.size() - 1) instanceof ReturnVoid)) {
|
||||||
mv.visitInsn(Opcodes.RETURN);
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
@@ -387,24 +289,19 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
// stored in pos 0
|
// stored in pos 0
|
||||||
// else it will be stored in pos 1 and this will be stored in pos 0
|
// else it will be stored in pos 1 and this will be stored in pos 0
|
||||||
String retType = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String retType = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
// String retType = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToSignature());
|
|
||||||
String methParamTypes = retType + method.name + "%%";
|
|
||||||
method.getParameterList().accept(this);
|
|
||||||
|
|
||||||
Iterator<FormalParameter> itr = method.getParameterList().iterator();
|
String id = MethodUtility.createID(resolver, method);
|
||||||
while (itr.hasNext()) {
|
|
||||||
FormalParameter fp = itr.next();
|
|
||||||
methParamTypes += resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()) + ";";
|
|
||||||
// methParamTypes += resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToSignature())+";";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (methodNameAndParamsT.contains(methParamTypes)) {
|
if (methodNameAndParamsT.contains(id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
methodNameAndParamsT.add(methParamTypes);
|
methodNameAndParamsT.add(id);
|
||||||
System.out.println("Method: " + method.name + " , paramsType: " + methParamTypes);
|
System.out.println("Method: " + method.name + " , paramsType: " + id);
|
||||||
// stores generics and their bounds of method
|
// stores generics and their bounds of method
|
||||||
HashMap<String, String> genericsAndBoundsMethod = new HashMap<>();
|
HashMap<String, String> genericsAndBoundsMethod = new HashMap<>();
|
||||||
|
|
||||||
|
method.getParameterList().accept(this);
|
||||||
|
|
||||||
String methDesc = null;
|
String methDesc = null;
|
||||||
|
|
||||||
// Method getModifiers() ?
|
// Method getModifiers() ?
|
||||||
@@ -443,43 +340,27 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
// zwite operand muss weggelassen werden
|
// zwite operand muss weggelassen werden
|
||||||
if (hasGen || resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToString())
|
if (hasGen || resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToString())
|
||||||
.equals("TPH")) {
|
.equals("TPH")) {
|
||||||
System.out.println("ALL CONST: " + tphExtractor.allCons.size());
|
|
||||||
tphExtractor.allCons.forEach(c -> System.out.println(c.toString()));
|
|
||||||
System.out.println("----------------");
|
|
||||||
HashMap<TPHConstraint, HashSet<String>> constraints = Simplify.simplifyConstraints(method.name,
|
|
||||||
tphExtractor, tphsClass);
|
|
||||||
// ArrayList<GenericInsertPair> 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
List<GenericsGeneratorResult> constraints = generatedGenerics.getMethodConstraintsByID(id);
|
||||||
|
List<GenericsGeneratorResult> classConstraints = generatedGenerics.getClassConstraints();
|
||||||
|
Signature signature = new Signature(genericsAndBoundsMethod, genericsAndBounds,
|
||||||
|
methodParamsAndTypes, resultSet, constraints,classConstraints);
|
||||||
|
sig = signature.createSignatureForMethod(method);
|
||||||
}
|
}
|
||||||
System.out.println(method.getName() + " ==> " + sig);
|
System.out.println(method.getName() + " ==> " + sig);
|
||||||
NormalMethod meth = new NormalMethod(method, genericsAndBounds, genericsAndBoundsMethod, hasGen);
|
NormalMethod meth = new NormalMethod(method, genericsAndBounds, genericsAndBoundsMethod, hasGen);
|
||||||
methDesc = meth.accept(new DescriptorToString(resultSet));
|
methDesc = meth.accept(new DescriptorToString(resultSet));
|
||||||
|
|
||||||
// System.out.println(methDesc);
|
|
||||||
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC + acc, method.getName(), methDesc, sig, null);
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC + acc, method.getName(), methDesc, sig, null);
|
||||||
|
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
BytecodeGenMethod gen = new BytecodeGenMethod(className, superClass, resultSet, method, mv, paramsAndLocals, cw,
|
BytecodeGenMethod gen = new BytecodeGenMethod(className, superClass, resultSet, method, mv, paramsAndLocals, cw,
|
||||||
genericsAndBoundsMethod, genericsAndBounds, isInterface, classFiles, sf, path);
|
genericsAndBoundsMethod, genericsAndBounds, isInterface, classFiles, sf, path, classLoader);
|
||||||
|
|
||||||
mv.visitMaxs(0, 0);
|
mv.visitMaxs(0, 0);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap<String, SimplifyResult> getSimplifyResults() {
|
|
||||||
return simplifyResults;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(ParameterList formalParameters) {
|
public void visit(ParameterList formalParameters) {
|
||||||
paramsAndLocals = new HashMap<>();
|
paramsAndLocals = new HashMap<>();
|
||||||
@@ -550,7 +431,7 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
}
|
}
|
||||||
des += ";";
|
des += ";";
|
||||||
System.out.println(des);
|
System.out.println(des);
|
||||||
String sig = resultSet.resolveType(field.getType()).resolvedType.acceptTV(new TypeToSignature());
|
String sig = resultSet.resolveType(field.getType()).resolvedType.acceptTV(new TypeToSignature(generatedGenerics.getClassConstraints()));
|
||||||
System.out.println(sig);
|
System.out.println(sig);
|
||||||
if (sig.charAt(sig.length() - 1) != (";").charAt(0)) {
|
if (sig.charAt(sig.length() - 1) != (";").charAt(0)) {
|
||||||
sig += ";";
|
sig += ";";
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,10 @@ import de.dhbwstuttgart.bytecode.constraint.ExtendsConstraint;
|
|||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.MethodUtility;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.Resolver;
|
||||||
import de.dhbwstuttgart.syntaxtree.AbstractASTWalker;
|
import de.dhbwstuttgart.syntaxtree.AbstractASTWalker;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
import de.dhbwstuttgart.syntaxtree.Constructor;
|
import de.dhbwstuttgart.syntaxtree.Constructor;
|
||||||
import de.dhbwstuttgart.syntaxtree.Field;
|
import de.dhbwstuttgart.syntaxtree.Field;
|
||||||
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
@@ -38,16 +41,18 @@ import de.dhbwstuttgart.typeinference.result.ResultSet;
|
|||||||
public class TPHExtractor extends AbstractASTWalker {
|
public class TPHExtractor extends AbstractASTWalker {
|
||||||
// Alle TPHs der Felder werden iKopf der Klasse definiert
|
// Alle TPHs der Felder werden iKopf der Klasse definiert
|
||||||
// alle TPHs der Klasse: (TPH, is in Method?)
|
// alle TPHs der Klasse: (TPH, is in Method?)
|
||||||
final HashMap<String, Boolean> allTPHS = new HashMap<>();
|
public final HashMap<String, Boolean> allTPHS = new HashMap<>();
|
||||||
|
public final List<String> tphsClass = new ArrayList<>();
|
||||||
MethodAndTPH methodAndTph;
|
MethodAndTPH methodAndTph;
|
||||||
|
|
||||||
Boolean inMethod = false;
|
Boolean inMethod = false;
|
||||||
boolean inLocalOrParam = false;
|
boolean inLocalOrParamOrReturn = false;
|
||||||
|
|
||||||
public final ArrayList<MethodAndTPH> ListOfMethodsAndTph = new ArrayList<>();
|
public final ArrayList<MethodAndTPH> ListOfMethodsAndTph = new ArrayList<>();
|
||||||
final ArrayList<ResultPair<TypePlaceholder, TypePlaceholder>> allPairs = new ArrayList<>();
|
final ArrayList<ResultPair<TypePlaceholder, TypePlaceholder>> allPairs = new ArrayList<>();
|
||||||
public final ArrayList<TPHConstraint> allCons = new ArrayList<>();
|
public final ArrayList<TPHConstraint> allCons = new ArrayList<>();
|
||||||
private ResultSet resultSet;
|
private ResultSet resultSet;
|
||||||
|
private Resolver resolver;
|
||||||
|
|
||||||
public TPHExtractor() {
|
public TPHExtractor() {
|
||||||
|
|
||||||
@@ -55,16 +60,30 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
|
|
||||||
public void setResultSet(ResultSet resultSet) {
|
public void setResultSet(ResultSet resultSet) {
|
||||||
this.resultSet = resultSet;
|
this.resultSet = resultSet;
|
||||||
|
this.resolver = new Resolver(resultSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Resolver getResolver() {
|
||||||
|
return resolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public void visit(ClassOrInterface classOrInterface) {
|
||||||
|
// inMethod = false;
|
||||||
|
// classOrInterface.getfieldInitializations().ifPresent(c->c.block.accept(this));
|
||||||
|
// super.visit(classOrInterface);
|
||||||
|
// inMethod = true;
|
||||||
|
// }
|
||||||
@Override
|
@Override
|
||||||
public void visit(TypePlaceholder tph) {
|
public void visit(TypePlaceholder tph) {
|
||||||
if (resultSet.resolveType(tph).resolvedType instanceof TypePlaceholder) {
|
if (resultSet.resolveType(tph).resolvedType instanceof TypePlaceholder) {
|
||||||
TypePlaceholder resolvedTPH = (TypePlaceholder) resultSet.resolveType(tph).resolvedType;
|
TypePlaceholder resolvedTPH = (TypePlaceholder) resultSet.resolveType(tph).resolvedType;
|
||||||
if (inMethod) {
|
if (inMethod) {
|
||||||
methodAndTph.getTphs().add(resolvedTPH.getName());
|
methodAndTph.getTphs().add(resolvedTPH.getName());
|
||||||
if (inLocalOrParam)
|
if (inLocalOrParamOrReturn)
|
||||||
methodAndTph.getLocalTphs().add(resolvedTPH.getName());
|
methodAndTph.getLocalTphs().add(resolvedTPH.getName());
|
||||||
|
}else {
|
||||||
|
tphsClass.add(resolvedTPH.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
allTPHS.put(resolvedTPH.getName(), inMethod);
|
allTPHS.put(resolvedTPH.getName(), inMethod);
|
||||||
@@ -98,7 +117,7 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
if (inMethod)
|
if (inMethod)
|
||||||
methodAndTph.getPairs().add(ag);
|
methodAndTph.getPairs().add(ag);
|
||||||
allPairs.add(ag);
|
allPairs.add(ag);
|
||||||
TPHConstraint con = new ExtendsConstraint(ag.getLeft().getName(), ag.getRight().getName(), Relation.EXTENDS);
|
TPHConstraint con = new ExtendsConstraint(ag.getLeft().getName(), ag.getRight().getName());
|
||||||
if(!containsConstraint(allCons,con))
|
if(!containsConstraint(allCons,con))
|
||||||
allCons.add(con);
|
allCons.add(con);
|
||||||
// }
|
// }
|
||||||
@@ -111,7 +130,7 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
|
|
||||||
private static boolean containsConstraint(ArrayList<TPHConstraint> allCons, TPHConstraint c) {
|
private static boolean containsConstraint(ArrayList<TPHConstraint> allCons, TPHConstraint c) {
|
||||||
for(TPHConstraint con:allCons) {
|
for(TPHConstraint con:allCons) {
|
||||||
if(c.getLeft().equals(con.getLeft()) && c.getRight().equals(c.getRight())) {
|
if(c.getLeft().equals(con.getLeft()) && c.getRight().equals(con.getRight())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,9 +153,11 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
public void visit(GenericRefType genericRefType) {
|
public void visit(GenericRefType genericRefType) {
|
||||||
String name = genericRefType.getParsedName();
|
String name = genericRefType.getParsedName();
|
||||||
if (inMethod) {
|
if (inMethod) {
|
||||||
|
methodAndTph.getTphs().add(name);
|
||||||
|
if (inLocalOrParamOrReturn)
|
||||||
methodAndTph.getLocalTphs().add(name);
|
methodAndTph.getLocalTphs().add(name);
|
||||||
if (inLocalOrParam)
|
}else {
|
||||||
methodAndTph.getLocalTphs().add(name);
|
tphsClass.add(name);
|
||||||
}
|
}
|
||||||
allTPHS.put(name, inMethod);
|
allTPHS.put(name, inMethod);
|
||||||
}
|
}
|
||||||
@@ -153,8 +174,17 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
@Override
|
@Override
|
||||||
public void visit(Method method) {
|
public void visit(Method method) {
|
||||||
inMethod = true;
|
inMethod = true;
|
||||||
methodAndTph = new MethodAndTPH(method.name);
|
String id = MethodUtility.createID(resolver,method);
|
||||||
super.visit(method);
|
methodAndTph = new MethodAndTPH(id);
|
||||||
|
|
||||||
|
inLocalOrParamOrReturn = true;
|
||||||
|
method.getReturnType().accept(this);
|
||||||
|
method.getParameterList().accept(this);
|
||||||
|
inLocalOrParamOrReturn = false;
|
||||||
|
|
||||||
|
if(method.block != null)
|
||||||
|
method.block.accept(this);
|
||||||
|
|
||||||
inMethod = false;
|
inMethod = false;
|
||||||
ListOfMethodsAndTph.add(methodAndTph);
|
ListOfMethodsAndTph.add(methodAndTph);
|
||||||
}
|
}
|
||||||
@@ -162,29 +192,32 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
@Override
|
@Override
|
||||||
public void visit(Constructor cons) {
|
public void visit(Constructor cons) {
|
||||||
inMethod = false;
|
inMethod = false;
|
||||||
super.visit(cons);
|
//super.visit(cons);
|
||||||
|
cons.getParameterList().accept(this);
|
||||||
|
if(cons.block != null)
|
||||||
|
cons.block.accept(this);
|
||||||
inMethod = true;
|
inMethod = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LocalVarDecl localVarDecl) {
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
inLocalOrParam = true;
|
// inLocalOrParamOrReturn = inMethod;
|
||||||
super.visit(localVarDecl);
|
super.visit(localVarDecl);
|
||||||
inLocalOrParam = false;
|
// inLocalOrParamOrReturn = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LocalVar localVar) {
|
public void visit(LocalVar localVar) {
|
||||||
inLocalOrParam = true;
|
// inLocalOrParamOrReturn = inMethod;
|
||||||
super.visit(localVar);
|
super.visit(localVar);
|
||||||
inLocalOrParam = false;
|
// inLocalOrParamOrReturn = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(ParameterList formalParameters) {
|
public void visit(ParameterList formalParameters) {
|
||||||
inLocalOrParam = true;
|
inLocalOrParamOrReturn = inMethod;
|
||||||
super.visit(formalParameters);
|
super.visit(formalParameters);
|
||||||
inLocalOrParam = false;
|
inLocalOrParamOrReturn = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@@ -2,8 +2,8 @@ package de.dhbwstuttgart.bytecode.constraint;
|
|||||||
|
|
||||||
public class EqualConstraint extends TPHConstraint {
|
public class EqualConstraint extends TPHConstraint {
|
||||||
|
|
||||||
public EqualConstraint(String left, String right, Relation rel) {
|
public EqualConstraint(String left, String right) {
|
||||||
super(left, right, rel);
|
super(left, right, Relation.EQUAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -2,8 +2,8 @@ package de.dhbwstuttgart.bytecode.constraint;
|
|||||||
|
|
||||||
public class ExtendsConstraint extends TPHConstraint {
|
public class ExtendsConstraint extends TPHConstraint {
|
||||||
|
|
||||||
public ExtendsConstraint(String left, String right, Relation rel) {
|
public ExtendsConstraint(String left, String right) {
|
||||||
super(left, right, rel);
|
super(left, right, Relation.EXTENDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -44,6 +44,10 @@ public class TPHConstraint {
|
|||||||
return left.equals(tph)||right.equals(tph);
|
return left.equals(tph)||right.equals(tph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean equalConstraint(TPHConstraint constraint) {
|
||||||
|
return rel == constraint.getRel() && left.equals(constraint.getLeft()) && right.equals(constraint.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if(rel == Relation.EXTENDS) {
|
if(rel == Relation.EXTENDS) {
|
||||||
|
@@ -3,29 +3,27 @@ package de.dhbwstuttgart.bytecode.descriptor;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.*;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
import org.objectweb.asm.Type;
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.signature.TypeToSignature;
|
|
||||||
import de.dhbwstuttgart.bytecode.utilities.Lambda;
|
|
||||||
import de.dhbwstuttgart.bytecode.utilities.MethodFromMethodCall;
|
|
||||||
import de.dhbwstuttgart.bytecode.utilities.NormalConstructor;
|
|
||||||
import de.dhbwstuttgart.bytecode.utilities.NormalMethod;
|
|
||||||
import de.dhbwstuttgart.bytecode.utilities.SamMethod;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
public class DescriptorToString implements DescriptorVisitor{
|
public class DescriptorToString implements DescriptorVisitor, CONSTANTS {
|
||||||
ResultSet resultSet;
|
ResultSet resultSet;
|
||||||
|
|
||||||
|
public DescriptorToString() {
|
||||||
|
}
|
||||||
|
|
||||||
public DescriptorToString(ResultSet resultSet) {
|
public DescriptorToString(ResultSet resultSet) {
|
||||||
this.resultSet = resultSet;
|
this.resultSet = resultSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String addReturnType(String desc, RefTypeOrTPHOrWildcardOrGeneric returnType, ResultSet resultSet) {
|
private String addReturnType(String desc, RefTypeOrTPHOrWildcardOrGeneric returnType, ResultSet resultSet) {
|
||||||
if(resultSet.resolveType(returnType).resolvedType.toString().equals("void")){
|
if(resultSet.resolveType(returnType).resolvedType.toString().equals(CONSTANTS.VOID)){
|
||||||
desc = desc + ")V";
|
desc = desc + ")V";
|
||||||
}else {
|
}else {
|
||||||
desc = desc + ")" + "L"+resultSet.resolveType(returnType).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
desc = desc + ")" + "L"+resultSet.resolveType(returnType).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
||||||
@@ -53,7 +51,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
}else {
|
}else {
|
||||||
// desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
// desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
||||||
String resType = resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String resType = resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
if(resType.contains("TPH ")/*resType.subSequence(0, 4).equals("TPH ")*/) {
|
if(resType.contains(CONSTANTS.TPH)/*resType.subSequence(0, 4).equals("TPH ")*/) {
|
||||||
// Bound ist immer Object
|
// Bound ist immer Object
|
||||||
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
||||||
} else {
|
} else {
|
||||||
@@ -71,15 +69,15 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//TODO: generate a class java%% ... %%
|
//TODO: generate a class java%% ... %%
|
||||||
else if(resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()).contains("<")){
|
else if(resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()).contains(CONSTANTS.ANGLEBRACKET)){
|
||||||
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "$$").replace("<", "$$$").replace(">", "$$$")+ ";";
|
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "$$").replace(CONSTANTS.ANGLEBRACKET, "$$$").replace(">", "$$$")+ ";";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(resultSet.resolveType(method.getReturnType()).resolvedType.toString().equals("void")) {
|
if(resultSet.resolveType(method.getReturnType()).resolvedType.toString().equals(CONSTANTS.VOID)) {
|
||||||
desc += ")V";
|
desc += ")V";
|
||||||
}else {
|
}else {
|
||||||
if(method.hasGen()) {
|
if(method.hasGen()) {
|
||||||
@@ -90,7 +88,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
desc += ")L"+method.getGenericsAndBounds().get(ret)+ ";";
|
desc += ")L"+method.getGenericsAndBounds().get(ret)+ ";";
|
||||||
}else {
|
}else {
|
||||||
String resType = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String resType = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
if(resType.contains("TPH ")/*resType.subSequence(0, 4).equals("TPH ")*/) {
|
if(resType.contains(CONSTANTS.TPH)/*resType.subSequence(0, 4).equals("TPH ")*/) {
|
||||||
// desc += ")" + "L"+method.getGenericsAndBoundsMethod().get(resType.substring(4)+"$")+ ";";
|
// desc += ")" + "L"+method.getGenericsAndBoundsMethod().get(resType.substring(4)+"$")+ ";";
|
||||||
desc += ")" + "L"+Type.getInternalName(Object.class)+ ";";
|
desc += ")" + "L"+Type.getInternalName(Object.class)+ ";";
|
||||||
} else {
|
} else {
|
||||||
@@ -139,7 +137,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
}else {
|
}else {
|
||||||
// desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
// desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
||||||
String resType = 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.subSequence(0, 4).equals(CONSTANTS.TPH)) {
|
||||||
// Bound ist immer Object
|
// Bound ist immer Object
|
||||||
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
||||||
} else {
|
} else {
|
||||||
@@ -162,7 +160,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
while(itr.hasNext()) {
|
while(itr.hasNext()) {
|
||||||
FormalParameter fp = itr.next();
|
FormalParameter fp = itr.next();
|
||||||
String d = resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String d = resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
if(d.contains("TPH ") ||d.contains("<")) {
|
if(d.contains(CONSTANTS.TPH) ||d.contains(CONSTANTS.ANGLEBRACKET)) {
|
||||||
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
||||||
}else {
|
}else {
|
||||||
desc = desc + "L"+ d + ";";
|
desc = desc + "L"+ d + ";";
|
||||||
@@ -171,7 +169,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
|
|
||||||
String retType = resultSet.resolveType(lambdaExpression.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String retType = resultSet.resolveType(lambdaExpression.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
|
|
||||||
if(retType.contains("TPH ")|| retType.contains("<")){
|
if(retType.contains(CONSTANTS.TPH)|| retType.contains(CONSTANTS.ANGLEBRACKET)){
|
||||||
desc += ")L"+Type.getInternalName(Object.class)+ ";";
|
desc += ")L"+Type.getInternalName(Object.class)+ ";";
|
||||||
}else {
|
}else {
|
||||||
desc = desc + ")"+"L"+retType+";";
|
desc = desc + ")"+"L"+retType+";";
|
||||||
@@ -187,7 +185,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
RefTypeOrTPHOrWildcardOrGeneric rt = itr.next();
|
RefTypeOrTPHOrWildcardOrGeneric rt = itr.next();
|
||||||
String d = resultSet.resolveType(rt).resolvedType.acceptTV(new TypeToDescriptor());
|
String d = resultSet.resolveType(rt).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
|
|
||||||
if(d.contains("TPH ") ||d.contains("<")) {
|
if(d.contains(CONSTANTS.TPH) ||d.contains(CONSTANTS.ANGLEBRACKET)) {
|
||||||
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
||||||
}else {
|
}else {
|
||||||
desc += "L"+ d + ";";
|
desc += "L"+ d + ";";
|
||||||
@@ -196,7 +194,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
}
|
}
|
||||||
String retType = resultSet.resolveType(samMethod.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String retType = resultSet.resolveType(samMethod.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
|
|
||||||
if(retType.contains("TPH ")|| retType.contains("<")){
|
if(retType.contains(CONSTANTS.TPH)|| retType.contains(CONSTANTS.ANGLEBRACKET)){
|
||||||
desc += ")L"+Type.getInternalName(Object.class)+ ";";
|
desc += ")L"+Type.getInternalName(Object.class)+ ";";
|
||||||
}else {
|
}else {
|
||||||
desc = desc + ")"+"L"+retType+";";
|
desc = desc + ")"+"L"+retType+";";
|
||||||
@@ -210,7 +208,7 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
for(Expression e : methodFromMethodCall.getArgList().getArguments()) {
|
for(Expression e : methodFromMethodCall.getArgList().getArguments()) {
|
||||||
String d = resultSet.resolveType(e.getType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String d = resultSet.resolveType(e.getType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
|
|
||||||
if(d.contains("TPH ") ||d.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")) {
|
if(d.contains(CONSTANTS.TPH) ||d.contains(CONSTANTS.ANGLEBRACKET) || methodFromMethodCall.getReceiverName().contains("$$")) {
|
||||||
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
desc += "L"+Type.getInternalName(Object.class)+ ";";
|
||||||
}else {
|
}else {
|
||||||
if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(d)) {
|
if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(d)) {
|
||||||
@@ -225,9 +223,9 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
}
|
}
|
||||||
String retType = resultSet.resolveType(methodFromMethodCall.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
String retType = resultSet.resolveType(methodFromMethodCall.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
System.out.println("DescriptorToString retType = " + retType);
|
System.out.println("DescriptorToString retType = " + retType);
|
||||||
if(retType.equals("void")) {
|
if(retType.equals(CONSTANTS.VOID)) {
|
||||||
desc += ")V";
|
desc += ")V";
|
||||||
}else if(retType.contains("TPH ")|| retType.contains("<") || methodFromMethodCall.getReceiverName().contains("$$")){
|
}else if(retType.contains(CONSTANTS.TPH)|| retType.contains(CONSTANTS.ANGLEBRACKET) || methodFromMethodCall.getReceiverName().contains("$$")){
|
||||||
desc += ")L"+Type.getInternalName(Object.class)+ ";";
|
desc += ")L"+Type.getInternalName(Object.class)+ ";";
|
||||||
}else {
|
}else {
|
||||||
if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(retType)) {
|
if(methodFromMethodCall.getGenericsAndBoundsMethod().containsKey(retType)) {
|
||||||
@@ -242,4 +240,20 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String createDescForFunN(ArgumentList argumentList, String returnType) {
|
||||||
|
Iterator<Expression> itr1 = argumentList.getArguments().iterator();
|
||||||
|
String methDesc = "(";
|
||||||
|
while(itr1.hasNext()) {
|
||||||
|
methDesc += "L" + Type.getInternalName(Object.class) + ";";
|
||||||
|
itr1.next();
|
||||||
|
}
|
||||||
|
if (returnType.equals(CONSTANTS.VOID)){
|
||||||
|
methDesc += ")V";
|
||||||
|
} else {
|
||||||
|
methDesc += ")L" + Type.getInternalName(Object.class) + ";";
|
||||||
|
}
|
||||||
|
return methDesc;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -5,11 +5,13 @@ import de.dhbwstuttgart.bytecode.utilities.MethodFromMethodCall;
|
|||||||
import de.dhbwstuttgart.bytecode.utilities.NormalConstructor;
|
import de.dhbwstuttgart.bytecode.utilities.NormalConstructor;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.NormalMethod;
|
import de.dhbwstuttgart.bytecode.utilities.NormalMethod;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.SamMethod;
|
import de.dhbwstuttgart.bytecode.utilities.SamMethod;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
|
|
||||||
public interface DescriptorVisitor {
|
public interface DescriptorVisitor {
|
||||||
public String visit(NormalMethod method);
|
String visit(NormalMethod method);
|
||||||
public String visit(NormalConstructor constructor);
|
String visit(NormalConstructor constructor);
|
||||||
public String visit(Lambda lambdaExpression);
|
String visit(Lambda lambdaExpression);
|
||||||
public String visit(SamMethod samMethod);
|
String visit(SamMethod samMethod);
|
||||||
public String visit(MethodFromMethodCall methodFromMethodCall);
|
String visit(MethodFromMethodCall methodFromMethodCall);
|
||||||
|
String createDescForFunN(ArgumentList argumentList, String returnType);
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,8 @@ public class TypeToDescriptor implements TypeVisitor<String>{
|
|||||||
@Override
|
@Override
|
||||||
public String visit(SuperWildcardType superWildcardType) {
|
public String visit(SuperWildcardType superWildcardType) {
|
||||||
System.out.println("\nWILDCARD ="+superWildcardType.getInnerType().toString().replace(".", "/"));
|
System.out.println("\nWILDCARD ="+superWildcardType.getInnerType().toString().replace(".", "/"));
|
||||||
return superWildcardType.getInnerType().toString().replace(".", "/");
|
//return superWildcardType.getInnerType().toString().replace(".", "/");
|
||||||
|
return superWildcardType.getInnerType().acceptTV(new TypeToDescriptor());
|
||||||
//throw new NotImplementedException();
|
//throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +33,8 @@ public class TypeToDescriptor implements TypeVisitor<String>{
|
|||||||
@Override
|
@Override
|
||||||
public String visit(ExtendsWildcardType extendsWildcardType) {
|
public String visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
System.out.println("\nWILDCARD extends ="+extendsWildcardType.getInnerType().toString().replace(".", "/"));
|
System.out.println("\nWILDCARD extends ="+extendsWildcardType.getInnerType().toString().replace(".", "/"));
|
||||||
return extendsWildcardType.getInnerType().toString().replace(".", "/");
|
//return extendsWildcardType.getInnerType().toString().replace(".", "/");
|
||||||
|
return extendsWildcardType.getInnerType().acceptTV(new TypeToDescriptor());
|
||||||
//throw new NotImplementedException();
|
//throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,53 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGenerator;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.NameReplacementResult;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class represents the result of the constraints simplifier.
|
||||||
|
*
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ConstraintsSimplierResult {
|
||||||
|
private List<GenericsGeneratorResult> genericsGenResults;
|
||||||
|
private List<NameReplacementResult> nameReplacementResults;
|
||||||
|
/**
|
||||||
|
* @param genericsGenResults
|
||||||
|
*/
|
||||||
|
public ConstraintsSimplierResult(List<GenericsGeneratorResult> genericsGenResults,
|
||||||
|
List<NameReplacementResult> nameReplacementResults) {
|
||||||
|
this.genericsGenResults = genericsGenResults;
|
||||||
|
this.setNameReplacementResults(nameReplacementResults);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the genericsGenResults
|
||||||
|
*/
|
||||||
|
public List<GenericsGeneratorResult> getGenericsGenResults() {
|
||||||
|
return genericsGenResults;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param genericsGenResults the genericsGenResults to set
|
||||||
|
*/
|
||||||
|
public void setGenericsGenResults(List<GenericsGeneratorResult> genericsGenResults) {
|
||||||
|
this.genericsGenResults = genericsGenResults;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the nameReplacementResults
|
||||||
|
*/
|
||||||
|
public List<NameReplacementResult> getNameReplacementResults() {
|
||||||
|
return nameReplacementResults;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param nameReplacementResults the nameReplacementResults to set
|
||||||
|
*/
|
||||||
|
public void setNameReplacementResults(List<NameReplacementResult> nameReplacementResults) {
|
||||||
|
this.nameReplacementResults = nameReplacementResults;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,137 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGenerator;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.TPHExtractor;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ConstraintsSimplifier {
|
||||||
|
public static ConstraintsSimplierResult simplifyConstraints(final TPHExtractor tphExtractor, final List<GenericsGeneratorResult> genericsGeneratorResults, final List<String> tphsClass) {
|
||||||
|
|
||||||
|
List<TPHConstraint> allCons = tphExtractor.allCons;
|
||||||
|
List<TPHConstraint> equalCons = new ArrayList<>();
|
||||||
|
|
||||||
|
/* Step 1 */
|
||||||
|
List<ConstraintsWithSameLeftSide> foundCons = GenericsGeneratorUtility.findConstraintsWithLeftSameLeftSide(allCons);
|
||||||
|
if(!foundCons.isEmpty()) {
|
||||||
|
List<TPHConstraint> equalCons2 = new ArrayList<>();
|
||||||
|
GenericsGeneratorUtility.simplifyConstraintsWithSameLeftSide(foundCons,tphExtractor,tphsClass,equalCons2);
|
||||||
|
equalCons.addAll(equalCons2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if(!simpleCycles.isEmpty()) {
|
||||||
|
// handleSimpleCycles(allCons, simpleCycles,tphExtractor);
|
||||||
|
// equalCons.addAll(GenericsGeneratorUtility.getEqualConstraints(allCons));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
List<Cycle> cycles = findCycles(allCons);
|
||||||
|
|
||||||
|
if(!cycles.isEmpty()) {
|
||||||
|
handleCycle(genericsGeneratorResults, allCons, cycles,tphExtractor);
|
||||||
|
}
|
||||||
|
/* The right hand side of equal constraint is the new name in name replacement result */
|
||||||
|
List<NameReplacementResult> nameReplacementResults = GenericsGeneratorUtility.createNameReplacementResultsFromEqualConstraints(equalCons);
|
||||||
|
getEqualsFromNameReplacementResults(genericsGeneratorResults,nameReplacementResults);
|
||||||
|
ConstraintsSimplierResult result = new ConstraintsSimplierResult(genericsGeneratorResults, nameReplacementResults);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void getEqualsFromNameReplacementResults(List<GenericsGeneratorResult> genericsGeneratorResults,
|
||||||
|
List<NameReplacementResult> nameReplacementResults) {
|
||||||
|
genericsGeneratorResults.forEach(g->{
|
||||||
|
String tph = g.getConstraint().getLeft();
|
||||||
|
if (!nameReplacementResults.isEmpty()) {
|
||||||
|
collectAllEquals(nameReplacementResults, g, tph);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nameReplacementResults.isEmpty()) {
|
||||||
|
collectAllEquals(nameReplacementResults, g);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void collectAllEquals(List<NameReplacementResult> nameReplacementResults, GenericsGeneratorResult g) {
|
||||||
|
Set<String> equalsTPHs = g.getEqualsTPHs();
|
||||||
|
Set<String> tphsToAdd = getAllEqualTphs(equalsTPHs, nameReplacementResults);
|
||||||
|
while (!tphsToAdd.isEmpty()){
|
||||||
|
equalsTPHs.addAll(tphsToAdd);
|
||||||
|
tphsToAdd = getAllEqualTphs(equalsTPHs, nameReplacementResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Set<String> getAllEqualTphs(Set<String> equalsTPHs, List<NameReplacementResult> nameReplacementResults) {
|
||||||
|
Set<String> tphsToAdd = new HashSet<>();
|
||||||
|
equalsTPHs.forEach(e->{
|
||||||
|
collectAllEquals(nameReplacementResults, tphsToAdd,e);
|
||||||
|
});
|
||||||
|
return tphsToAdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void collectAllEquals(List<NameReplacementResult> nameReplacementResults, Set<String> tphsToAdd,
|
||||||
|
String tph) {
|
||||||
|
List<NameReplacementResult> toRemoveList = new ArrayList<>();
|
||||||
|
Optional<NameReplacementResult> nameReplacementResult = nameReplacementResults.stream().filter(n->n.getName().equals(tph)).findFirst();
|
||||||
|
nameReplacementResult.ifPresent(toRemove->{
|
||||||
|
tphsToAdd.addAll(toRemove.getOldNames());
|
||||||
|
toRemoveList.add(toRemove);
|
||||||
|
});
|
||||||
|
if(!toRemoveList.isEmpty()){
|
||||||
|
nameReplacementResults.remove(toRemoveList.get(0));
|
||||||
|
toRemoveList.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param nameReplacementResults
|
||||||
|
* @param g
|
||||||
|
* @param tph
|
||||||
|
*/
|
||||||
|
public static void collectAllEquals(List<NameReplacementResult> nameReplacementResults, GenericsGeneratorResult g,
|
||||||
|
String tph) {
|
||||||
|
List<NameReplacementResult> toRemoveList = new ArrayList<>();
|
||||||
|
Optional<NameReplacementResult> nameReplacementResult = nameReplacementResults.stream().filter(n->n.getName().equals(tph)).findFirst();
|
||||||
|
nameReplacementResult.ifPresent(toRemove->{
|
||||||
|
g.getEqualsTPHs().addAll(toRemove.getOldNames());
|
||||||
|
toRemoveList.add(toRemove);
|
||||||
|
});
|
||||||
|
if(!toRemoveList.isEmpty()){
|
||||||
|
nameReplacementResults.remove(toRemoveList.get(0));
|
||||||
|
toRemoveList.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param genericsGeneratorResults
|
||||||
|
* @param allCons
|
||||||
|
* @param cycles
|
||||||
|
* @param tphExtractor
|
||||||
|
*/
|
||||||
|
public static void handleCycle(List<GenericsGeneratorResult> genericsGeneratorResults,
|
||||||
|
List<TPHConstraint> allCons, List<Cycle> cycles, TPHExtractor tphExtractor) {
|
||||||
|
GenericsGeneratorUtility.modifyRelationForConstraintsInCycle(cycles);
|
||||||
|
List<NameReplacementResult> nameReplacementResults = GenericsGeneratorUtility.substituteTPHSFormCycle(allCons, cycles,tphExtractor);
|
||||||
|
GenericsGeneratorUtility.createResults(genericsGeneratorResults,nameReplacementResults);
|
||||||
|
GenericsGeneratorUtility.removeEqualConstraints(allCons);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param allCons
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static List<Cycle> findCycles(List<TPHConstraint> allCons) {
|
||||||
|
/* find all cycles */
|
||||||
|
CyclesFinder cyclesFinder = new CyclesFinder(allCons);
|
||||||
|
List<Cycle> cycles = cyclesFinder.findCycles();
|
||||||
|
return cycles;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGenerator;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.Cycle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class CyclesFinder {
|
||||||
|
private final List<TPHConstraint> allCons;
|
||||||
|
|
||||||
|
public CyclesFinder(List<TPHConstraint> allCons) {
|
||||||
|
this.allCons = allCons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Cycle> findCycles() {
|
||||||
|
List<TPHConstraint> vistedConstraints = new ArrayList<>(allCons.size());
|
||||||
|
List<Cycle> cycles = new ArrayList<>();
|
||||||
|
for (TPHConstraint constraint : allCons) {
|
||||||
|
if(constraint.getRel()==Relation.EQUAL)
|
||||||
|
continue;
|
||||||
|
if (!vistedConstraints.contains(constraint)) {
|
||||||
|
vistedConstraints.add(constraint);
|
||||||
|
checkConstraint(constraint, vistedConstraints, cycles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cycles;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkConstraint(TPHConstraint constraint, List<TPHConstraint> vistedConstraints,
|
||||||
|
List<Cycle> cycles) {
|
||||||
|
List<String> tphsInRelation = new LinkedList<>();
|
||||||
|
List<TPHConstraint> maybeCycle = new ArrayList<>();
|
||||||
|
maybeCycle.add(constraint);
|
||||||
|
tphsInRelation.add(constraint.getLeft());
|
||||||
|
tphsInRelation.add(constraint.getRight());
|
||||||
|
Optional<TPHConstraint> nextConstraint = getConstraintInRelation(tphsInRelation, maybeCycle);
|
||||||
|
while (nextConstraint.isPresent()) {
|
||||||
|
if(containsInLongCycle(nextConstraint.get(), cycles)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (isCycle(tphsInRelation)) {
|
||||||
|
addAllToVisitedConstraints(vistedConstraints, maybeCycle);
|
||||||
|
Cycle cycle = new Cycle(maybeCycle);
|
||||||
|
cycles.add(cycle);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nextConstraint = getConstraintInRelation(tphsInRelation, maybeCycle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// addAllToVisitedConstraints(vistedConstraints, maybeCycle);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean containsInLongCycle(TPHConstraint c, List<Cycle> cycles) {
|
||||||
|
for(Cycle cycle : cycles) {
|
||||||
|
if(cycle.containConstraint(c))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addAllToVisitedConstraints(List<TPHConstraint> vistedConstraints, List<TPHConstraint> maybeCycle) {
|
||||||
|
for (TPHConstraint con : maybeCycle) {
|
||||||
|
if (!vistedConstraints.contains(con))
|
||||||
|
vistedConstraints.add(con);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<TPHConstraint> getConstraintInRelation(List<String> tphsInRelation,
|
||||||
|
List<TPHConstraint> maybeCycle) {
|
||||||
|
TPHConstraint constraint = getConstraintByLeftSide(tphsInRelation.get(tphsInRelation.size()-1),maybeCycle);
|
||||||
|
Optional<TPHConstraint> nextConstraint = Optional.ofNullable(constraint);
|
||||||
|
if(nextConstraint.isPresent()) {
|
||||||
|
maybeCycle.add(constraint);
|
||||||
|
tphsInRelation.add(constraint.getRight());
|
||||||
|
}
|
||||||
|
return nextConstraint;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TPHConstraint getConstraintByLeftSide(String left, List<TPHConstraint> maybeCycle) {
|
||||||
|
for(TPHConstraint constraint : allCons) {
|
||||||
|
if(constraint.getRel()==Relation.EQUAL)
|
||||||
|
continue;
|
||||||
|
if(maybeCycle.contains(constraint))
|
||||||
|
continue;
|
||||||
|
if(constraint.getLeft().equals(left))
|
||||||
|
return constraint;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isCycle(List<String> tphsInRelation) {
|
||||||
|
return tphsInRelation.get(0).equals(tphsInRelation.get(tphsInRelation.size() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,675 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGenerator;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.TPHExtractor;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericGenratorResultForSourceFile;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResultForClass;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.MethodAndConstraints;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.MethodUtility;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.Resolver;
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ASTVisitor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Constructor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Field;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.GenericDeclarationList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Method;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ParameterList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Assign;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.AssignToField;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.BinaryExpr;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Block;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.CastExpr;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.DoStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.EmptyStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ExpressionReceiver;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.FieldVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ForStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.IfStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.InstanceOf;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Literal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.NewArray;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.NewClass;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ReturnVoid;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.StaticClassName;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Super;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.SuperCall;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.This;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.UnaryExpr;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.WhileStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GeneratedGenericsFinder implements ASTVisitor {
|
||||||
|
private final TPHExtractor tphExtractor = new TPHExtractor();
|
||||||
|
private Collection<ResultSet> listOfResultSets;
|
||||||
|
private SourceFile sf;
|
||||||
|
private List<String> tphsClass;
|
||||||
|
private GenericGenratorResultForSourceFile generatedGenericsForSF;
|
||||||
|
private ResultSet resultSet;
|
||||||
|
private final List<String> methodNameAndParamsT = new ArrayList<>();
|
||||||
|
|
||||||
|
private String pkgName;
|
||||||
|
private JavaClassName className;
|
||||||
|
private Resolver resolver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param sf
|
||||||
|
* @param listOfResultSets
|
||||||
|
*/
|
||||||
|
public GeneratedGenericsFinder(SourceFile sf, Collection<ResultSet> listOfResultSets) {
|
||||||
|
this.sf = sf;
|
||||||
|
this.listOfResultSets = listOfResultSets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenericGenratorResultForSourceFile findGeneratedGenerics() {
|
||||||
|
sf.accept(this);
|
||||||
|
return generatedGenericsForSF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* SourceFile)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(SourceFile sourceFile) {
|
||||||
|
pkgName = sf.getPkgName();
|
||||||
|
generatedGenericsForSF = new GenericGenratorResultForSourceFile(pkgName);
|
||||||
|
for (ClassOrInterface cl : sourceFile.getClasses()) {
|
||||||
|
cl.accept(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* ClassOrInterface)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(ClassOrInterface classOrInterface) {
|
||||||
|
className = classOrInterface.getClassName();
|
||||||
|
List<ResultSet> listOfResultSetsList = new ArrayList<>(listOfResultSets);
|
||||||
|
|
||||||
|
boolean isVisited = false;
|
||||||
|
|
||||||
|
ConstraintsSimplierResult simplifiedConstraints = null;
|
||||||
|
GenericsGeneratorResultForClass ggResult = null;
|
||||||
|
|
||||||
|
for (int i = 0; i < listOfResultSetsList.size(); i++) {
|
||||||
|
resultSet = listOfResultSetsList.get(i);
|
||||||
|
tphExtractor.setResultSet(resultSet);
|
||||||
|
resolver = new Resolver(resultSet);
|
||||||
|
classOrInterface.accept(tphExtractor);
|
||||||
|
tphsClass = tphExtractor.tphsClass;
|
||||||
|
simplifiedConstraints = GenericsGenerator.simplifyConstraints(tphExtractor, tphsClass);
|
||||||
|
if(!isVisited) {
|
||||||
|
ggResult = GenericsGenerator.generateConstraints(className, tphExtractor, tphsClass,simplifiedConstraints);
|
||||||
|
isVisited = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Method m : classOrInterface.getMethods()) {
|
||||||
|
addMethodConstraints(simplifiedConstraints, ggResult, m);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ggResult != null)
|
||||||
|
generatedGenericsForSF.addGenericGeneratorResultClass(ggResult);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param simplifiedConstraints
|
||||||
|
* @param ggResult
|
||||||
|
* @param m
|
||||||
|
*/
|
||||||
|
public void addMethodConstraints(ConstraintsSimplierResult simplifiedConstraints,
|
||||||
|
GenericsGeneratorResultForClass ggResult, Method m) {
|
||||||
|
String id = MethodUtility.createID(resolver, m);
|
||||||
|
boolean isInGGResult = (ggResult != null) && ggResult.contains(id);
|
||||||
|
if(methodNameAndParamsT.contains(id) || isInGGResult)
|
||||||
|
return;
|
||||||
|
methodNameAndParamsT.add(id);
|
||||||
|
Optional<MethodAndTPH> methodAndTPH = GenericsGeneratorUtility.getMethodAndTphs(tphExtractor.ListOfMethodsAndTph,id);
|
||||||
|
methodAndTPH.ifPresent(mt->{
|
||||||
|
MethodAndConstraints methodConstraints = GenericsGenerator.generateConstraintsForMethod(tphExtractor.allCons, mt , simplifiedConstraints, tphsClass);
|
||||||
|
ggResult.getMethodsAndTheirConstraints().getMethodsAndConstraints().add(methodConstraints);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* Method)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Method method) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* ParameterList)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(ParameterList formalParameters) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* Constructor)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Constructor field) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.ArgumentList)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(ArgumentList argumentList) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.LambdaExpression)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.Assign)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Assign assign) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.BinaryExpr)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(BinaryExpr binary) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.Block)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Block block) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.CastExpr)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(CastExpr castExpr) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.EmptyStmt)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(EmptyStmt emptyStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.FieldVar)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(FieldVar fieldVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.ForStmt)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(ForStmt forStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.IfStmt)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(IfStmt ifStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.InstanceOf)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(InstanceOf instanceOf) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.LocalVar)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVar localVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.LocalVarDecl)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.MethodCall)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(MethodCall methodCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.NewClass)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(NewClass methodCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.NewArray)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(NewArray newArray) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.Return)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Return aReturn) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.ReturnVoid)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(ReturnVoid aReturn) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.StaticClassName)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(StaticClassName staticClassName) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.Super)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Super aSuper) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.This)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(This aThis) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.WhileStmt)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(WhileStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.DoStmt)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(DoStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.AssignToField)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToField assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.parser.
|
||||||
|
* SyntaxTreeGenerator.AssignToLocal)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToLocal assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.SuperCall)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(SuperCall superCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.ExpressionReceiver)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(ExpressionReceiver expressionReceiver) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.UnaryExpr)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryExpr unaryExpr) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see de.dhbwstuttgart.syntaxtree.StatementVisitor#visit(de.dhbwstuttgart.
|
||||||
|
* syntaxtree.statement.Literal)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* GenericTypeVar)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(GenericTypeVar genericTypeVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* FormalParameter)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(FormalParameter formalParameter) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* GenericDeclarationList)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(GenericDeclarationList genericTypeVars) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.
|
||||||
|
* Field)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(Field field) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.type
|
||||||
|
* .RefType)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(RefType refType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.type
|
||||||
|
* .SuperWildcardType)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(SuperWildcardType superWildcardType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.type
|
||||||
|
* .TypePlaceholder)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(TypePlaceholder typePlaceholder) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.type
|
||||||
|
* .ExtendsWildcardType)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* de.dhbwstuttgart.syntaxtree.ASTVisitor#visit(de.dhbwstuttgart.syntaxtree.type
|
||||||
|
* .GenericRefType)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void visit(GenericRefType genericRefType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,256 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGenerator;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.*;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.TPHExtractor;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.ExtendsConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericsGenerator {
|
||||||
|
/*TODO: When generating generics for a class if we have the following:
|
||||||
|
tphClass < tphMeth1 < tphMeth2
|
||||||
|
then we have to convert tphMeth1, tphMeth2 to tph class and generate the following
|
||||||
|
class constraints: tphClass < tphMeth1, tphMeth1 < tphMeth2, tphMeth2 < Object
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static GenericsGeneratorResultForClass generateConstraints(final JavaClassName className, final TPHExtractor tphExtractor,
|
||||||
|
final List<String> tphsClass, final ConstraintsSimplierResult simplifiedConstraints) {
|
||||||
|
|
||||||
|
List<GenericsGeneratorResult> classConstraints = generateConstraintsForClass(tphExtractor,
|
||||||
|
simplifiedConstraints, tphsClass);
|
||||||
|
// GenericGeneratorResultsForAllMethods methodsAndConstraints = generateConstraintsForAllMethods(tphExtractor,
|
||||||
|
// simplifiedConstraints, tphsClass);
|
||||||
|
GenericGeneratorResultsForAllMethods methodsAndConstraints = new GenericGeneratorResultsForAllMethods(new ArrayList<>());
|
||||||
|
|
||||||
|
return new GenericsGeneratorResultForClass(className, classConstraints, methodsAndConstraints);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tphExtractor
|
||||||
|
* @param tphsClass
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static ConstraintsSimplierResult simplifyConstraints(final TPHExtractor tphExtractor,
|
||||||
|
final List<String> tphsClass) {
|
||||||
|
final List<GenericsGeneratorResult> genericsGeneratorResults = new ArrayList<>();
|
||||||
|
|
||||||
|
ConstraintsSimplierResult simplifiedConstraints = ConstraintsSimplifier.simplifyConstraints(tphExtractor,
|
||||||
|
genericsGeneratorResults, tphsClass);
|
||||||
|
return simplifiedConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static List<GenericsGeneratorResult> generateConstraintsForClass(final TPHExtractor tphExtractor,
|
||||||
|
final ConstraintsSimplierResult simplifiedConstraints, final List<String> tphsClass) {
|
||||||
|
final List<GenericsGeneratorResult> constraints = new ArrayList<>();
|
||||||
|
|
||||||
|
if (tphsClass.isEmpty())
|
||||||
|
return constraints;
|
||||||
|
|
||||||
|
final List<TPHConstraint> allCons = tphExtractor.allCons;
|
||||||
|
|
||||||
|
final Set<String> visitedTPHs = new HashSet<>();
|
||||||
|
|
||||||
|
final List<String> methodTPHs = tphExtractor.ListOfMethodsAndTph.stream().map(m -> m.getLocalTphs())
|
||||||
|
.flatMap(l -> l.stream()).collect(Collectors.toList());
|
||||||
|
|
||||||
|
createConstraintsForClassTphs(simplifiedConstraints, tphsClass, constraints, allCons, visitedTPHs, methodTPHs);
|
||||||
|
|
||||||
|
GenericsGeneratorUtility.addTPHsToClassTPHs(constraints, tphsClass);
|
||||||
|
GenericsGeneratorUtility.removeClassTPHsFromMethodTPHs(tphsClass, tphExtractor);
|
||||||
|
|
||||||
|
generateGGConstraintsForTPH(tphsClass, constraints, simplifiedConstraints);
|
||||||
|
|
||||||
|
return constraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createConstraintsForClassTphs(ConstraintsSimplierResult simplifiedConstraints, List<String> tphsClass, List<GenericsGeneratorResult> constraints, List<TPHConstraint> allCons, Set<String> visitedTPHs, List<String> methodTPHs) {
|
||||||
|
List<String> classAndMethodTphs = new ArrayList<>(tphsClass);
|
||||||
|
classAndMethodTphs.addAll(methodTPHs);
|
||||||
|
|
||||||
|
for (String tph : tphsClass) {
|
||||||
|
|
||||||
|
if (visitedTPHs.contains(tph))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
final LinkedList<String> tphsInRel = GenericsGeneratorUtility
|
||||||
|
.createLinkedListForTPHsInRelationClass(allCons, tphsClass, methodTPHs, visitedTPHs, tph);
|
||||||
|
|
||||||
|
generateConstraintsForClassFromList(tphsInRel,simplifiedConstraints,classAndMethodTphs,constraints);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void generateConstraintsForClassFromList(LinkedList<String> tphsInRel, ConstraintsSimplierResult simplifiedConstraints, List<String> classAndMethodTphs, List<GenericsGeneratorResult> constraints) {
|
||||||
|
|
||||||
|
if(tphsInRel.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
List<GenericsGeneratorResult> resultConstraints = new ArrayList<>();
|
||||||
|
String subType = tphsInRel.getFirst();
|
||||||
|
String superType = GenericsGeneratorUtility.getNextClassTph(classAndMethodTphs, tphsInRel);
|
||||||
|
|
||||||
|
int idxOfSuper = tphsInRel.indexOf(superType);
|
||||||
|
int size = tphsInRel.size();
|
||||||
|
while (size > 2 && idxOfSuper < size-1){
|
||||||
|
GenericsGeneratorResult genericsGeneratorResult = getGenericsGeneratorResultForClass(simplifiedConstraints, subType, superType);
|
||||||
|
constraints.add(genericsGeneratorResult);
|
||||||
|
|
||||||
|
tphsInRel = new LinkedList<>(tphsInRel.subList(idxOfSuper, size));
|
||||||
|
subType = tphsInRel.getFirst();
|
||||||
|
superType = GenericsGeneratorUtility.getNextClassTph(classAndMethodTphs, tphsInRel);
|
||||||
|
|
||||||
|
idxOfSuper = tphsInRel.indexOf(superType);
|
||||||
|
size = tphsInRel.size();
|
||||||
|
}
|
||||||
|
GenericsGeneratorResult genericsGeneratorResult = getGenericsGeneratorResultForClass(simplifiedConstraints, subType, superType);
|
||||||
|
constraints.add(genericsGeneratorResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static GenericsGeneratorResult getGenericsGeneratorResultForClass(ConstraintsSimplierResult simplifiedConstraints, String subType, String superType) {
|
||||||
|
TPHConstraint constraint = new ExtendsConstraint(subType, superType);
|
||||||
|
|
||||||
|
Set<String> equalSet = GenericsGeneratorUtility
|
||||||
|
.createEqualSet(simplifiedConstraints.getNameReplacementResults(), subType);
|
||||||
|
|
||||||
|
return new GenericsGeneratorResult(constraint, equalSet);
|
||||||
|
}
|
||||||
|
/* TODO Remove this methoda*/
|
||||||
|
private static GenericsGeneratorResult generateGGResultForClass(LinkedList<String> tphsInRel,
|
||||||
|
ConstraintsSimplierResult simplifiedConstraints, List<String> tphsClass) {
|
||||||
|
String subType = tphsInRel.getFirst();
|
||||||
|
|
||||||
|
String superType = GenericsGeneratorUtility.getNextClassTph(tphsClass, tphsInRel);
|
||||||
|
|
||||||
|
TPHConstraint constraint = new ExtendsConstraint(subType, superType);
|
||||||
|
|
||||||
|
Set<String> equalSet = GenericsGeneratorUtility
|
||||||
|
.createEqualSet(simplifiedConstraints.getNameReplacementResults(), subType);
|
||||||
|
|
||||||
|
return new GenericsGeneratorResult(constraint, equalSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static GenericGeneratorResultsForAllMethods generateConstraintsForAllMethods(
|
||||||
|
final TPHExtractor tphExtractor, ConstraintsSimplierResult simplifiedConstraints, List<String> tphsClass) {
|
||||||
|
|
||||||
|
final List<MethodAndConstraints> methodsAndConstraints = new ArrayList<>();
|
||||||
|
final GenericGeneratorResultsForAllMethods results = new GenericGeneratorResultsForAllMethods(
|
||||||
|
methodsAndConstraints);
|
||||||
|
tphExtractor.ListOfMethodsAndTph.forEach(m -> {
|
||||||
|
MethodAndConstraints methAndCons = generateConstraintsForMethod(tphExtractor.allCons, m,
|
||||||
|
simplifiedConstraints, tphsClass);
|
||||||
|
methodsAndConstraints.add(methAndCons);
|
||||||
|
});
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MethodAndConstraints generateConstraintsForMethod(final List<TPHConstraint> allCons,
|
||||||
|
final MethodAndTPH m, final ConstraintsSimplierResult simplifiedConstraints, List<String> tphsClass) {
|
||||||
|
final List<String> localTphs = m.getLocalTphs();
|
||||||
|
|
||||||
|
List<GenericsGeneratorResult> constraints = new ArrayList<>();
|
||||||
|
MethodAndConstraints result = new MethodAndConstraints(m.getId(), constraints);
|
||||||
|
|
||||||
|
if (localTphs.isEmpty())
|
||||||
|
return result;
|
||||||
|
|
||||||
|
if (localTphs.size() == 1 && tphsClass.isEmpty()) {
|
||||||
|
generateGGConstraintsForTPH(localTphs, constraints, simplifiedConstraints);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Set<String> visitedTPHs = new HashSet<>();
|
||||||
|
|
||||||
|
for (String tph : localTphs) {
|
||||||
|
|
||||||
|
if (visitedTPHs.contains(tph))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
final LinkedList<String> tphsInRel = GenericsGeneratorUtility.createLinkedListForTPHsInRelation(allCons,
|
||||||
|
localTphs, tphsClass, visitedTPHs, tph);
|
||||||
|
if (!tphsInRel.isEmpty()) {
|
||||||
|
GenericsGeneratorUtility.removeNotLocalTphs(tphsInRel, localTphs, tphsClass);
|
||||||
|
if (!GenericsGeneratorUtility.isInResult(tphsInRel.getFirst(), constraints)) {
|
||||||
|
GenericsGeneratorResult constraint = generateGGResult(tphsInRel, simplifiedConstraints);
|
||||||
|
constraints.add(constraint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
generateGGConstraintsForTPH(localTphs, constraints, simplifiedConstraints);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void generateGGConstraintsForTPH(List<String> localTphs,
|
||||||
|
final List<GenericsGeneratorResult> constraints, final ConstraintsSimplierResult simplifiedConstraints) {
|
||||||
|
|
||||||
|
localTphs.forEach(tph -> {
|
||||||
|
boolean isInSimplifiedConstraints = GenericsGeneratorUtility.isTPHInGenericGeneratorResult(simplifiedConstraints.getGenericsGenResults(), tph);
|
||||||
|
if (isInSimplifiedConstraints) {
|
||||||
|
GenericsGeneratorResult ggResult = GenericsGeneratorUtility.getGenericGeneratorResult(simplifiedConstraints.getGenericsGenResults(), tph).get();
|
||||||
|
// GenericsGeneratorUtility.removeGenericGeneratorResult(simplifiedConstraints.getGenericsGenResults(),ggResult);
|
||||||
|
constraints.add(ggResult);
|
||||||
|
} else {
|
||||||
|
boolean isInConstraints = GenericsGeneratorUtility.isTPHInGenericGeneratorResult(constraints, tph);
|
||||||
|
|
||||||
|
if (!isInConstraints) {
|
||||||
|
GenericsGeneratorResult ggResult = generateGGResult(tph, simplifiedConstraints.getNameReplacementResults());
|
||||||
|
constraints.add(ggResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static GenericsGeneratorResult generateGGResult(String tph,
|
||||||
|
List<NameReplacementResult> nameReplacementResults) {
|
||||||
|
String superType = Type.getInternalName(Object.class);
|
||||||
|
TPHConstraint constraint = new ExtendsConstraint(tph, superType);
|
||||||
|
Set<String> equalSet = GenericsGeneratorUtility.createEqualSet(nameReplacementResults, tph);
|
||||||
|
|
||||||
|
return new GenericsGeneratorResult(constraint, equalSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static GenericsGeneratorResult generateGGResult(final LinkedList<String> tphsInRel,
|
||||||
|
final ConstraintsSimplierResult simplifiedConstraints) {
|
||||||
|
|
||||||
|
String subType = tphsInRel.getFirst();
|
||||||
|
|
||||||
|
if (tphsInRel.size() == 1) {
|
||||||
|
Optional<GenericsGeneratorResult> constraintFromSimplifiedCon = simplifiedConstraints
|
||||||
|
.getGenericsGenResults().stream().filter(g -> g.getConstraint().getLeft().equals(subType))
|
||||||
|
.findFirst();
|
||||||
|
if (constraintFromSimplifiedCon.isPresent())
|
||||||
|
return constraintFromSimplifiedCon.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
String superType = tphsInRel.size() > 1 ? tphsInRel.getLast() : Type.getInternalName(Object.class);
|
||||||
|
|
||||||
|
TPHConstraint constraint = new ExtendsConstraint(subType, superType);
|
||||||
|
|
||||||
|
Set<String> equalSet = GenericsGeneratorUtility
|
||||||
|
.createEqualSet(simplifiedConstraints.getNameReplacementResults(), subType);
|
||||||
|
|
||||||
|
return new GenericsGeneratorResult(constraint, equalSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,571 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGenerator;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.*;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.TPHExtractor;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.EqualConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.ExtendsConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.ConstraintsFinder;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.NameReplacer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericsGeneratorUtility {
|
||||||
|
/**
|
||||||
|
* Returns a list of type placeholders names of a specified method
|
||||||
|
*
|
||||||
|
* @param methodID The id of the method ReturnTypeMethodName(ParameterTypes)
|
||||||
|
* @param listOfMethodsAndTph List of all methods
|
||||||
|
* @return a list of type placehoders names
|
||||||
|
*/
|
||||||
|
public static List<String> getMethodTPHS(String methodID, ArrayList<MethodAndTPH> listOfMethodsAndTph) {
|
||||||
|
return listOfMethodsAndTph.stream().filter(mt->mt.getId().equals(methodID)).findAny().get().getTphs();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a reverse constraint of a specified constraint which is given by its left and right
|
||||||
|
* side
|
||||||
|
*
|
||||||
|
* @param allCons List of all constraints
|
||||||
|
* @param left The left side of the given constraint
|
||||||
|
* @param right The right side of the given constraint
|
||||||
|
* @return An Optional object which contains the reverse constraint if it is exist
|
||||||
|
*/
|
||||||
|
public static Optional<TPHConstraint> getReverseConstraint(List<TPHConstraint> allCons, String left, String right) {
|
||||||
|
return allCons.stream().filter(c->{
|
||||||
|
return c.getRight().equals(left) && c.getLeft().equals(right);
|
||||||
|
}).findAny();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Substitutes the old name by the new name in all constraints
|
||||||
|
*
|
||||||
|
* @param allCons List of all constraints
|
||||||
|
* @param oldName The name to be replaced
|
||||||
|
* @param newName The new name
|
||||||
|
*/
|
||||||
|
public static void substituteTPH(List<TPHConstraint> allCons, String oldName, String newName) {
|
||||||
|
allCons.stream()
|
||||||
|
.filter(c->c.getRel()==Relation.EXTENDS)
|
||||||
|
.forEach(c->{
|
||||||
|
if(c.getLeft().equals(oldName))
|
||||||
|
c.setLeft(newName);
|
||||||
|
if(c.getRight().equals(oldName))
|
||||||
|
c.setRight(newName);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<ConstraintsWithSameLeftSide> findConstraintsWithLeftSameLeftSide(List<TPHConstraint> allCons) {
|
||||||
|
// finder looks for constraints that have the same left hand side
|
||||||
|
// and put them in a list
|
||||||
|
ConstraintsFinder finder = new ConstraintsFinder(allCons);
|
||||||
|
List<ConstraintsWithSameLeftSide> foundCons = finder.findConstraints();
|
||||||
|
return foundCons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void simplifyConstraintsWithSameLeftSide(List<ConstraintsWithSameLeftSide> consWithSameLeftSide,
|
||||||
|
List<TPHConstraint> allCons, List<String> methodTPHS) {
|
||||||
|
List<TPHConstraint> eqCons = new ArrayList<>();
|
||||||
|
|
||||||
|
for (ConstraintsWithSameLeftSide list : consWithSameLeftSide) {
|
||||||
|
NameReplacementResult replRes = modifyNames(allCons, methodTPHS, list);
|
||||||
|
createEqualConstraintsForNames(replRes.getName(), replRes.getOldNames(),eqCons);
|
||||||
|
|
||||||
|
for (TPHConstraint c : allCons) {
|
||||||
|
if (c.getRel() == Relation.EQUAL && replRes.getName().equals(c.getRight())) {
|
||||||
|
eqCons.add(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateEqualCons(replRes, eqCons);
|
||||||
|
|
||||||
|
TPHConstraint c = list.getConstraints().get(0);
|
||||||
|
allCons.removeAll(list.getConstraints());
|
||||||
|
allCons.add(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void simplifyConstraintsWithSameLeftSide(List<ConstraintsWithSameLeftSide> consWithSameLeftSide,
|
||||||
|
TPHExtractor tphExtractor, List<String> tphsClass, List<TPHConstraint> equalCons) {
|
||||||
|
List<TPHConstraint> allCons = tphExtractor.allCons;
|
||||||
|
|
||||||
|
for (ConstraintsWithSameLeftSide list : consWithSameLeftSide) {
|
||||||
|
if(!stillWithSameLeftSide(list))
|
||||||
|
continue;
|
||||||
|
NameReplacementResult replRes = modifyNames(allCons, list, tphExtractor.ListOfMethodsAndTph,tphsClass);
|
||||||
|
createEqualConstraintsForNames(replRes.getName(), replRes.getOldNames(),equalCons);
|
||||||
|
|
||||||
|
for (TPHConstraint c : allCons) {
|
||||||
|
if (c.getRel() == Relation.EQUAL && replRes.getName().equals(c.getRight())) {
|
||||||
|
equalCons.add(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateEqualCons(replRes, equalCons);
|
||||||
|
|
||||||
|
TPHConstraint c = list.getConstraints().get(0);
|
||||||
|
allCons.removeAll(list.getConstraints());
|
||||||
|
removeConstraintsWithSameLeftAndRightSide(allCons);
|
||||||
|
allCons.add(c);
|
||||||
|
removeDuplicate(allCons);
|
||||||
|
}
|
||||||
|
consWithSameLeftSide.clear();
|
||||||
|
consWithSameLeftSide = findConstraintsWithLeftSameLeftSide(allCons);
|
||||||
|
if(!consWithSameLeftSide.isEmpty())
|
||||||
|
simplifyConstraintsWithSameLeftSide(consWithSameLeftSide,tphExtractor,tphsClass,equalCons);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void removeDuplicate(List<TPHConstraint> allCons) {
|
||||||
|
List<TPHConstraint> visited = new ArrayList<>();
|
||||||
|
List<Integer> toRemove = new ArrayList<>();
|
||||||
|
checkForDuplicate(allCons, visited, toRemove);
|
||||||
|
removeConstraintsByIndex(allCons, toRemove);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void removeConstraintsByIndex(List<TPHConstraint> allCons, List<Integer> toRemove) {
|
||||||
|
for(int index : toRemove)
|
||||||
|
allCons.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkForDuplicate(List<TPHConstraint> allCons, List<TPHConstraint> visited, List<Integer> toRemove) {
|
||||||
|
for(int i = 0;i<allCons.size();++i){
|
||||||
|
markConstraintIfDuplicate(allCons, visited, toRemove, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void markConstraintIfDuplicate(List<TPHConstraint> allCons, List<TPHConstraint> visited, List<Integer> toRemove, int i) {
|
||||||
|
TPHConstraint constraint = allCons.get(i);
|
||||||
|
if(containsInList(visited,constraint.getLeft(),constraint.getRight())){
|
||||||
|
toRemove.add(i);
|
||||||
|
} else {
|
||||||
|
visited.add(constraint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean containsInList(List<TPHConstraint> allConstraints, String left, String right) {
|
||||||
|
for(TPHConstraint constraint : allConstraints)
|
||||||
|
if(constraint.getLeft().equals(left) && constraint.getRight().equals(right))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addNewConstraintsWithSameLeftSide(ConstraintsWithSameLeftSide constraintsWithSameLeftSide, List<TPHConstraint> allCons) {
|
||||||
|
allCons.forEach(c->{
|
||||||
|
if (constraintsWithSameLeftSide.getConstraints().get(0).getLeft().equals(c.getLeft())){
|
||||||
|
if(!constraintsWithSameLeftSide.getConstraints().contains(c))
|
||||||
|
constraintsWithSameLeftSide.getConstraints().add(c);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkForNewConstraintsWithSameLeftSide(List<ConstraintsWithSameLeftSide> consWithSameLeftSide, List<TPHConstraint> allCons) {
|
||||||
|
allCons.forEach(c->{
|
||||||
|
Optional<ConstraintsWithSameLeftSide> constraintsWithSameLeftSide = getConstraintsWithSameLeftSide(consWithSameLeftSide, c.getLeft());
|
||||||
|
constraintsWithSameLeftSide.ifPresent(cls->{
|
||||||
|
if(!cls.getConstraints().contains(c))
|
||||||
|
cls.getConstraints().add(c);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Optional<ConstraintsWithSameLeftSide> getConstraintsWithSameLeftSide(List<ConstraintsWithSameLeftSide> consWithSameLeftSide, String left) {
|
||||||
|
return consWithSameLeftSide.stream().filter(csl->isContainedInConsWithLeftSide(csl,left)).findAny();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isContainedInConsWithLeftSide(ConstraintsWithSameLeftSide csl, String left) {
|
||||||
|
return csl.getConstraints().get(0).getLeft().equals(left);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean stillWithSameLeftSide(ConstraintsWithSameLeftSide constraints) {
|
||||||
|
removeUnvalidConstraints(constraints);
|
||||||
|
return constraints.getConstraints().size()>1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void removeUnvalidConstraints(ConstraintsWithSameLeftSide constraints) {
|
||||||
|
List<TPHConstraint> toRemove = new ArrayList<>();
|
||||||
|
constraints.getConstraints().forEach(c->{
|
||||||
|
if(c.getLeft().equals(c.getRight()))
|
||||||
|
toRemove.add(c);
|
||||||
|
});
|
||||||
|
if(!toRemove.isEmpty())
|
||||||
|
constraints.getConstraints().removeAll(toRemove);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void removeConstraintsWithSameLeftAndRightSide(List<TPHConstraint> allCons) {
|
||||||
|
List<TPHConstraint> toRemove = new ArrayList<>();
|
||||||
|
allCons.forEach(c->{
|
||||||
|
if(c.getLeft().equals(c.getRight()))
|
||||||
|
toRemove.add(c);
|
||||||
|
});
|
||||||
|
allCons.removeAll(toRemove);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createEqualConstraintsForNames(String name, List<String> equalNames, List<TPHConstraint> eqCons) {
|
||||||
|
// create an equal constraint for each value in repres
|
||||||
|
for (String eName : equalNames) {
|
||||||
|
EqualConstraint ec = new EqualConstraint(eName, name);
|
||||||
|
eqCons.add(ec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param allCons
|
||||||
|
* @param methodTPHS
|
||||||
|
* @param list
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static NameReplacementResult modifyNames(List<TPHConstraint> allCons, List<String> methodTPHS,
|
||||||
|
ConstraintsWithSameLeftSide list) {
|
||||||
|
// generate a new name and replace the right hand side for each constraint
|
||||||
|
// in list with the new name
|
||||||
|
NameReplacer replacer = new NameReplacer(list.getConstraints(), allCons, methodTPHS);
|
||||||
|
// new name -> [all old names]
|
||||||
|
NameReplacementResult replRes = replacer.replaceNames();
|
||||||
|
return replRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NameReplacementResult modifyNames(List<TPHConstraint> allCons, ConstraintsWithSameLeftSide list, List<MethodAndTPH> methodAndTPHs, List<String> tphsClass) {
|
||||||
|
// generate a new name and replace the right hand side for each constraint
|
||||||
|
// in list with the new name
|
||||||
|
NameReplacer replacer = new NameReplacer(list.getConstraints(), allCons, methodAndTPHs, tphsClass);
|
||||||
|
// new name -> [all old names]
|
||||||
|
NameReplacementResult replRes = replacer.replaceNames();
|
||||||
|
return replRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateEqualCons(NameReplacementResult nameReplacementResult, List<TPHConstraint> eqCons) {
|
||||||
|
List<String> oldNames = nameReplacementResult.getOldNames();
|
||||||
|
String newName = nameReplacementResult.getName();
|
||||||
|
for (TPHConstraint c : eqCons) {
|
||||||
|
// if(oldNames.contains(c.getLeft()))
|
||||||
|
// c.setLeft(newName);
|
||||||
|
if (oldNames.contains(c.getRight()))
|
||||||
|
c.setRight(newName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void modifyRelationForConstraintsInCycle(List<Cycle> cycles) {
|
||||||
|
cycles.stream().map(lc->lc.getConstraints()).flatMap(e->e.stream()).forEach(c->c.setRel(Relation.EQUAL));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<NameReplacementResult> substituteTPHSFormCycle(List<TPHConstraint> allCons, List<Cycle> cycles, TPHExtractor tphExtractor) {
|
||||||
|
List<NameReplacementResult> results = new ArrayList<>();
|
||||||
|
cycles.forEach(lc->{
|
||||||
|
Set<String> names = getNamesFromCycle(lc);
|
||||||
|
String newName = names.stream().findFirst().get();
|
||||||
|
|
||||||
|
List<String> equalNames = new ArrayList<>(names);
|
||||||
|
|
||||||
|
Stream<ArrayList<String>> tphsOfMethods = tphExtractor.ListOfMethodsAndTph.stream().map(m->m.getTphs());
|
||||||
|
Stream<ArrayList<String>> localTphsOfMethods = tphExtractor.ListOfMethodsAndTph.stream().map(m->m.getLocalTphs());
|
||||||
|
|
||||||
|
replaceOldNames(newName, equalNames, tphsOfMethods);
|
||||||
|
replaceOldNames(newName, equalNames, localTphsOfMethods);
|
||||||
|
|
||||||
|
NameReplacementResult res = new NameReplacementResult(newName, equalNames);
|
||||||
|
results.add(res);
|
||||||
|
substituteAll(allCons,names,newName);
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param newName
|
||||||
|
* @param names
|
||||||
|
* @param tphsOfMethods
|
||||||
|
*/
|
||||||
|
public static void replaceOldNames(final String newName, final List<String> names, Stream<ArrayList<String>> tphsOfMethods) {
|
||||||
|
tphsOfMethods.forEach(tphsMethod->{
|
||||||
|
if(tphsMethod.removeAll(names))
|
||||||
|
tphsMethod.add(newName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void substituteAll(List<TPHConstraint> allCons, Set<String> names, String newName) {
|
||||||
|
allCons.stream()
|
||||||
|
.filter(c-> c.getRel()==Relation.EXTENDS)
|
||||||
|
.forEach(c->{
|
||||||
|
if(names.contains(c.getLeft())) {
|
||||||
|
c.setLeft(newName);
|
||||||
|
} else if(names.contains(c.getRight())) {
|
||||||
|
c.setRight(newName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> getNamesFromCycle(Cycle lc) {
|
||||||
|
Set<String> names = new HashSet<>();
|
||||||
|
lc.getConstraints().forEach(c->names.add(c.getLeft()));
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createResults(List<GenericsGeneratorResult> genericsGeneratorResults,
|
||||||
|
List<NameReplacementResult> nameReplacementResults) {
|
||||||
|
nameReplacementResults.forEach(n->{
|
||||||
|
Set<String> equals = new HashSet<>(n.getOldNames());
|
||||||
|
TPHConstraint cons = new ExtendsConstraint(n.getName(), Type.getInternalName(Object.class));
|
||||||
|
GenericsGeneratorResult ggRes = new GenericsGeneratorResult(cons, equals);
|
||||||
|
genericsGeneratorResults.add(ggRes);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeEqualConstraints(List<TPHConstraint> allCons) {
|
||||||
|
List<TPHConstraint> equalConstraints = getEqualConstraints(allCons);
|
||||||
|
allCons.removeAll(equalConstraints);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<TPHConstraint> getEqualConstraints(List<TPHConstraint> allCons) {
|
||||||
|
return allCons.stream().filter(c->c.getRel()==Relation.EQUAL).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<NameReplacementResult> createNameReplacementResultsFromEqualConstraints(
|
||||||
|
List<TPHConstraint> equalCons) {
|
||||||
|
List<NameReplacementResult> nameReplacementResults = new ArrayList<>();
|
||||||
|
equalCons.forEach(c->{
|
||||||
|
if(isInNameReplacementResults(nameReplacementResults,c.getRight())) {
|
||||||
|
getNameReplacementByName(nameReplacementResults,c.getRight()).getOldNames().add(c.getLeft());
|
||||||
|
} else {
|
||||||
|
List<String> oldNames = new ArrayList<>();
|
||||||
|
oldNames.add(c.getLeft());
|
||||||
|
NameReplacementResult nrRes = new NameReplacementResult(c.getRight(), oldNames);
|
||||||
|
nameReplacementResults.add(nrRes);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return nameReplacementResults;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NameReplacementResult getNameReplacementByName(List<NameReplacementResult> nameReplacementResults,
|
||||||
|
String name) {
|
||||||
|
return nameReplacementResults.stream().filter(n->n.getName().equals(name)).findFirst().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isInNameReplacementResults(List<NameReplacementResult> nameReplacementResults,String name){
|
||||||
|
if(nameReplacementResults.isEmpty())
|
||||||
|
return false;
|
||||||
|
return nameReplacementResults.stream().map(r->r.getName()).filter(n->name.equals(n)).findFirst().isPresent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<TPHConstraint> getConstraintByLeftSide(List<TPHConstraint> allCons, String tph) {
|
||||||
|
return allCons.stream().filter(c->c.getLeft().equals(tph)).findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<TPHConstraint> getConstraintByRightSide(List<TPHConstraint> allCons, String tph) {
|
||||||
|
return allCons.stream().filter(c->c.getRight().equals(tph)).findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isTPHInGenericGeneratorResult(final List<GenericsGeneratorResult> constraints, final String tph) {
|
||||||
|
return constraints.stream().filter(g->g.getConstraint().getLeft().equals(tph)).findFirst().isPresent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param allCons
|
||||||
|
* @param tphsMethod
|
||||||
|
* @param tphsClass
|
||||||
|
* @param visitedTPHs
|
||||||
|
* @param tph
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static LinkedList<String> createLinkedListForTPHsInRelation(final List<TPHConstraint> allCons,
|
||||||
|
List<String> tphsMethod, List<String> tphsClass, final Set<String> visitedTPHs, String tph) {
|
||||||
|
|
||||||
|
final LinkedList<String> tphsInRel = new LinkedList<>();
|
||||||
|
List<String> tphsList = new ArrayList<>(tphsMethod);
|
||||||
|
tphsList.addAll(tphsClass);
|
||||||
|
|
||||||
|
boolean isNextSuperTypeFound = findNextSuperTyp(allCons,tphsList ,visitedTPHs, tph, tphsInRel);
|
||||||
|
if(!isNextSuperTypeFound)
|
||||||
|
findNextSubType(allCons, tphsList,visitedTPHs, tph, tphsInRel);
|
||||||
|
return tphsInRel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean findNextSubType(List<TPHConstraint> allCons, List<String> tphsList, Set<String> visitedTPHs, String tph,
|
||||||
|
LinkedList<String> tphsInRel) {
|
||||||
|
Optional<TPHConstraint> con = getConstraintByRightSide(allCons, tph);
|
||||||
|
while (con.isPresent()) {
|
||||||
|
String left = con.get().getLeft();
|
||||||
|
String right = con.get().getRight();
|
||||||
|
|
||||||
|
addTPHsToListFromLeft(tphsInRel, left, right);
|
||||||
|
markAsVisited(visitedTPHs, left);
|
||||||
|
|
||||||
|
if(tphsList.contains(left))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
con = getConstraintByRightSide(allCons, left);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addTPHsToListFromLeft(LinkedList<String> tphsInRel, String left, String right) {
|
||||||
|
if (tphsInRel.isEmpty())
|
||||||
|
tphsInRel.add(right);
|
||||||
|
|
||||||
|
tphsInRel.addFirst(left);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param allCons
|
||||||
|
* @param tphsList
|
||||||
|
* @param visitedTPHs
|
||||||
|
* @param tph
|
||||||
|
* @param tphsInRel
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean findNextSuperTyp(final List<TPHConstraint> allCons, List<String> tphsList, final Set<String> visitedTPHs, String tph,
|
||||||
|
final LinkedList<String> tphsInRel) {
|
||||||
|
Optional<TPHConstraint> con = getConstraintByLeftSide(allCons, tph);
|
||||||
|
|
||||||
|
markAsVisited(visitedTPHs, tph);
|
||||||
|
|
||||||
|
while (con.isPresent()) {
|
||||||
|
String left = con.get().getLeft();
|
||||||
|
String right = con.get().getRight();
|
||||||
|
addTPHsToList(tphsInRel, left, right);
|
||||||
|
|
||||||
|
if(tphsList.contains(right))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
markAsVisited(visitedTPHs, right);
|
||||||
|
|
||||||
|
con = getConstraintByLeftSide(allCons, right);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void markAsVisited(Set<String> visitedTPHs, String left) {
|
||||||
|
visitedTPHs.add(left);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param visitedTPHs
|
||||||
|
* @param right
|
||||||
|
* @param left
|
||||||
|
*/
|
||||||
|
public static void markAsVisited(final Set<String> visitedTPHs, String left, String right) {
|
||||||
|
visitedTPHs.add(left);
|
||||||
|
visitedTPHs.add(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tphsInRel
|
||||||
|
* @param right
|
||||||
|
* @param left
|
||||||
|
*/
|
||||||
|
public static void addTPHsToList(final LinkedList<String> tphsInRel, String left, String right) {
|
||||||
|
if (tphsInRel.isEmpty())
|
||||||
|
tphsInRel.add(left);
|
||||||
|
tphsInRel.add(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeNotLocalTphs(final LinkedList<String> tphsInRel, final List<String> localTphs,
|
||||||
|
List<String> tphsClass) {
|
||||||
|
|
||||||
|
while (!localTphs.contains(tphsInRel.peek())) {
|
||||||
|
tphsInRel.removeFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
String last = tphsInRel.peekLast();
|
||||||
|
while (!localTphs.contains(last) && !tphsClass.contains(last)) {
|
||||||
|
tphsInRel.removeLast();
|
||||||
|
last = tphsInRel.peekLast();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param nameReplacementResults
|
||||||
|
* @param subType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Set<String> createEqualSet(final List<NameReplacementResult> nameReplacementResults, String subType) {
|
||||||
|
Optional<NameReplacementResult> equals = nameReplacementResults.stream()
|
||||||
|
.filter(n -> n.getName().equals(subType)).findFirst();
|
||||||
|
|
||||||
|
Set<String> equalSet = equals.isPresent() ? new HashSet<>(equals.get().getOldNames()) : new HashSet<>();
|
||||||
|
return equalSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getNextClassTph(List<String> tphsClass, LinkedList<String> tphsInRel) {
|
||||||
|
|
||||||
|
for(int i = 1;i<tphsInRel.size();++i) {
|
||||||
|
String next = tphsInRel.get(i);
|
||||||
|
if(tphsClass.contains(next))
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tphsInRel.getLast();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addTPHsToClassTPHs(final List<GenericsGeneratorResult> constraints, final List<String> tphsClass) {
|
||||||
|
|
||||||
|
List<String> lefts = constraints.stream().map(r->r.getConstraint()).map(c->c.getLeft()).collect(Collectors.toList());
|
||||||
|
List<String> rights = constraints.stream().map(r->r.getConstraint()).map(c->c.getRight()).collect(Collectors.toList());
|
||||||
|
List<String> leftsAndRights = new ArrayList<>(lefts);
|
||||||
|
leftsAndRights.addAll(rights);
|
||||||
|
List<String> shouldBeClassTphs = leftsAndRights.stream().distinct().collect(Collectors.toList());
|
||||||
|
|
||||||
|
for(String tph : shouldBeClassTphs) {
|
||||||
|
if(!tphsClass.contains(tph))
|
||||||
|
tphsClass.add(tph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeClassTPHsFromMethodTPHs(List<String> tphsClass, TPHExtractor tphExtractor) {
|
||||||
|
|
||||||
|
tphExtractor.ListOfMethodsAndTph.stream().map(m->m.getTphs()).forEach(tphs->{
|
||||||
|
tphs.removeAll(tphsClass);
|
||||||
|
});
|
||||||
|
|
||||||
|
tphExtractor.ListOfMethodsAndTph.stream().map(m->m.getLocalTphs()).forEach(tphs->{
|
||||||
|
tphs.removeAll(tphsClass);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LinkedList<String> createLinkedListForTPHsInRelationClass(List<TPHConstraint> allCons,
|
||||||
|
List<String> tphsClass, List<String> methodTPHs, Set<String> visitedTPHs, String tph) {
|
||||||
|
final LinkedList<String> tphsInRel = new LinkedList<>();
|
||||||
|
|
||||||
|
boolean isNextSuperTypeFound = findNextSuperTyp(allCons,tphsClass ,visitedTPHs, tph, tphsInRel);
|
||||||
|
if(!tphsInRel.isEmpty() && !isNextSuperTypeFound && !methodTPHs.contains(tphsInRel.getLast()))
|
||||||
|
findNextSubType(allCons, tphsClass,visitedTPHs, tph, tphsInRel);
|
||||||
|
return tphsInRel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isInResult(String first, List<GenericsGeneratorResult> constraints) {
|
||||||
|
return constraints.stream().map(r->r.getConstraint()).filter(c->c.getLeft().equals(first)).findFirst().isPresent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<GenericsGeneratorResult> getGenericGeneratorResult(List<GenericsGeneratorResult> list,
|
||||||
|
String tph) {
|
||||||
|
return list.stream().filter(g->g.getConstraint().getLeft().equals(tph)).findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeGenericGeneratorResult(List<GenericsGeneratorResult> genericsGenResults,
|
||||||
|
GenericsGeneratorResult ggResult) {
|
||||||
|
genericsGenResults.remove(ggResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<MethodAndTPH> getMethodAndTphs(ArrayList<MethodAndTPH> listOfMethodsAndTph, String id) {
|
||||||
|
return listOfMethodsAndTph.stream().filter(m->m.getId().equals(id)).findFirst();
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,35 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
|
||||||
|
public class ConstraintsWithSameLeftSide {
|
||||||
|
private List<TPHConstraint> constraints;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param constraints
|
||||||
|
*/
|
||||||
|
public ConstraintsWithSameLeftSide(List<TPHConstraint> constraints) {
|
||||||
|
this.constraints = constraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the constraints
|
||||||
|
*/
|
||||||
|
public List<TPHConstraint> getConstraints() {
|
||||||
|
return constraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param constraints the constraints to set
|
||||||
|
*/
|
||||||
|
public void setConstraints(List<TPHConstraint> constraints) {
|
||||||
|
this.constraints = constraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "[" + constraints.toString() + "]";
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Cycle {
|
||||||
|
private final List<TPHConstraint> constraints;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param constraints
|
||||||
|
*/
|
||||||
|
public Cycle(List<TPHConstraint> constraints) {
|
||||||
|
this.constraints = constraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the constraints
|
||||||
|
*/
|
||||||
|
public List<TPHConstraint> getConstraints() {
|
||||||
|
return constraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containConstraint(TPHConstraint constraint) {
|
||||||
|
for(TPHConstraint c : constraints) {
|
||||||
|
if(c.equalConstraint(constraint))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
constraints.forEach(c->sb.append(c.getLeft()+" -> "));
|
||||||
|
sb.append(constraints.get(constraints.size()-1).getRight());
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,33 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericGeneratorResultsForAllMethods {
|
||||||
|
private final List<MethodAndConstraints> methodsAndConstraints;
|
||||||
|
|
||||||
|
public GenericGeneratorResultsForAllMethods() {
|
||||||
|
this(Collections.emptyList());
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param methodsAndConstraints
|
||||||
|
*/
|
||||||
|
public GenericGeneratorResultsForAllMethods(List<MethodAndConstraints> methodsAndConstraints) {
|
||||||
|
this.methodsAndConstraints = methodsAndConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the methodsAndConstraints
|
||||||
|
*/
|
||||||
|
public List<MethodAndConstraints> getMethodsAndConstraints() {
|
||||||
|
return methodsAndConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,53 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The simplify results of a source file (package)
|
||||||
|
*
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericGenratorResultForSourceFile {
|
||||||
|
private String pkgName;
|
||||||
|
private final List<GenericsGeneratorResultForClass> genericGeneratorResultForAllClasses = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param pkgName
|
||||||
|
*/
|
||||||
|
public GenericGenratorResultForSourceFile(String pkgName) {
|
||||||
|
this.pkgName = pkgName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<GenericsGeneratorResultForClass> getGenericGeneratorResultForAllClasses() {
|
||||||
|
return genericGeneratorResultForAllClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends the simplify results of a class to simplifyResForSF
|
||||||
|
*
|
||||||
|
* @param sResClass simplify results of a class to added
|
||||||
|
*/
|
||||||
|
public void addGenericGeneratorResultClass(GenericsGeneratorResultForClass sResClass) {
|
||||||
|
genericGeneratorResultForAllClasses.add(sResClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenericsGeneratorResultForClass getSimplifyResultsByName(JavaClassName name) {
|
||||||
|
|
||||||
|
if (this.pkgName.equals(name.getPackageName())) {
|
||||||
|
return genericGeneratorResultForAllClasses.stream()
|
||||||
|
.filter(sr -> sr.getClassName().equals(name))
|
||||||
|
.findAny()
|
||||||
|
.orElseThrow(() -> new NoSuchElementException(
|
||||||
|
"Simplify results for the class " + pkgName + "." + name + " are not found"));
|
||||||
|
}
|
||||||
|
throw new NoSuchElementException("Simplify results for the class " + pkgName + "." + name + " are not found");
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,55 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericsGeneratorResult {
|
||||||
|
private TPHConstraint constraint;
|
||||||
|
/**
|
||||||
|
* contains the names of all type placeholders which are equals to the left side of
|
||||||
|
* the constraint {@link #constraint}.
|
||||||
|
*/
|
||||||
|
private Set<String> equalsTPHs;
|
||||||
|
/**
|
||||||
|
* @param constraint
|
||||||
|
* @param equalsTPHs
|
||||||
|
*/
|
||||||
|
public GenericsGeneratorResult(TPHConstraint constraint, Set<String> equalsTPHs) {
|
||||||
|
this.constraint = constraint;
|
||||||
|
this.equalsTPHs = equalsTPHs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the constraint
|
||||||
|
*/
|
||||||
|
public TPHConstraint getConstraint() {
|
||||||
|
return constraint;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param constraint the constraint to set
|
||||||
|
*/
|
||||||
|
public void setConstraint(TPHConstraint constraint) {
|
||||||
|
this.constraint = constraint;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the equalsTPHs
|
||||||
|
*/
|
||||||
|
public Set<String> getEqualsTPHs() {
|
||||||
|
return equalsTPHs;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param equalsTPHs the equalsTPHs to set
|
||||||
|
*/
|
||||||
|
public void setEqualsTPHs(Set<String> equalsTPHs) {
|
||||||
|
this.equalsTPHs = equalsTPHs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericsGeneratorResultForClass {
|
||||||
|
private final JavaClassName className;
|
||||||
|
private final List<GenericsGeneratorResult> classConstraints;
|
||||||
|
private final GenericGeneratorResultsForAllMethods methodsAndTheirConstraints;
|
||||||
|
|
||||||
|
public GenericsGeneratorResultForClass(JavaClassName className) {
|
||||||
|
this(className, Collections.emptyList(), new GenericGeneratorResultsForAllMethods());
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param className
|
||||||
|
* @param classConstraints
|
||||||
|
* @param methodsAndTheirConstraints
|
||||||
|
*/
|
||||||
|
public GenericsGeneratorResultForClass(JavaClassName className, List<GenericsGeneratorResult> classConstraints,
|
||||||
|
GenericGeneratorResultsForAllMethods methodsAndTheirConstraints) {
|
||||||
|
this.className = className;
|
||||||
|
this.classConstraints = classConstraints;
|
||||||
|
this.methodsAndTheirConstraints = methodsAndTheirConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the className
|
||||||
|
*/
|
||||||
|
public JavaClassName getClassName() {
|
||||||
|
return className;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the classConstraints
|
||||||
|
*/
|
||||||
|
public List<GenericsGeneratorResult> getClassConstraints() {
|
||||||
|
return classConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the methodsAndTheirConstraints
|
||||||
|
*/
|
||||||
|
public GenericGeneratorResultsForAllMethods getMethodsAndTheirConstraints() {
|
||||||
|
return methodsAndTheirConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(String id) {
|
||||||
|
return methodsAndTheirConstraints.getMethodsAndConstraints().stream().map(mc -> mc.getMethodID())
|
||||||
|
.anyMatch(i -> i.equals(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<GenericsGeneratorResult> getMethodConstraintsByID(String id) {
|
||||||
|
return methodsAndTheirConstraints.getMethodsAndConstraints().stream().filter(mc -> mc.getMethodID().equals(id))
|
||||||
|
.findFirst().get().getConstraints();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,36 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class MethodAndConstraints {
|
||||||
|
private final String methodID;
|
||||||
|
private final List<GenericsGeneratorResult> constraints;
|
||||||
|
/**
|
||||||
|
* @param methodID
|
||||||
|
* @param constraints
|
||||||
|
*/
|
||||||
|
public MethodAndConstraints(String methodID, List<GenericsGeneratorResult> constraints) {
|
||||||
|
this.methodID = methodID;
|
||||||
|
this.constraints = constraints;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the methodID
|
||||||
|
*/
|
||||||
|
public String getMethodID() {
|
||||||
|
return methodID;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the constraints
|
||||||
|
*/
|
||||||
|
public List<GenericsGeneratorResult> getConstraints() {
|
||||||
|
return constraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.genericsGeneratorTypes;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class NameReplacementResult {
|
||||||
|
private String name;
|
||||||
|
private List<String> oldNames;
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
* @param oldNames
|
||||||
|
*/
|
||||||
|
public NameReplacementResult(String name, List<String> oldNames) {
|
||||||
|
this.name = name;
|
||||||
|
this.oldNames = oldNames;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the name
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param name the name to set
|
||||||
|
*/
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the oldNames
|
||||||
|
*/
|
||||||
|
public List<String> getOldNames() {
|
||||||
|
return oldNames;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param oldNames the oldNames to set
|
||||||
|
*/
|
||||||
|
public void setOldNames(List<String> oldNames) {
|
||||||
|
this.oldNames = oldNames;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@@ -1,319 +1,213 @@
|
|||||||
package de.dhbwstuttgart.bytecode.signature;
|
package de.dhbwstuttgart.bytecode.signature;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import org.objectweb.asm.Type;
|
import org.objectweb.asm.Type;
|
||||||
import org.objectweb.asm.signature.SignatureVisitor;
|
import org.objectweb.asm.signature.SignatureVisitor;
|
||||||
import org.objectweb.asm.signature.SignatureWriter;
|
import org.objectweb.asm.signature.SignatureWriter;
|
||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.constraint.ExtendsConstraint;
|
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
|
||||||
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.Simplify;
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResult;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
import de.dhbwstuttgart.syntaxtree.Constructor;
|
import de.dhbwstuttgart.syntaxtree.Constructor;
|
||||||
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
||||||
import de.dhbwstuttgart.syntaxtree.Method;
|
import de.dhbwstuttgart.syntaxtree.Method;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.WildcardType;
|
|
||||||
import de.dhbwstuttgart.typeinference.result.GenericInsertPair;
|
|
||||||
import de.dhbwstuttgart.typeinference.result.ResolvedType;
|
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
public class Signature {
|
public class Signature {
|
||||||
|
private static final char SUPER_CHAR = '-';
|
||||||
|
private static final char EXTENDS_CHAR = '+';
|
||||||
|
private static final String SPECIAL_CHAR_FOR_FUN = "$$";
|
||||||
|
private static final String SPECIAL_CHAR = "$";
|
||||||
private ClassOrInterface classOrInterface;
|
private ClassOrInterface classOrInterface;
|
||||||
private HashMap<String, String> genericsAndBounds;
|
private HashMap<String, String> genericsAndBounds;
|
||||||
private HashMap<String, String> genericsAndBoundsMethod;
|
private HashMap<String, String> genericsAndBoundsMethod;
|
||||||
private SignatureWriter sw;
|
private final SignatureWriter sw = new SignatureWriter();;
|
||||||
private Constructor constructor;
|
private Constructor constructor;
|
||||||
private Method method;
|
private Method method;
|
||||||
private HashMap<String,RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes;
|
private HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes;
|
||||||
private ResultSet resultSet;
|
private ResultSet resultSet;
|
||||||
private ArrayList<GenericInsertPair> commonPairs;
|
private Map<TPHConstraint, Set<String>> methodConstraints;
|
||||||
private HashMap<TPHConstraint,HashSet<String>> methodConstraints;
|
private List<GenericsGeneratorResult> consClass;
|
||||||
private ArrayList<String> tphsClass;
|
private List<GenericsGeneratorResult> constraints;
|
||||||
private ArrayList<TPHConstraint> consClass;
|
|
||||||
|
|
||||||
public Signature(ClassOrInterface classOrInterface, HashMap<String, String> genericsAndBounds,
|
// public Signature(ClassOrInterface classOrInterface, HashMap<String, String> genericsAndBounds,
|
||||||
ArrayList<GenericInsertPair> commonPairs, ArrayList<String> tphsClass, ArrayList<TPHConstraint> consClass) {
|
// List<TPHConstraint> consClass) {
|
||||||
this.classOrInterface = classOrInterface;
|
// this.classOrInterface = classOrInterface;
|
||||||
this.genericsAndBounds = genericsAndBounds;
|
// this.genericsAndBounds = genericsAndBounds;
|
||||||
this.commonPairs = commonPairs;
|
// this.consClass = consClass;
|
||||||
this.tphsClass = tphsClass;
|
// sw = new SignatureWriter();
|
||||||
this.consClass = consClass;
|
// createSignatureForClassOrInterface();
|
||||||
sw = new SignatureWriter();
|
// }
|
||||||
createSignatureForClassOrInterface();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Signature(Constructor constructor, HashMap<String, String> genericsAndBounds,
|
public Signature(HashMap<String, String> genericsAndBounds,
|
||||||
HashMap<String,RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes,ResultSet resultSet,
|
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes, ResultSet resultSet,
|
||||||
HashMap<TPHConstraint,HashSet<String>> methodConstraints) {
|
List<GenericsGeneratorResult> constraints) {
|
||||||
this.constructor = constructor;
|
//this.constructor = constructor;
|
||||||
this.genericsAndBounds = genericsAndBounds;
|
this.genericsAndBounds = genericsAndBounds;
|
||||||
this.methodParamsAndTypes = methodParamsAndTypes;
|
this.methodParamsAndTypes = methodParamsAndTypes;
|
||||||
this.resultSet = resultSet;
|
this.resultSet = resultSet;
|
||||||
this.methodConstraints = methodConstraints;
|
this.constraints = constraints;
|
||||||
sw = new SignatureWriter();
|
|
||||||
createSignatureForConsOrMethod(this.constructor,true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Signature(Method method, HashMap<String, String> genericsAndBoundsMethod,HashMap<String, String> genericsAndBounds,
|
public Signature(int numberOfParams) {
|
||||||
|
createSignatureForFunN(numberOfParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Signature(int numberOfParams, String to, String[] paramTypes) {
|
||||||
|
createSignatureForFunN(numberOfParams, to, paramTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Signature(ClassOrInterface classOrInterface, HashMap<String, String> genericsAndBounds,
|
||||||
|
List<GenericsGeneratorResult> consClass) {
|
||||||
|
this.classOrInterface = classOrInterface;
|
||||||
|
this.genericsAndBounds = genericsAndBounds;
|
||||||
|
this.consClass = consClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Signature(HashMap<String, String> genericsAndBoundsMethod,
|
||||||
|
HashMap<String, String> genericsAndBounds,
|
||||||
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes, ResultSet resultSet,
|
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> methodParamsAndTypes, ResultSet resultSet,
|
||||||
HashMap<TPHConstraint,HashSet<String>> methodConstraints) {
|
List<GenericsGeneratorResult> constraints,List<GenericsGeneratorResult> consClass) {
|
||||||
this.method = method;
|
|
||||||
this.genericsAndBoundsMethod = genericsAndBoundsMethod;
|
this.genericsAndBoundsMethod = genericsAndBoundsMethod;
|
||||||
this.genericsAndBounds = genericsAndBounds;
|
this.genericsAndBounds = genericsAndBounds;
|
||||||
this.methodParamsAndTypes = methodParamsAndTypes;
|
this.methodParamsAndTypes = methodParamsAndTypes;
|
||||||
this.resultSet = resultSet;
|
this.resultSet = resultSet;
|
||||||
this.methodConstraints = methodConstraints;
|
this.constraints = constraints;
|
||||||
sw = new SignatureWriter();
|
this.consClass = consClass;
|
||||||
createSignatureForConsOrMethod(this.method,false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Signature(int numberOfParams) {
|
public String createSignatureForConstructor(Constructor constructor) {
|
||||||
sw = new SignatureWriter();
|
visitParams();
|
||||||
createSignatureForFunN(numberOfParams);
|
sw.visitReturnType().visitBaseType('V');
|
||||||
|
return sw.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String createSignatureForMethod(Method method) {
|
||||||
|
defineGenerics(method);
|
||||||
|
|
||||||
|
String ret = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToSignature());
|
||||||
|
|
||||||
|
visitParams();
|
||||||
|
visitReturnType(method, ret);
|
||||||
|
return sw.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param method
|
||||||
|
* @param ret
|
||||||
|
*/
|
||||||
|
private void visitReturnType(Method method, String ret) {
|
||||||
|
if (ret.equals("V")) {
|
||||||
|
sw.visitReturnType().visitBaseType('V');
|
||||||
|
} else {
|
||||||
|
RefTypeOrTPHOrWildcardOrGeneric returnType = method.getReturnType();
|
||||||
|
SignatureVisitor sv = sw.visitReturnType();
|
||||||
|
doVisitParamsOrReturn(returnType, sv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void visitParams() {
|
||||||
|
for (String paramName : methodParamsAndTypes.keySet()) {
|
||||||
|
RefTypeOrTPHOrWildcardOrGeneric t = methodParamsAndTypes.get(paramName);
|
||||||
|
SignatureVisitor sv = sw.visitParameterType();
|
||||||
|
doVisitParamsOrReturn(t, sv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param method
|
||||||
|
*/
|
||||||
|
private void defineGenerics(Method method) {
|
||||||
|
method.getGenerics().forEach(g -> {
|
||||||
|
visitTypeVarsAndTheirBounds(g, genericsAndBoundsMethod);
|
||||||
|
});
|
||||||
|
defineGenericsFromConstraints(constraints,genericsAndBoundsMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSignatureForFunN(int numberOfParams, String to, String[] paramTypes) {
|
||||||
|
defineTypeVariablesForParametersOfFunN(numberOfParams);
|
||||||
|
|
||||||
|
sw.visitFormalTypeParameter("R");
|
||||||
|
visitClassBound(to);
|
||||||
|
// TODO: prüfe ob Return-Type = void,
|
||||||
|
sw.visitSuperclass().visitClassType(Type.getInternalName(Object.class));
|
||||||
|
sw.visitEnd();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createSignatureForFunN(int numberOfParams) {
|
private void createSignatureForFunN(int numberOfParams) {
|
||||||
|
|
||||||
// sw.visitClassBound().visitEnd();
|
defineTypeVariablesForParametersOfFunN(numberOfParams);
|
||||||
for(int i = 0;i<numberOfParams;i++) {
|
|
||||||
int j = i+1;
|
|
||||||
sw.visitFormalTypeParameter("T"+ j);
|
|
||||||
// getBounds von Params
|
|
||||||
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
|
||||||
sw.visitClassBound().visitEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
sw.visitFormalTypeParameter("R");
|
sw.visitFormalTypeParameter("R");
|
||||||
// getBounds vom Return-Type
|
// getBounds vom Return-Type
|
||||||
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
||||||
sw.visitClassBound().visitEnd();
|
sw.visitClassBound().visitEnd();
|
||||||
// TODO: prüfe ob Return-Type = void,
|
// TODO: prüfe ob Return-Type = void,
|
||||||
sw.visitSuperclass().visitClassType(Type.getInternalName(Object.class));;
|
sw.visitSuperclass().visitClassType(Type.getInternalName(Object.class));
|
||||||
sw.visitEnd();
|
sw.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private void defineTypeVariablesForParametersOfFunN(int numberOfParams) {
|
||||||
* Creates signature for a method or constructor with @see {@link SignatureWriter}
|
for (int i = 0; i < numberOfParams; i++) {
|
||||||
* Signature looks like:
|
int j = i + 1;
|
||||||
* <typevaliables (K:Ljava/lang/Object "Bounds")>(params L.. OR T.. Or basistape)ReturnType
|
sw.visitFormalTypeParameter("T" + j);
|
||||||
*
|
// getBounds von Params
|
||||||
* @param method method or constructor
|
|
||||||
* @param isConstructor true if constructor
|
|
||||||
*/
|
|
||||||
private void createSignatureForConsOrMethod(Method method, boolean isConstructor) {
|
|
||||||
Iterator<? extends GenericTypeVar> itr = method.getGenerics().iterator();
|
|
||||||
// visits all formal type parameter and visits their bounds <T:...;B:...;...>
|
|
||||||
while(itr.hasNext()) {
|
|
||||||
System.out.println("HAS GENERICS!!");
|
|
||||||
GenericTypeVar g = itr.next();
|
|
||||||
getBoundsOfTypeVar(g,genericsAndBoundsMethod);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wenn die RückgabeType eine TPH ist, wird als generic behandelt
|
|
||||||
// z.B: Type = TPH K => wird eine Formal Type Parameter K$ erzeugt und Bound = Object
|
|
||||||
if(!isConstructor) {
|
|
||||||
String ret = resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToSignature());
|
|
||||||
ArrayList<TPHConstraint> allConsBeforeSimplify = new ArrayList<>();
|
|
||||||
|
|
||||||
HashMap<TPHConstraint,HashSet<String>> allConstraints = new HashMap<>();
|
|
||||||
|
|
||||||
if(ret.contains("<")) {
|
|
||||||
allConsBeforeSimplify = getAllConstraints((RefType) resultSet.resolveType(method.getReturnType()).resolvedType);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(String paramName : methodParamsAndTypes.keySet()) {
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric t = methodParamsAndTypes.get(paramName);
|
|
||||||
String pT = t.acceptTV(new TypeToSignature());
|
|
||||||
|
|
||||||
if(pT.contains("<"))
|
|
||||||
allConsBeforeSimplify = getAllConstraints((RefType) t);
|
|
||||||
}
|
|
||||||
boolean doSimplify = false;
|
|
||||||
if(!allConsBeforeSimplify.isEmpty()) {
|
|
||||||
addConstraintsToMap(allConstraints,allConsBeforeSimplify);
|
|
||||||
doSimplify = true;
|
|
||||||
}
|
|
||||||
createTypeVars(allConstraints, doSimplify);
|
|
||||||
|
|
||||||
if(!ret.equals("V")) {
|
|
||||||
if(ret.contains("$") && !ret.contains("$$") && !ret.contains("<")) {
|
|
||||||
if(genericsAndBounds.containsKey(ret)) {
|
|
||||||
genericsAndBoundsMethod.put(ret.substring(1), genericsAndBounds.get(ret.substring(1)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// visit each method-parameter to create the signature
|
|
||||||
for(String paramName : methodParamsAndTypes.keySet()) {
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric t = methodParamsAndTypes.get(paramName);
|
|
||||||
// parameter type deswegen ist true
|
|
||||||
doVisitParamsOrReturn(t,true);
|
|
||||||
}
|
|
||||||
if(isConstructor ||
|
|
||||||
resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToSignature()).equals("V")) {
|
|
||||||
sw.visitReturnType().visitBaseType('V');
|
|
||||||
}else {
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric returnType = method.getReturnType();
|
|
||||||
// return type deswegen ist false
|
|
||||||
doVisitParamsOrReturn(returnType, false);
|
|
||||||
}
|
|
||||||
// sw.visitEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addConstraintsToMap(HashMap<TPHConstraint, HashSet<String>> allConstraints,
|
|
||||||
ArrayList<TPHConstraint> allConsBeforeSimplify) {
|
|
||||||
for(TPHConstraint tphCons : allConsBeforeSimplify) {
|
|
||||||
allConstraints.put(tphCons, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getEqualTPH(HashMap<TPHConstraint, HashSet<String>> methodConstraints, String tph) {
|
|
||||||
for(TPHConstraint cons : methodConstraints.keySet()) {
|
|
||||||
if(methodConstraints.get(cons) != null) {
|
|
||||||
if(methodConstraints.get(cons).contains(tph)) {
|
|
||||||
return cons.getLeft();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tph;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createTypeVars(HashMap<TPHConstraint, HashSet<String>> allConstraints, boolean doSimplify) {
|
|
||||||
allConstraints.putAll(methodConstraints);
|
|
||||||
|
|
||||||
HashMap<TPHConstraint, HashSet<String>> simplifiedConstraints;
|
|
||||||
if(doSimplify) {
|
|
||||||
simplifiedConstraints = Simplify.simplifyContraints(allConstraints);
|
|
||||||
}else {
|
|
||||||
simplifiedConstraints = allConstraints;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(TPHConstraint cons : simplifiedConstraints.keySet()) {
|
|
||||||
// need subst.
|
|
||||||
String sub = cons.getLeft()+"$";
|
|
||||||
if(!genericsAndBoundsMethod.containsKey(sub) && !genericsAndBounds.containsKey(sub)) {
|
|
||||||
sw.visitFormalTypeParameter(sub);
|
|
||||||
String bound = cons.getRight();
|
|
||||||
if(bound.equals(Type.getInternalName(Object.class))) {
|
|
||||||
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
||||||
sw.visitClassBound().visitEnd();
|
sw.visitClassBound().visitEnd();
|
||||||
genericsAndBoundsMethod.put(sub, bound);
|
|
||||||
} else {
|
|
||||||
String boundName = bound+"$";
|
|
||||||
sw.visitClassBound().visitTypeVariable(boundName);
|
|
||||||
genericsAndBoundsMethod.put(sub, boundName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ArrayList<TPHConstraint> getAllConstraints(RefType ref) {
|
|
||||||
final ArrayList<TPHConstraint> res = new ArrayList<>();
|
|
||||||
for(RefTypeOrTPHOrWildcardOrGeneric p : ref.getParaList()) {
|
|
||||||
ResolvedType resType;
|
|
||||||
if(p instanceof WildcardType) {
|
|
||||||
resType = resultSet.resolveType(((WildcardType) p).getInnerType());
|
|
||||||
}else {
|
|
||||||
resType = resultSet.resolveType(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric resolved = resType.resolvedType;
|
|
||||||
if(resolved instanceof TypePlaceholder) {
|
|
||||||
//resType.getAdditionalGenerics().forEach(ag ->{
|
|
||||||
resultSet.genIns.forEach(ag ->{
|
|
||||||
TPHConstraint constr = new ExtendsConstraint(ag.getLeft().getName(), ag.getRight().getName(), Relation.EXTENDS);
|
|
||||||
if(!contains(res,constr)) {
|
|
||||||
res.add(constr);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if(resolved instanceof WildcardType) {
|
|
||||||
WildcardType resWC = (WildcardType) resolved;
|
|
||||||
ResolvedType resType2 = resultSet.resolveType(resWC.getInnerType());
|
|
||||||
if(resType2.resolvedType instanceof TypePlaceholder) {
|
|
||||||
//resType2.getAdditionalGenerics().forEach(ag ->{
|
|
||||||
resultSet.genIns.forEach(ag ->{
|
|
||||||
TPHConstraint constr = new ExtendsConstraint(ag.getLeft().getName(), ag.getRight().getName(), Relation.EXTENDS);
|
|
||||||
if(!contains(res,constr)) {
|
|
||||||
res.add(constr);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
System.out.println("RES GIP === " + res.size());
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
private boolean contains(ArrayList<TPHConstraint> constraints, TPHConstraint constr) {
|
|
||||||
for(int i=0; i<constraints.size();++i) {
|
|
||||||
TPHConstraint p = constraints.get(i);
|
|
||||||
if(constr.getLeft().equals(p.getLeft()) && constr.getRight().equals(p.getRight()))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Visits parameter type or return type with {@link SignatureVisitor} to create
|
* Visits parameter type or return type with {@link SignatureVisitor} to create
|
||||||
* the method signature
|
* the method signature
|
||||||
|
*
|
||||||
* @param t type of parameter or return type
|
* @param t type of parameter or return type
|
||||||
* @param isParameterType true if t is type of parameter
|
* @param sv true if t is type of parameter
|
||||||
*/
|
*/
|
||||||
private void doVisitParamsOrReturn(RefTypeOrTPHOrWildcardOrGeneric t, boolean isParameterType) {
|
private void doVisitParamsOrReturn(RefTypeOrTPHOrWildcardOrGeneric t, SignatureVisitor sv) {
|
||||||
String type = t.acceptTV(new TypeToString());
|
String type = t.acceptTV(new TypeToString());
|
||||||
SignatureVisitor sv;
|
|
||||||
if(isParameterType) {
|
|
||||||
sv = sw.visitParameterType();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sv = sw.visitReturnType();
|
|
||||||
}
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "RT":
|
case "RT":
|
||||||
String sig = t.acceptTV(new TypeToSignature());
|
String sig = t.acceptTV(new TypeToSignature(constraints));
|
||||||
sv.visitClassType(sig.substring(1, sig.length()));
|
sv.visitClassType(sig.substring(1, sig.length()));
|
||||||
break;
|
break;
|
||||||
case "GRT":
|
case "GRT":
|
||||||
GenericRefType g = (GenericRefType) t;
|
GenericRefType g = (GenericRefType) t;
|
||||||
// sv.visitTypeVariable(g.acceptTV(new TypeToSignature()).substring(1));
|
sv.visitTypeVariable(g.acceptTV(new TypeToSignature(constraints)));
|
||||||
sv.visitTypeVariable(g.acceptTV(new TypeToSignature()));
|
|
||||||
break;
|
break;
|
||||||
case "TPH":
|
case "TPH":
|
||||||
RefTypeOrTPHOrWildcardOrGeneric r = resultSet.resolveType(t).resolvedType;
|
RefTypeOrTPHOrWildcardOrGeneric r = resultSet.resolveType(t).resolvedType;
|
||||||
// der Fall wenn die Type eine Interface ist, muss betrachtet werden
|
// der Fall wenn der Typ eine Interface ist, muss betrachtet werden
|
||||||
// Deswegen muss in ResutSet noch enthalten werden, ob die Type eine
|
// Deswegen muss in ResutSet noch enthalten werden, ob die Type eine
|
||||||
// Interface oder eine Klasse ist.
|
// Interface oder eine Klasse ist.
|
||||||
|
|
||||||
// das braucht man nicht es reicht: sv.visitTypeVariable(r.acceptTV(new TypeToSignature())
|
// das braucht man nicht es reicht: sv.visitTypeVariable(r.acceptTV(new
|
||||||
|
// TypeToSignature())
|
||||||
//
|
//
|
||||||
String sig2 = r.acceptTV(new TypeToSignature());
|
String sig2 = r.acceptTV(new TypeToSignature(constraints));
|
||||||
if(r instanceof GenericRefType) {
|
if (r instanceof GenericRefType) {
|
||||||
sv.visitTypeVariable(sig2);
|
sv.visitTypeVariable(sig2);
|
||||||
}else if(!(r instanceof TypePlaceholder)) {
|
} else if (!(r instanceof TypePlaceholder)) {
|
||||||
if(sig2.contains("$$")) {
|
if (sig2.contains(SPECIAL_CHAR_FOR_FUN)) {
|
||||||
System.out.println(" Signature FUN$$: "+r);
|
sv.visitInterface().visitClassType(sig2.substring(1));
|
||||||
sv.visitInterface().visitClassType(sig2.substring(1, sig2.length()));
|
|
||||||
} else {
|
} else {
|
||||||
// Kann zwischen GenericRefType und RefType nicht unterscheiden
|
// Kann zwischen GenericRefType und RefType nicht unterscheiden
|
||||||
// Deswegen wird immer geprüft, ob der Name in Generic Maps liegt
|
// Deswegen wird immer geprüft, ob der Name in Generic Maps liegt
|
||||||
String n = sig2.substring(1, sig2.length()-1);
|
String n = sig2.substring(1, sig2.length() - 1);
|
||||||
// if(genericsAndBoundsMethod.containsKey(n) || genericsAndBounds.containsKey(n)) {
|
// if(genericsAndBoundsMethod.containsKey(n) || genericsAndBounds.containsKey(n)) {
|
||||||
// sv.visitTypeVariable(n);
|
// sv.visitTypeVariable(n);
|
||||||
// } else {
|
// } else {
|
||||||
@@ -324,165 +218,162 @@ public class Signature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
String eqTPH = getEqualTPH(methodConstraints, sig2.substring(1, sig2.length()-1))+"$";
|
String realName = sig2.substring(1, sig2.length() - 1);
|
||||||
System.out.println(r.getClass()+" Signature TPH: "+r.acceptTV(new TypeToSignature()));
|
String toVisit = realName+SPECIAL_CHAR;
|
||||||
sv.visitTypeVariable(eqTPH);
|
if(!genericsAndBounds.containsKey(toVisit)) {
|
||||||
|
Optional<GenericsGeneratorResult> equalTPH = getEqualTPHFromClassConstraints(consClass, realName);
|
||||||
|
if(equalTPH.isPresent()){
|
||||||
|
toVisit = equalTPH.get().getConstraint().getLeft() + SPECIAL_CHAR;
|
||||||
|
} else {
|
||||||
|
toVisit = getEqualTPH(constraints, realName) + SPECIAL_CHAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sv.visitTypeVariable(toVisit);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "SWC":
|
case "SWC":
|
||||||
System.out.println("SWC---Signature");
|
|
||||||
SuperWildcardType swc = (SuperWildcardType) t;
|
SuperWildcardType swc = (SuperWildcardType) t;
|
||||||
String sigInner = swc.getInnerType().acceptTV(new TypeToSignature());
|
String sigInner = swc.getInnerType().acceptTV(new TypeToSignature(constraints));
|
||||||
if(swc.getInnerType() instanceof TypePlaceholder) {
|
int length = sigInner.length();
|
||||||
sv.visitTypeArgument('-').visitTypeVariable(sigInner.substring(1, sigInner.length()));
|
visitWildCard(sv, sigInner, length, swc.getInnerType(), SUPER_CHAR);
|
||||||
} else if(swc.getInnerType() instanceof RefType) {
|
|
||||||
if(sigInner.contains("$$")) {
|
|
||||||
sv.visitTypeArgument('-').visitInterface().visitClassType(sigInner.substring(1,sigInner.length()));
|
|
||||||
}else {
|
|
||||||
sv.visitTypeArgument('-').visitClassType(sigInner.substring(1,sigInner.length()));
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
sv.visitTypeArgument('-').visitTypeVariable(sigInner.substring(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "EWC":
|
case "EWC":
|
||||||
System.out.println("EWC---Signature");
|
|
||||||
ExtendsWildcardType ewc = (ExtendsWildcardType) t;
|
ExtendsWildcardType ewc = (ExtendsWildcardType) t;
|
||||||
String esigInner = ewc.getInnerType().acceptTV(new TypeToSignature());
|
String esigInner = ewc.getInnerType().acceptTV(new TypeToSignature(constraints));
|
||||||
System.out.println(esigInner);
|
int lengthEWCSig = esigInner.length();
|
||||||
if(ewc.getInnerType() instanceof TypePlaceholder) {
|
visitWildCard(sv, esigInner, lengthEWCSig, ewc.getInnerType(), EXTENDS_CHAR);
|
||||||
sv.visitTypeArgument('+').visitTypeVariable(esigInner.substring(1, esigInner.length()));
|
|
||||||
} else if(ewc.getInnerType() instanceof RefType) {
|
|
||||||
if(esigInner.contains("$$")) {
|
|
||||||
sv.visitTypeArgument('+').visitInterface().visitClassType(esigInner.substring(1,esigInner.length()));
|
|
||||||
}else {
|
|
||||||
// sv.visitClassType(esigInner.substring(1,esigInner.length()));
|
|
||||||
sv.visitTypeArgument('+').visitClassType(esigInner.substring(1,esigInner.length()));
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
sv.visitTypeArgument('+').visitTypeVariable(esigInner.substring(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if(!isParameterType)
|
// if (!sv)
|
||||||
sv.visitBaseType('V');
|
// sv.visitBaseType('V');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void visitWildCard(SignatureVisitor sv, String sigInner, int length, RefTypeOrTPHOrWildcardOrGeneric innerType, char superOrExtendsChar) {
|
||||||
|
if (innerType instanceof TypePlaceholder) {
|
||||||
|
sv.visitTypeArgument(superOrExtendsChar).visitTypeVariable(sigInner.substring(1, length));
|
||||||
|
} else if (innerType instanceof RefType) {
|
||||||
|
checkInnerSignatureOfWildCard(sv, sigInner, length, superOrExtendsChar);
|
||||||
|
} else {
|
||||||
|
sv.visitTypeArgument(superOrExtendsChar).visitTypeVariable(sigInner.substring(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkInnerSignatureOfWildCard(SignatureVisitor sv, String sigInner, int length, char superOrExtendsChar) {
|
||||||
|
if (sigInner.contains(SPECIAL_CHAR_FOR_FUN)) {
|
||||||
|
sv.visitTypeArgument(superOrExtendsChar).visitInterface().visitClassType(sigInner.substring(1, length));
|
||||||
|
} else {
|
||||||
|
sv.visitTypeArgument(superOrExtendsChar).visitClassType(sigInner.substring(1, length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<GenericsGeneratorResult> getEqualTPHFromClassConstraints(List<GenericsGeneratorResult> consClass, String tph) {
|
||||||
|
return consClass.stream()
|
||||||
|
.filter(c -> c.getConstraint().getLeft().equals(tph) || c.getEqualsTPHs().contains(tph))
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEqualTPH(List<GenericsGeneratorResult> constraints2, String tph) {
|
||||||
|
return constraints2.stream()
|
||||||
|
.filter(c -> c.getConstraint().getLeft().equals(tph) || c.getEqualsTPHs().contains(tph))
|
||||||
|
.findFirst().get().getConstraint().getLeft();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates signature for class or interface with {@link SignatureWriter}
|
* Creates signature for class or interface with {@link SignatureWriter}
|
||||||
* Signature looks like:
|
* Signature looks like: <typevaliables (K:Ljava/lang/Object
|
||||||
* <typevaliables (K:Ljava/lang/Object "Bounds")>superclass
|
* "Bounds")>superclass
|
||||||
*/
|
*/
|
||||||
private void createSignatureForClassOrInterface() {
|
public String createSignatureForClassOrInterface() {
|
||||||
Iterator<GenericTypeVar> itr = classOrInterface.getGenerics().iterator();
|
defineTypeVariablesForClassOrInterface();
|
||||||
|
|
||||||
while(itr.hasNext()) {
|
defineGenericsFromConstraints(consClass,genericsAndBounds);
|
||||||
GenericTypeVar g = itr.next();
|
|
||||||
getBoundsOfTypeVar(g,genericsAndBounds);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!consClass.isEmpty()) {
|
|
||||||
ArrayList<String> types = new ArrayList<>();
|
|
||||||
ArrayList<String> superTypes = new ArrayList<>();
|
|
||||||
|
|
||||||
for(TPHConstraint cons : consClass) {
|
|
||||||
types.add(cons.getLeft());
|
|
||||||
superTypes.add(cons.getRight());
|
|
||||||
}
|
|
||||||
|
|
||||||
for(TPHConstraint cons : consClass) {
|
|
||||||
String t = cons.getLeft()+"$";
|
|
||||||
String bound = cons.getRight()+"$";
|
|
||||||
sw.visitFormalTypeParameter(t);
|
|
||||||
sw.visitClassBound().visitTypeVariable(bound);
|
|
||||||
genericsAndBounds.put(t, bound);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(TPHConstraint cons : consClass) {
|
|
||||||
if(!types.contains(cons.getRight()) && !genericsAndBounds.keySet().contains(cons.getRight()+"$")) {
|
|
||||||
String t = cons.getRight()+"$";
|
|
||||||
String bound = Type.getInternalName(Object.class);
|
|
||||||
sw.visitFormalTypeParameter(t);
|
|
||||||
sw.visitClassBound().visitClassType(bound);
|
|
||||||
genericsAndBounds.put(t, bound);
|
|
||||||
sw.visitClassBound().visitEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/*if(!commonPairs.isEmpty()) {
|
|
||||||
ArrayList<TypePlaceholder> types = new ArrayList<>();
|
|
||||||
ArrayList<TypePlaceholder> superTypes = new ArrayList<>();
|
|
||||||
|
|
||||||
for(GenericInsertPair p : commonPairs) {
|
|
||||||
types.add(p.TA1);
|
|
||||||
superTypes.add(p.TA2);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(GenericInsertPair p : commonPairs) {
|
|
||||||
String t = p.TA1.getName()+"$";
|
|
||||||
String bound = p.TA2.getName()+"$";
|
|
||||||
sw.visitFormalTypeParameter(t);
|
|
||||||
sw.visitClassBound().visitTypeVariable(bound);
|
|
||||||
genericsAndBounds.put(t, bound);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(GenericInsertPair p : commonPairs) {
|
|
||||||
if(!types.contains(p.TA2)) {
|
|
||||||
String t = p.TA2.getName()+"$";
|
|
||||||
String bound = Type.getInternalName(Object.class);
|
|
||||||
sw.visitFormalTypeParameter(t);
|
|
||||||
sw.visitClassBound().visitClassType(bound);
|
|
||||||
genericsAndBounds.put(t, bound);
|
|
||||||
sw.visitClassBound().visitEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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());
|
String sClass = classOrInterface.getSuperClass().acceptTV(new TypeToSignature());
|
||||||
sw.visitSuperclass().visitClassType(sClass.substring(1, sClass.length()-1));
|
sw.visitSuperclass().visitClassType(sClass.substring(1, sClass.length() - 1));
|
||||||
sw.visitEnd();
|
sw.visitEnd();
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get bounds of type variable
|
|
||||||
* @param g type variable
|
|
||||||
* @param genAndBounds
|
|
||||||
*/
|
|
||||||
private void getBoundsOfTypeVar(GenericTypeVar g, HashMap<String, String> genAndBounds) {
|
|
||||||
sw.visitFormalTypeParameter(g.getName());
|
|
||||||
|
|
||||||
Iterator<? extends RefTypeOrTPHOrWildcardOrGeneric> bItr = g.getBounds().iterator();
|
|
||||||
while(bItr.hasNext()) {
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric b =bItr.next();
|
|
||||||
String boundDesc = b.acceptTV(new TypeToDescriptor());
|
|
||||||
// System.out.println("GetBounds: " + boundDesc);
|
|
||||||
// Ensure that <...> extends java.lang.Object OR ...
|
|
||||||
if(b instanceof GenericRefType) {
|
|
||||||
sw.visitClassBound().visitTypeVariable(boundDesc);
|
|
||||||
} else {
|
|
||||||
sw.visitClassBound().visitClassType(boundDesc);
|
|
||||||
sw.visitClassBound().visitEnd();
|
|
||||||
}
|
|
||||||
genAndBounds.put(g.getName(), boundDesc);
|
|
||||||
}
|
|
||||||
// sw.visitClassBound().visitEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
return sw.toString();
|
return sw.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void defineTypeVariablesForClassOrInterface() {
|
||||||
|
Iterator<GenericTypeVar> itr = classOrInterface.getGenerics().iterator();
|
||||||
|
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
GenericTypeVar g = itr.next();
|
||||||
|
visitTypeVarsAndTheirBounds(g, genericsAndBounds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param genericsAndBounds2
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void defineGenericsFromConstraints(List<GenericsGeneratorResult> constraints, HashMap<String,String> genericsAndBounds2) {
|
||||||
|
constraints.forEach(c -> {
|
||||||
|
String typeVariable = c.getConstraint().getLeft() + SPECIAL_CHAR;
|
||||||
|
sw.visitFormalTypeParameter(typeVariable);
|
||||||
|
|
||||||
|
String bound = c.getConstraint().getRight();
|
||||||
|
bound = checkBound(bound);
|
||||||
|
genericsAndBounds2.put(typeVariable, bound);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bound
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String checkBound(String bound) {
|
||||||
|
if (bound.equals(Type.getInternalName(Object.class))) {
|
||||||
|
visitClassBound(bound);
|
||||||
|
} else {
|
||||||
|
bound += SPECIAL_CHAR;
|
||||||
|
sw.visitClassBound().visitTypeVariable(bound);
|
||||||
|
}
|
||||||
|
return bound;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bound
|
||||||
|
*/
|
||||||
|
private void visitClassBound(String bound) {
|
||||||
|
sw.visitClassBound().visitClassType(bound);
|
||||||
|
sw.visitClassBound().visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get bounds of type variable
|
||||||
|
*
|
||||||
|
* @param g type variable
|
||||||
|
* @param genAndBounds
|
||||||
|
*/
|
||||||
|
private void visitTypeVarsAndTheirBounds(GenericTypeVar g, HashMap<String, String> genAndBounds) {
|
||||||
|
sw.visitFormalTypeParameter(g.getName());
|
||||||
|
|
||||||
|
Iterator<? extends RefTypeOrTPHOrWildcardOrGeneric> bItr = g.getBounds().iterator();
|
||||||
|
while (bItr.hasNext()) {
|
||||||
|
RefTypeOrTPHOrWildcardOrGeneric b = bItr.next();
|
||||||
|
String boundDesc = b.acceptTV(new TypeToDescriptor());
|
||||||
|
// Ensure that <...> extends java.lang.Object OR ...
|
||||||
|
if (b instanceof GenericRefType) {
|
||||||
|
sw.visitClassBound().visitTypeVariable(boundDesc);
|
||||||
|
} else {
|
||||||
|
visitClassBound(boundDesc);
|
||||||
|
}
|
||||||
|
genAndBounds.put(g.getName(), boundDesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if(sw == null)
|
||||||
|
return super.toString();
|
||||||
|
return sw.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,11 @@
|
|||||||
package de.dhbwstuttgart.bytecode.signature;
|
package de.dhbwstuttgart.bytecode.signature;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResult;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
@@ -12,6 +15,15 @@ import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.TypeVisitor;
|
import de.dhbwstuttgart.syntaxtree.type.TypeVisitor;
|
||||||
|
|
||||||
public class TypeToSignature implements TypeVisitor<String> {
|
public class TypeToSignature implements TypeVisitor<String> {
|
||||||
|
private List<GenericsGeneratorResult> constraints;
|
||||||
|
|
||||||
|
public TypeToSignature() {
|
||||||
|
this.constraints = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TypeToSignature(List<GenericsGeneratorResult> constraints) {
|
||||||
|
this.constraints = constraints;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visit(RefType refType) {
|
public String visit(RefType refType) {
|
||||||
@@ -33,7 +45,7 @@ public class TypeToSignature implements TypeVisitor<String> {
|
|||||||
// } else {
|
// } else {
|
||||||
// params += "L"+param.toString().replace(".", "/");
|
// params += "L"+param.toString().replace(".", "/");
|
||||||
// }
|
// }
|
||||||
params += param.acceptTV(new TypeToSignature());
|
params += param.acceptTV(new TypeToSignature(constraints));
|
||||||
|
|
||||||
if(param instanceof TypePlaceholder)
|
if(param instanceof TypePlaceholder)
|
||||||
params += ";";
|
params += ";";
|
||||||
@@ -48,7 +60,7 @@ public class TypeToSignature implements TypeVisitor<String> {
|
|||||||
@Override
|
@Override
|
||||||
public String visit(SuperWildcardType superWildcardType) {
|
public String visit(SuperWildcardType superWildcardType) {
|
||||||
// throw new NotImplementedException();
|
// throw new NotImplementedException();
|
||||||
String sig = "-" + superWildcardType.getInnerType().acceptTV(new TypeToSignature());
|
String sig = "-" + superWildcardType.getInnerType().acceptTV(new TypeToSignature(constraints));
|
||||||
if(superWildcardType.getInnerType() instanceof TypePlaceholder)
|
if(superWildcardType.getInnerType() instanceof TypePlaceholder)
|
||||||
sig += ";";
|
sig += ";";
|
||||||
return sig;
|
return sig;
|
||||||
@@ -57,13 +69,21 @@ public class TypeToSignature implements TypeVisitor<String> {
|
|||||||
@Override
|
@Override
|
||||||
public String visit(TypePlaceholder typePlaceholder) {
|
public String visit(TypePlaceholder typePlaceholder) {
|
||||||
// return typePlaceholder.toString().replace(".", "/");
|
// return typePlaceholder.toString().replace(".", "/");
|
||||||
return "T" + typePlaceholder.getName() + "$";
|
String name = typePlaceholder.getName();
|
||||||
|
|
||||||
|
if(!constraints.isEmpty()){
|
||||||
|
Optional<GenericsGeneratorResult> equalName = getEqualTPHFromClassConstraints(constraints, name);
|
||||||
|
if(equalName.isPresent())
|
||||||
|
name = equalName.get().getConstraint().getLeft();
|
||||||
|
}
|
||||||
|
|
||||||
|
return "T" + name + "$";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visit(ExtendsWildcardType extendsWildcardType) {
|
public String visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
// throw new NotImplementedException();
|
// throw new NotImplementedException();
|
||||||
String sig = "+" + extendsWildcardType.getInnerType().acceptTV(new TypeToSignature());
|
String sig = "+" + extendsWildcardType.getInnerType().acceptTV(new TypeToSignature(constraints));
|
||||||
if(extendsWildcardType.getInnerType() instanceof TypePlaceholder)
|
if(extendsWildcardType.getInnerType() instanceof TypePlaceholder)
|
||||||
sig += ";";
|
sig += ";";
|
||||||
return sig;
|
return sig;
|
||||||
@@ -74,4 +94,9 @@ public class TypeToSignature implements TypeVisitor<String> {
|
|||||||
return genericRefType.getParsedName().replace(".", "/");
|
return genericRefType.getParsedName().replace(".", "/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Optional<GenericsGeneratorResult> getEqualTPHFromClassConstraints(List<GenericsGeneratorResult> listOfConstraints, String tph) {
|
||||||
|
return listOfConstraints.stream()
|
||||||
|
.filter(c -> c.getConstraint().getLeft().equals(tph) || c.getEqualsTPHs().contains(tph))
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.simplifyRes;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The simplify results of a source file (package)
|
||||||
|
*
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericGenratorResultForSourceFile {
|
||||||
|
private String pkgName;
|
||||||
|
private final List<GenericsGeneratorResultForClass> genericGeneratorResultForAllClasses = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param pkgName
|
||||||
|
*/
|
||||||
|
public GenericGenratorResultForSourceFile(String pkgName) {
|
||||||
|
this.pkgName = pkgName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<GenericsGeneratorResultForClass> getGenericGeneratorResultForAllClasses() {
|
||||||
|
return genericGeneratorResultForAllClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends the simplify results of a class to simplifyResForSF
|
||||||
|
*
|
||||||
|
* @param sResClass simplify results of a class to added
|
||||||
|
*/
|
||||||
|
public void addGenericGeneratorResultClass(GenericsGeneratorResultForClass sResClass) {
|
||||||
|
genericGeneratorResultForAllClasses.add(sResClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenericsGeneratorResultForClass getSimplifyResultsByName(String pkgName, String name) {
|
||||||
|
for (int i = 0; i < genericGeneratorResultForAllClasses.size(); i++) {
|
||||||
|
GenericsGeneratorResultForClass genericsGeneratorResult = genericGeneratorResultForAllClasses.get(i);
|
||||||
|
if (genericsGeneratorResult.getClassName().equals(name)) {
|
||||||
|
return genericsGeneratorResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new GenericsGeneratorResultForClass(name);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,75 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.simplifyRes;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.common.base.Optional;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericGeneratorResultsForAllMethods;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResult;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.MethodAndConstraints;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GenericsGeneratorResultForClass {
|
||||||
|
private final String className;
|
||||||
|
private final List<GenericsGeneratorResult> classConstraints;
|
||||||
|
private final GenericGeneratorResultsForAllMethods methodsAndTheirConstraints;
|
||||||
|
|
||||||
|
public GenericsGeneratorResultForClass(String className) {
|
||||||
|
this(className, Collections.emptyList(), new GenericGeneratorResultsForAllMethods());
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param className
|
||||||
|
* @param classConstraints
|
||||||
|
* @param methodsAndTheirConstraints
|
||||||
|
*/
|
||||||
|
public GenericsGeneratorResultForClass(String className, List<GenericsGeneratorResult> classConstraints,
|
||||||
|
GenericGeneratorResultsForAllMethods methodsAndTheirConstraints) {
|
||||||
|
this.className = className;
|
||||||
|
this.classConstraints = classConstraints;
|
||||||
|
this.methodsAndTheirConstraints = methodsAndTheirConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the className
|
||||||
|
*/
|
||||||
|
public String getClassName() {
|
||||||
|
return className;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the classConstraints
|
||||||
|
*/
|
||||||
|
public List<GenericsGeneratorResult> getClassConstraints() {
|
||||||
|
return classConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the methodsAndTheirConstraints
|
||||||
|
*/
|
||||||
|
public GenericGeneratorResultsForAllMethods getMethodsAndTheirConstraints() {
|
||||||
|
return methodsAndTheirConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(String id) {
|
||||||
|
return methodsAndTheirConstraints.getMethodsAndConstraints().stream().map(mc -> mc.getMethodID())
|
||||||
|
.anyMatch(i -> i.equals(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public List<GenericsGeneratorResult> getMethodConstraintsByID(String id) {
|
||||||
|
java.util.Optional<MethodAndConstraints> methodAndConstraints = methodsAndTheirConstraints.getMethodsAndConstraints().stream().filter(mc -> mc.getMethodID().equals(id))
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
return methodAndConstraints.isPresent() ? methodAndConstraints.get().getConstraints() : Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,94 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode.utilities;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.signature.Signature;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
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 java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
public class ByteCodeForFunNGenerator {
|
||||||
|
|
||||||
|
public static void generateBCForFunN(LambdaExpression lambdaExpression, String methDesc, File path) {
|
||||||
|
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
|
||||||
|
|
||||||
|
SignatureWriter methSig = new SignatureWriter();
|
||||||
|
|
||||||
|
int numberOfParams = 0;
|
||||||
|
SignatureVisitor paramVisitor = methSig.visitParameterType();
|
||||||
|
Iterator<FormalParameter> itr = lambdaExpression.params.iterator();
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
numberOfParams++;
|
||||||
|
// getBounds
|
||||||
|
paramVisitor.visitTypeVariable(CONSTANTS.T + numberOfParams);
|
||||||
|
itr.next();
|
||||||
|
}
|
||||||
|
methSig.visitReturnType().visitTypeVariable(CONSTANTS.R);
|
||||||
|
// ")"+lam.getReturn.getBounds
|
||||||
|
Signature sig = new Signature(numberOfParams);
|
||||||
|
String name = CONSTANTS.FUN + numberOfParams + CONSTANTS.$$;
|
||||||
|
classWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+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, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void generateBCForFunN(ArgumentList argumentList, String methDesc, File path) {
|
||||||
|
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
|
||||||
|
|
||||||
|
SignatureWriter methSig = new SignatureWriter();
|
||||||
|
|
||||||
|
int numberOfParams = 0;
|
||||||
|
SignatureVisitor paramVisitor = methSig.visitParameterType();
|
||||||
|
Iterator<Expression> itr1 = argumentList.getArguments().iterator();
|
||||||
|
|
||||||
|
while(itr1.hasNext()) {
|
||||||
|
numberOfParams++;
|
||||||
|
// getBounds
|
||||||
|
paramVisitor.visitTypeVariable(CONSTANTS.T + numberOfParams);
|
||||||
|
itr1.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
methSig.visitReturnType().visitTypeVariable(CONSTANTS.R);
|
||||||
|
// ")"+lam.getReturn.getBounds
|
||||||
|
Signature sig = new Signature(numberOfParams);
|
||||||
|
String name = CONSTANTS.FUN + numberOfParams + CONSTANTS.$$;
|
||||||
|
classWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+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, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void writeClassFile(byte[] bytecode, String name, File path) {
|
||||||
|
FileOutputStream output;
|
||||||
|
try {
|
||||||
|
System.out.println("generating " + name + ".class file...");
|
||||||
|
output = new FileOutputStream(
|
||||||
|
new File(path , name + CONSTANTS.EXTENSIONCLASS));
|
||||||
|
output.write(bytecode);
|
||||||
|
output.close();
|
||||||
|
System.out.println(name + ".class file generated");
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,22 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode.utilities;
|
||||||
|
|
||||||
|
public interface CONSTANTS {
|
||||||
|
|
||||||
|
String VOID = "void";
|
||||||
|
String TPH = "TPH ";
|
||||||
|
String ANGLEBRACKET = "<";
|
||||||
|
String FUN = "Fun";
|
||||||
|
String EXTENSIONCLASS = ".class";
|
||||||
|
String $$ = "$$";
|
||||||
|
String T = "T";
|
||||||
|
String R = "R";
|
||||||
|
String DESUGAREDMETHODNAME = "lambda$new$";
|
||||||
|
String REFTYPE_BYTE = "java/lang/Byte";
|
||||||
|
String REFTYPE_SHORT = "java/lang/Short";
|
||||||
|
String REFTYPE_INTEGER = "java/lang/Integer";
|
||||||
|
String REFTYPE_LONG = "java/lang/Long";
|
||||||
|
String REFTYPE_DOUBLE = "java/lang/Double";
|
||||||
|
String REFTYPE_FLOAT = "java/lang/Float";
|
||||||
|
String REFTYPE_STRING = "java/lang/String";
|
||||||
|
String TO_STRING = "toString";
|
||||||
|
}
|
@@ -5,25 +5,27 @@ import java.util.List;
|
|||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.ConstraintsWithSameLeftSide;
|
||||||
|
|
||||||
public class ConstraintsFinder {
|
public class ConstraintsFinder {
|
||||||
private List<TPHConstraint> allConstaints;
|
private List<TPHConstraint> allConstaints;
|
||||||
|
|
||||||
public ConstraintsFinder(List<TPHConstraint> allConstaints) {
|
public ConstraintsFinder(List<TPHConstraint> allConstaints) {
|
||||||
super();
|
|
||||||
this.allConstaints = allConstaints;
|
this.allConstaints = allConstaints;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<List<TPHConstraint>> findConstraints() {
|
public List<ConstraintsWithSameLeftSide> findConstraints() {
|
||||||
List<List<TPHConstraint>> result = new ArrayList<>();
|
List<ConstraintsWithSameLeftSide> result = new ArrayList<>();
|
||||||
|
|
||||||
List<TPHConstraint> visitedCons = new ArrayList<>();
|
List<TPHConstraint> visitedCons = new ArrayList<>();
|
||||||
for(TPHConstraint c : allConstaints) {
|
for(TPHConstraint c : allConstaints) {
|
||||||
if(c.getRel() == Relation.EXTENDS) {
|
if(c.getRel() == Relation.EXTENDS) {
|
||||||
// get constraints with the same left side
|
// get constraints with the same left side
|
||||||
List<TPHConstraint> cons = getConstraints(c,visitedCons);
|
List<TPHConstraint> cons = getConstraints(c,visitedCons);
|
||||||
if(cons.size()>1)
|
if(cons.size()>1) {
|
||||||
result.add(cons);
|
ConstraintsWithSameLeftSide consWithSameLeftSide = new ConstraintsWithSameLeftSide(cons);
|
||||||
|
result.add(consWithSameLeftSide);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
package de.dhbwstuttgart.bytecode.utilities;
|
package de.dhbwstuttgart.bytecode.utilities;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.*;
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -19,7 +18,8 @@ public class KindOfLambda implements StatementVisitor{
|
|||||||
private boolean isInstanceCapturingLambda = false;
|
private boolean isInstanceCapturingLambda = false;
|
||||||
private List<RefTypeOrTPHOrWildcardOrGeneric> argumentList = new ArrayList<>();
|
private List<RefTypeOrTPHOrWildcardOrGeneric> argumentList = new ArrayList<>();
|
||||||
private ArrayList<String> usedVars = new ArrayList<>();
|
private ArrayList<String> usedVars = new ArrayList<>();
|
||||||
private boolean hasThis = false;
|
private ArrayList<String> varsFromInnerLambdas = new ArrayList<>();
|
||||||
|
private boolean thisUsed = false;
|
||||||
private ArrayList<String> definedLocals = new ArrayList<>();
|
private ArrayList<String> definedLocals = new ArrayList<>();
|
||||||
|
|
||||||
public KindOfLambda(LambdaExpression lambdaExpression) {
|
public KindOfLambda(LambdaExpression lambdaExpression) {
|
||||||
@@ -40,19 +40,20 @@ public class KindOfLambda implements StatementVisitor{
|
|||||||
return argumentList;
|
return argumentList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isHasThis() {
|
public boolean isThisUsed() {
|
||||||
return hasThis;
|
return thisUsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(ArgumentList argumentList) {
|
public void visit(ArgumentList argumentList) {
|
||||||
// TODO Auto-generated method stub
|
argumentList.getArguments().forEach(a->a.accept(this));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LambdaExpression lambdaExpression) {
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
lambdaExpression.params.getFormalparalist().forEach(p->varsFromInnerLambdas.add(p.getName()));
|
||||||
|
lambdaExpression.methodBody.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -111,9 +112,11 @@ public class KindOfLambda implements StatementVisitor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LocalVar localVar) {
|
public void visit(LocalVar localVar) {
|
||||||
if(!contain(params, localVar.name) && !definedLocals.contains(localVar.name)) {
|
boolean addVar = !contain(params, localVar.name) && !definedLocals.contains(localVar.name) &&
|
||||||
|
!varsFromInnerLambdas.contains(localVar.name) && !usedVars.contains(localVar.name);
|
||||||
|
if(addVar) {
|
||||||
argumentList.add(localVar.getType());
|
argumentList.add(localVar.getType());
|
||||||
if(hasThis) {
|
if(thisUsed) {
|
||||||
usedVars.add(1, localVar.name);
|
usedVars.add(1, localVar.name);
|
||||||
} else {
|
} else {
|
||||||
usedVars.add(0, localVar.name);
|
usedVars.add(0, localVar.name);
|
||||||
@@ -141,12 +144,13 @@ public class KindOfLambda implements StatementVisitor{
|
|||||||
@Override
|
@Override
|
||||||
public void visit(MethodCall methodCall) {
|
public void visit(MethodCall methodCall) {
|
||||||
methodCall.receiver.accept(this);
|
methodCall.receiver.accept(this);
|
||||||
|
methodCall.arglist.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(NewClass methodCall) {
|
public void visit(NewClass methodCall) {
|
||||||
// TODO Auto-generated method stub
|
methodCall.receiver.accept(this);
|
||||||
|
methodCall.arglist.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -190,8 +194,8 @@ public class KindOfLambda implements StatementVisitor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(This aThis) {
|
public void visit(This aThis) {
|
||||||
if(!hasThis) {
|
if(!thisUsed) {
|
||||||
hasThis = true;
|
thisUsed = true;
|
||||||
this.argumentList.add(0,aThis.getType());
|
this.argumentList.add(0,aThis.getType());
|
||||||
}
|
}
|
||||||
if(!isInstanceCapturingLambda) {
|
if(!isInstanceCapturingLambda) {
|
||||||
|
@@ -9,7 +9,7 @@ import de.dhbwstuttgart.typeinference.result.ResultPair;
|
|||||||
|
|
||||||
public class MethodAndTPH {
|
public class MethodAndTPH {
|
||||||
|
|
||||||
private String name;
|
private String id;
|
||||||
private final ArrayList<String> tphs = new ArrayList<>();
|
private final ArrayList<String> tphs = new ArrayList<>();
|
||||||
//private final ArrayList<GenericInsertPair> pairs = new ArrayList<>();
|
//private final ArrayList<GenericInsertPair> pairs = new ArrayList<>();
|
||||||
private final ArrayList<ResultPair<TypePlaceholder, TypePlaceholder>> pairs = new ArrayList<>();
|
private final ArrayList<ResultPair<TypePlaceholder, TypePlaceholder>> pairs = new ArrayList<>();
|
||||||
@@ -17,7 +17,7 @@ public class MethodAndTPH {
|
|||||||
private final ArrayList<String> localTphs = new ArrayList<>();
|
private final ArrayList<String> localTphs = new ArrayList<>();
|
||||||
|
|
||||||
public MethodAndTPH(String name) {
|
public MethodAndTPH(String name) {
|
||||||
this.name = name;
|
this.id = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<String> getTphs() {
|
public ArrayList<String> getTphs() {
|
||||||
@@ -31,8 +31,8 @@ public class MethodAndTPH {
|
|||||||
return pairs;
|
return pairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getId() {
|
||||||
return name;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<String> getLocalTphs() {
|
public ArrayList<String> getLocalTphs() {
|
||||||
|
@@ -3,44 +3,21 @@
|
|||||||
*/
|
*/
|
||||||
package de.dhbwstuttgart.bytecode.utilities;
|
package de.dhbwstuttgart.bytecode.utilities;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import org.objectweb.asm.ClassWriter;
|
|
||||||
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.Exception.NotInCurrentPackageException;
|
import de.dhbwstuttgart.bytecode.Exception.NotInCurrentPackageException;
|
||||||
import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString;
|
import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString;
|
||||||
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
||||||
import de.dhbwstuttgart.bytecode.signature.Signature;
|
|
||||||
import de.dhbwstuttgart.bytecode.signature.TypeToSignature;
|
import de.dhbwstuttgart.bytecode.signature.TypeToSignature;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.GenericDeclarationList;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.Method;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
import javassist.NotFoundException;
|
import javassist.NotFoundException;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author fayez
|
* @author fayez
|
||||||
@@ -50,7 +27,7 @@ public class MethodCallHelper {
|
|||||||
private MethodCall methCall;
|
private MethodCall methCall;
|
||||||
private SourceFile sourceFile;
|
private SourceFile sourceFile;
|
||||||
private ResultSet resultSet;
|
private ResultSet resultSet;
|
||||||
private String path;
|
private File path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param methCall
|
* @param methCall
|
||||||
@@ -58,7 +35,7 @@ public class MethodCallHelper {
|
|||||||
* @param resultSet
|
* @param resultSet
|
||||||
* @param path TODO
|
* @param path TODO
|
||||||
*/
|
*/
|
||||||
public MethodCallHelper(MethodCall methCall, SourceFile sourceFile, ResultSet resultSet, String path) {
|
public MethodCallHelper(MethodCall methCall, SourceFile sourceFile, ResultSet resultSet, File path) {
|
||||||
this.methCall = methCall;
|
this.methCall = methCall;
|
||||||
this.sourceFile = sourceFile;
|
this.sourceFile = sourceFile;
|
||||||
this.resultSet = resultSet;
|
this.resultSet = resultSet;
|
||||||
@@ -98,11 +75,15 @@ public class MethodCallHelper {
|
|||||||
public String getDesc(String className) throws NotInCurrentPackageException, NotFoundException {
|
public String getDesc(String className) throws NotInCurrentPackageException, NotFoundException {
|
||||||
String name = methCall.name;
|
String name = methCall.name;
|
||||||
ClassOrInterface clazz = getClassFromCurrPkg(className);
|
ClassOrInterface clazz = getClassFromCurrPkg(className);
|
||||||
|
String retType = getResolvedType(methCall.getType());
|
||||||
|
ArrayList<String> params = getTypes(methCall.arglist.getArguments());
|
||||||
|
|
||||||
Map<String, String> genAndBoundsClass = getGenericsAndBounds(clazz.getGenerics());
|
Map<String, String> genAndBoundsClass = getGenericsAndBounds(clazz.getGenerics());
|
||||||
modifyGenAndBounds(genAndBoundsClass);
|
modifyGenAndBounds(genAndBoundsClass);
|
||||||
for (Method m : clazz.getMethods()) {
|
for (Method m : clazz.getMethods()) {
|
||||||
if (name.equals(m.getName())) {
|
if (name.equals(m.getName()) && retType.equals(getResolvedType(m.getReturnType()))) {
|
||||||
|
ArrayList<String> paramsOfM = getTypes(m.getParameterList());
|
||||||
|
if(areEquals(params,paramsOfM)) {
|
||||||
Map<String, String> genAndBoundsMethod = getGenericsAndBoundsMethod(m.getGenerics());
|
Map<String, String> genAndBoundsMethod = getGenericsAndBoundsMethod(m.getGenerics());
|
||||||
modifyGenAndBounds(genAndBoundsMethod);
|
modifyGenAndBounds(genAndBoundsMethod);
|
||||||
boolean hasGen = hasGen(m, genAndBoundsClass);
|
boolean hasGen = hasGen(m, genAndBoundsClass);
|
||||||
@@ -111,10 +92,45 @@ public class MethodCallHelper {
|
|||||||
return nm.accept(new DescriptorToString(resultSet));
|
return nm.accept(new DescriptorToString(resultSet));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
throw new NotFoundException("Method " + name + " is not found");
|
throw new NotFoundException("Method " + name + " is not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean areEquals(ArrayList<String> params, ArrayList<String> paramsOfM) {
|
||||||
|
if(params.size() != paramsOfM.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for(String t : params) {
|
||||||
|
for(String t2 : paramsOfM) {
|
||||||
|
if(!t.equals(t2))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> getTypes(ParameterList parameterList) {
|
||||||
|
Iterator<FormalParameter> itr = parameterList.iterator();
|
||||||
|
ArrayList<String> typeList = new ArrayList<>();
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
String t = getResolvedType(fp.getType());
|
||||||
|
typeList.add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
return typeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> getTypes(List<Expression> arguments) {
|
||||||
|
ArrayList<String> types = new ArrayList<>();
|
||||||
|
for(int i = 0; i<arguments.size(); ++i) {
|
||||||
|
String t = getResolvedType(arguments.get(i).getType());
|
||||||
|
types.add(t);
|
||||||
|
}
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean hasGen(Method m, Map<String, String> genericsAndBounds) {
|
private boolean hasGen(Method m, Map<String, String> genericsAndBounds) {
|
||||||
String retType = resultSet.resolveType(m.getReturnType()).resolvedType.acceptTV(new TypeToSignature());
|
String retType = resultSet.resolveType(m.getReturnType()).resolvedType.acceptTV(new TypeToSignature());
|
||||||
/*Prüfe, ob die Rückgabe-Type der Methode eine Type-Variable ist*/
|
/*Prüfe, ob die Rückgabe-Type der Methode eine Type-Variable ist*/
|
||||||
@@ -204,52 +220,25 @@ public class MethodCallHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String generateBCForFunN() {
|
public void generateBCForFunN(String methodDescriptor) {
|
||||||
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
|
ByteCodeForFunNGenerator.generateBCForFunN(methCall.arglist,methodDescriptor,path);
|
||||||
|
|
||||||
SignatureWriter methSig = new SignatureWriter();
|
|
||||||
|
|
||||||
int numberOfParams = 0;
|
|
||||||
SignatureVisitor paramVisitor = methSig.visitParameterType();
|
|
||||||
Iterator<Expression> itr1 = methCall.arglist.getArguments().iterator();
|
|
||||||
String methDesc = "(";
|
|
||||||
while(itr1.hasNext()) {
|
|
||||||
numberOfParams++;
|
|
||||||
// getBounds
|
|
||||||
paramVisitor.visitTypeVariable("T" + numberOfParams);
|
|
||||||
methDesc += "L" + Type.getInternalName(Object.class) + ";";
|
|
||||||
itr1.next();
|
|
||||||
}
|
|
||||||
methDesc += ")L" + Type.getInternalName(Object.class) + ";";
|
|
||||||
|
|
||||||
methSig.visitReturnType().visitTypeVariable("R");
|
|
||||||
// ")"+lam.getReturn.getBounds
|
|
||||||
Signature sig = new Signature(numberOfParams);
|
|
||||||
String name = "Fun" + numberOfParams + "$$";
|
|
||||||
classWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+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);
|
|
||||||
return methDesc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeClassFile(byte[] bytecode, String name) {
|
public String getDescriptorOfApplyMethod(String methodCallType) {
|
||||||
FileOutputStream output;
|
return new DescriptorToString().createDescForFunN(methCall.arglist, methodCallType);
|
||||||
try {
|
|
||||||
System.out.println("generating " + name + ".class file...");
|
|
||||||
output = new FileOutputStream(
|
|
||||||
new File(path + name + ".class"));
|
|
||||||
output.write(bytecode);
|
|
||||||
output.close();
|
|
||||||
System.out.println(name + ".class file generated");
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param methodCall
|
||||||
|
*/
|
||||||
|
public void createCheckCast(MethodCall methodCall, MethodVisitor mv) {
|
||||||
|
String checkCast = getResolvedType(methodCall.getType());
|
||||||
|
if(!checkCast.contains("TPH ")) {
|
||||||
|
int pos = checkCast.length();
|
||||||
|
if(checkCast.contains("<"))
|
||||||
|
pos = checkCast.indexOf("<");
|
||||||
|
mv.visitTypeInsn(Opcodes.CHECKCAST,checkCast.substring(0,pos));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.utilities;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Method;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class MethodUtility {
|
||||||
|
/**
|
||||||
|
* Creates an ID for a method
|
||||||
|
*
|
||||||
|
* @param resolver type Resolver
|
||||||
|
* @param method for which the ID will be generated
|
||||||
|
* @return ID for the given method.
|
||||||
|
* ID = ReturntypeMethodname(Parametertypes)
|
||||||
|
*/
|
||||||
|
public static String createID(Resolver resolver, Method method) {
|
||||||
|
String id = resolver.getResolvedType(method.getReturnType()) + method.name + "(";
|
||||||
|
Iterator<FormalParameter> itr = method.getParameterList().iterator();
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
id += resolver.getResolvedType(fp.getType());
|
||||||
|
}
|
||||||
|
id += ")";
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
@@ -4,13 +4,18 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.NameReplacementResult;
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
|
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
|
||||||
|
|
||||||
public class NameReplacer {
|
public class NameReplacer {
|
||||||
|
//TODO rename
|
||||||
private List<TPHConstraint> constraints;
|
private List<TPHConstraint> constraints;
|
||||||
private List<TPHConstraint> allConstraints;
|
private List<TPHConstraint> allConstraints;
|
||||||
|
private List<MethodAndTPH> methodAndTPHs;
|
||||||
|
// TODO rename into tphClass
|
||||||
private List<String> tphs;
|
private List<String> tphs;
|
||||||
private List<String> localTphs;
|
private List<String> localTphs;
|
||||||
|
|
||||||
@@ -22,7 +27,98 @@ public class NameReplacer {
|
|||||||
this.localTphs = localTphs;
|
this.localTphs = localTphs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, List<String>> replaceNames() {
|
public NameReplacer(List<TPHConstraint> constraints, List<TPHConstraint> allConstraints,List<String> tphs) {
|
||||||
|
super();
|
||||||
|
this.constraints = constraints;
|
||||||
|
this.allConstraints = allConstraints;
|
||||||
|
this.tphs = tphs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NameReplacer(List<TPHConstraint> constraints, List<TPHConstraint> allConstraints) {
|
||||||
|
this.constraints = constraints;
|
||||||
|
this.allConstraints = allConstraints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NameReplacer(List<TPHConstraint> constraints, List<TPHConstraint> allConstraints, List<MethodAndTPH> methodAndTPHs,
|
||||||
|
List<String> tphsClass) {
|
||||||
|
this.constraints = constraints;
|
||||||
|
this.allConstraints = allConstraints;
|
||||||
|
this.methodAndTPHs = methodAndTPHs;
|
||||||
|
this.tphs = tphsClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NameReplacementResult replaceNames() {
|
||||||
|
String newName = NameGenerator.makeNewName();
|
||||||
|
List<String> names = new ArrayList<>();
|
||||||
|
substituteRightSidesWithNewName(newName, names);
|
||||||
|
|
||||||
|
substituteNamesInAllConstraints(newName, names);
|
||||||
|
Stream<ArrayList<String>> tphsOfMethods = methodAndTPHs.stream().map(m->m.getTphs());
|
||||||
|
Stream<ArrayList<String>> localTphsOfMethods = methodAndTPHs.stream().map(m->m.getLocalTphs());
|
||||||
|
|
||||||
|
replaceOldNames(newName, names, tphsOfMethods);
|
||||||
|
replaceOldNames(newName, names, localTphsOfMethods);
|
||||||
|
|
||||||
|
if(tphs.removeAll(names))
|
||||||
|
tphs.add(newName);
|
||||||
|
|
||||||
|
NameReplacementResult res = new NameReplacementResult(newName, names);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param newName
|
||||||
|
* @param names
|
||||||
|
* @param tphsOfMethods
|
||||||
|
*/
|
||||||
|
public void replaceOldNames(final String newName, final List<String> names, Stream<ArrayList<String>> tphsOfMethods) {
|
||||||
|
tphsOfMethods.forEach(tphsMethod->{
|
||||||
|
if(tphsMethod.removeAll(names))
|
||||||
|
tphsMethod.add(newName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public NameReplacementResult replaceNamesLocal() {
|
||||||
|
String newName = NameGenerator.makeNewName();
|
||||||
|
List<String> names = new ArrayList<>();
|
||||||
|
substituteRightSidesWithNewName(newName, names);
|
||||||
|
|
||||||
|
substituteNamesInAllConstraints(newName, names);
|
||||||
|
|
||||||
|
tphs.removeAll(names);
|
||||||
|
tphs.add(newName);
|
||||||
|
|
||||||
|
NameReplacementResult res = new NameReplacementResult(newName, names);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param newName
|
||||||
|
* @param names
|
||||||
|
*/
|
||||||
|
public void substituteNamesInAllConstraints(String newName, List<String> names) {
|
||||||
|
for(TPHConstraint cons : allConstraints) {
|
||||||
|
if(names.contains(cons.getLeft()))
|
||||||
|
cons.setLeft(newName);
|
||||||
|
if(names.contains(cons.getRight()))
|
||||||
|
cons.setRight(newName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param newName
|
||||||
|
* @param names
|
||||||
|
*/
|
||||||
|
public void substituteRightSidesWithNewName(String newName, List<String> names) {
|
||||||
|
for(TPHConstraint cons : constraints) {
|
||||||
|
names.add(cons.getRight());
|
||||||
|
cons.setRight(newName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, List<String>> replaceNamesWithLocals() {
|
||||||
String newName = NameGenerator.makeNewName();
|
String newName = NameGenerator.makeNewName();
|
||||||
ArrayList<String> names = new ArrayList<>();
|
ArrayList<String> names = new ArrayList<>();
|
||||||
for(TPHConstraint cons : constraints) {
|
for(TPHConstraint cons : constraints) {
|
||||||
|
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.dhbwstuttgart.bytecode.utilities;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author fayez
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Resolver {
|
||||||
|
|
||||||
|
private ResultSet resultSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param resultSet
|
||||||
|
*/
|
||||||
|
public Resolver(ResultSet resultSet) {
|
||||||
|
this.resultSet = resultSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResolvedType(RefTypeOrTPHOrWildcardOrGeneric type) {
|
||||||
|
return resultSet.resolveType(type).resolvedType.acceptTV(new TypeToDescriptor());
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@@ -1,42 +0,0 @@
|
|||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
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<TPHConstraint> classConstraints;
|
|
||||||
private final ArrayList<String> tphsClass;
|
|
||||||
private final HashMap<String, HashMap<TPHConstraint, HashSet<String>>> methodsConstraints;
|
|
||||||
|
|
||||||
public SimplifyResult(ArrayList<TPHConstraint> classConstraints, ArrayList<String> tphsClass,
|
|
||||||
HashMap<String, HashMap<TPHConstraint, HashSet<String>>> methodsConstraints) {
|
|
||||||
super();
|
|
||||||
this.classConstraints = classConstraints;
|
|
||||||
this.tphsClass = tphsClass;
|
|
||||||
this.methodsConstraints = methodsConstraints;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<TPHConstraint> getClassConstraints() {
|
|
||||||
return classConstraints;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, HashMap<TPHConstraint, HashSet<String>>> getMethodsConstraints() {
|
|
||||||
return methodsConstraints;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<String> getTphsClass() {
|
|
||||||
return tphsClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -2,6 +2,7 @@ package de.dhbwstuttgart.core;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -9,8 +10,29 @@ public class ConsoleInterface {
|
|||||||
private static final String directory = System.getProperty("user.dir");
|
private static final String directory = System.getProperty("user.dir");
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException, ClassNotFoundException {
|
public static void main(String[] args) throws IOException, ClassNotFoundException {
|
||||||
List<File> input = Arrays.asList(args).stream().map((s -> new File(s))).collect(Collectors.toList());
|
List<File> input = new ArrayList<>();
|
||||||
JavaTXCompiler compiler = new JavaTXCompiler(input);
|
List<File> classpath = new ArrayList<>();
|
||||||
compiler.typeInference();
|
String outputPath = null;
|
||||||
|
Iterator<String> it = Arrays.asList(args).iterator();
|
||||||
|
while(it.hasNext()){
|
||||||
|
String arg = it.next();
|
||||||
|
if(arg.equals("-d")){
|
||||||
|
outputPath = it.next();
|
||||||
|
}else if(arg.startsWith("-d")) {
|
||||||
|
outputPath = arg.substring(2);
|
||||||
|
}else if(arg.equals("-cp") || arg.equals("-classpath")){
|
||||||
|
String[] cps = it.next().split(":");
|
||||||
|
for(String cp : cps){
|
||||||
|
classpath.add(new File(cp));
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
input.add(new File(arg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JavaTXCompiler compiler = new JavaTXCompiler(input, classpath);
|
||||||
|
compiler.typeInference();
|
||||||
|
compiler.generateBytecode(outputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -4,18 +4,12 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLClassLoader;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
||||||
import org.reflections.Reflections;
|
import org.antlr.v4.runtime.tree.TerminalNode;
|
||||||
import org.reflections.scanners.ResourcesScanner;
|
|
||||||
import org.reflections.scanners.SubTypesScanner;
|
|
||||||
import org.reflections.util.ClasspathHelper;
|
|
||||||
import org.reflections.util.ConfigurationBuilder;
|
|
||||||
import org.reflections.util.FilterBuilder;
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.DebugException;
|
import de.dhbwstuttgart.exceptions.DebugException;
|
||||||
import de.dhbwstuttgart.parser.JavaTXParser;
|
import de.dhbwstuttgart.parser.JavaTXParser;
|
||||||
@@ -49,8 +43,7 @@ public class CompilationEnvironment {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
//String bootClassPath = System.getProperty("sun.boot.class.path");
|
//String bootClassPath = System.getProperty("sun.boot.class.path");
|
||||||
// ClassLoader cl = ClassLoader.getPlatformClassLoader();
|
// DirectoryClassLoader cl = DirectoryClassLoader.getPlatformClassLoader();
|
||||||
ClassLoader cl = ClassLoader.getSystemClassLoader();
|
|
||||||
String bootClassPath = System.getProperty("java.class.path");
|
String bootClassPath = System.getProperty("java.class.path");
|
||||||
librarys = new ArrayList<>();
|
librarys = new ArrayList<>();
|
||||||
for(String path : bootClassPath.split(File.pathSeparator)) {
|
for(String path : bootClassPath.split(File.pathSeparator)) {
|
||||||
@@ -67,13 +60,44 @@ public class CompilationEnvironment {
|
|||||||
this.packageCrawler = new PackageCrawler(librarys);
|
this.packageCrawler = new PackageCrawler(librarys);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JavaClassRegistry getRegistry(File forSourceFile) throws ClassNotFoundException, IOException {
|
public JavaClassRegistry getRegistry(File forSourceFile, DirectoryClassLoader classLoader) throws ClassNotFoundException, IOException {
|
||||||
Map<String, Integer> allNames;
|
Map<String, Integer> allNames;
|
||||||
CompilationUnitContext tree = JavaTXParser.parse(forSourceFile);
|
CompilationUnitContext tree = JavaTXParser.parse(forSourceFile);
|
||||||
allNames = GatherNames.getNames(tree, packageCrawler);
|
allNames = GatherNames.getNames(tree, packageCrawler, classLoader);
|
||||||
|
for(Class c : loadDefaultPackageClasses(forSourceFile, classLoader)){
|
||||||
|
allNames.put(c.getName(), c.getTypeParameters().length);
|
||||||
|
}
|
||||||
return new JavaClassRegistry(allNames);
|
return new JavaClassRegistry(allNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Class> loadDefaultPackageClasses(File forSourceFile, DirectoryClassLoader classLoader) throws IOException, ClassNotFoundException {
|
||||||
|
List<Class> ret = new ArrayList<>();
|
||||||
|
String packageName = getPackageName(JavaTXParser.parse(forSourceFile));
|
||||||
|
//Set classLoader to include default package for this specific source file
|
||||||
|
File dir = new File(forSourceFile.getAbsoluteFile().getParent());
|
||||||
|
String dirPath = dir.toString() + "/";
|
||||||
|
if(packageName.length()>0)dirPath = dirPath.substring(0,dirPath.length() - packageName.length());
|
||||||
|
String path = dirPath;
|
||||||
|
ArrayList<File> defaultPath = Lists.newArrayList(new File(path));
|
||||||
|
classLoader = new DirectoryClassLoader(defaultPath, classLoader);
|
||||||
|
//Gather all names in the default package for this source file (classes that are imported by default)
|
||||||
|
File [] files = dir.listFiles((dir1, name) -> name.endsWith(".class"));
|
||||||
|
if(files != null)for (File classFile : files) {
|
||||||
|
String className = classFile.getName().substring(0,classFile.getName().length()-6);
|
||||||
|
ret.add(classLoader.loadClass(packageName + className));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getPackageName(CompilationUnitContext forTree){
|
||||||
|
String packageName = "";
|
||||||
|
if(forTree.packageDeclaration() != null && forTree.packageDeclaration().Identifier() != null)
|
||||||
|
for(TerminalNode subPackage : forTree.packageDeclaration().Identifier()){
|
||||||
|
packageName += subPackage.toString() + ".";
|
||||||
|
}
|
||||||
|
return packageName;
|
||||||
|
}
|
||||||
|
|
||||||
public List<ClassOrInterface> getAllAvailableClasses() {
|
public List<ClassOrInterface> getAllAvailableClasses() {
|
||||||
List<ClassOrInterface> ret = new ArrayList<>();
|
List<ClassOrInterface> ret = new ArrayList<>();
|
||||||
for(Class c : new PackageCrawler(librarys).getAllAvailableClasses()){
|
for(Class c : new PackageCrawler(librarys).getAllAvailableClasses()){
|
||||||
|
@@ -0,0 +1,45 @@
|
|||||||
|
package de.dhbwstuttgart.environment;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class DirectoryClassLoader {
|
||||||
|
private final URLClassLoader classLoader;
|
||||||
|
|
||||||
|
public DirectoryClassLoader(File directory, java.lang.ClassLoader parent) {
|
||||||
|
classLoader = new URLClassLoader(generateURLArray(dirToURL(directory)), parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectoryClassLoader(List<File> directory, java.lang.ClassLoader parent) {
|
||||||
|
classLoader = new URLClassLoader(directory.stream().map(DirectoryClassLoader::dirToURL).collect(Collectors.toList()).toArray(new URL[0]), parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectoryClassLoader(File directory, DirectoryClassLoader parent) {
|
||||||
|
classLoader = new URLClassLoader(generateURLArray(dirToURL(directory)), parent.classLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectoryClassLoader(List<File> directory, DirectoryClassLoader parent) {
|
||||||
|
classLoader = new URLClassLoader(directory.stream().map(DirectoryClassLoader::dirToURL).collect(Collectors.toList()).toArray(new URL[0]), parent.classLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static URL[] generateURLArray(URL url) {
|
||||||
|
return new URL[]{url};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static URL dirToURL(File url){
|
||||||
|
if(!url.isDirectory())throw new RuntimeException(url.toString() + " is not a directory");
|
||||||
|
try {
|
||||||
|
return url.toURI().toURL();
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class loadClass(String className) throws ClassNotFoundException {
|
||||||
|
return classLoader.loadClass(className);
|
||||||
|
}
|
||||||
|
}
|
@@ -26,11 +26,11 @@ public class PackageCrawler {
|
|||||||
|
|
||||||
public Set<Class<?>> getClassesInPackage(String packageName){
|
public Set<Class<?>> getClassesInPackage(String packageName){
|
||||||
/*
|
/*
|
||||||
List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
|
List<DirectoryClassLoader> classLoadersList = new LinkedList<DirectoryClassLoader>();
|
||||||
classLoadersList.add(Thread.currentThread().getContextClassLoader());
|
classLoadersList.add(Thread.currentThread().getContextClassLoader());
|
||||||
classLoadersList.add(ClasspathHelper.staticClassLoader());
|
classLoadersList.add(ClasspathHelper.staticClassLoader());
|
||||||
classLoadersList.add(Thread.currentThread().getContextClassLoader().getParent());
|
classLoadersList.add(Thread.currentThread().getContextClassLoader().getParent());
|
||||||
classLoadersList.add(ClassLoader.getSystemClassLoader());
|
classLoadersList.add(DirectoryClassLoader.getSystemClassLoader());
|
||||||
String bootClassPath = System.getProperty("sun.boot.class.path");
|
String bootClassPath = System.getProperty("sun.boot.class.path");
|
||||||
ArrayList<URL> urlList = new ArrayList<>();
|
ArrayList<URL> urlList = new ArrayList<>();
|
||||||
for(String path : bootClassPath.split(";")) {
|
for(String path : bootClassPath.split(";")) {
|
||||||
@@ -41,7 +41,7 @@ public class PackageCrawler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
URL[] urls = urlList.toArray(new URL[0]);
|
URL[] urls = urlList.toArray(new URL[0]);
|
||||||
classLoadersList.add(new URLClassLoader(urls, ClassLoader.getSystemClassLoader()));
|
classLoadersList.add(new URLClassLoader(urls, DirectoryClassLoader.getSystemClassLoader()));
|
||||||
*/
|
*/
|
||||||
Reflections reflections = new Reflections(new ConfigurationBuilder()
|
Reflections reflections = new Reflections(new ConfigurationBuilder()
|
||||||
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
|
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.DirectoryClassLoader;
|
||||||
import de.dhbwstuttgart.exceptions.DebugException;
|
import de.dhbwstuttgart.exceptions.DebugException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
@@ -22,16 +23,16 @@ public class FCGenerator {
|
|||||||
*
|
*
|
||||||
* @param availableClasses - Alle geparsten Klassen
|
* @param availableClasses - Alle geparsten Klassen
|
||||||
*/
|
*/
|
||||||
public static Set<UnifyPair> toUnifyFC(Collection<ClassOrInterface> availableClasses) throws ClassNotFoundException {
|
public static Set<UnifyPair> toUnifyFC(Collection<ClassOrInterface> availableClasses, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
return toFC(availableClasses).stream().map(t -> UnifyTypeFactory.convert(t)).collect(Collectors.toSet());
|
return toFC(availableClasses, classLoader).stream().map(t -> UnifyTypeFactory.convert(t)).collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Set<Pair> toFC(Collection<ClassOrInterface> availableClasses) throws ClassNotFoundException {
|
public static Set<Pair> toFC(Collection<ClassOrInterface> availableClasses, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
HashSet<Pair> pairs = new HashSet<>();
|
HashSet<Pair> pairs = new HashSet<>();
|
||||||
//PL 2018-09-18: gtvs vor die for-Schleife gezogen, damit immer die gleichen Typeplaceholder eingesetzt werden.
|
//PL 2018-09-18: gtvs vor die for-Schleife gezogen, damit immer die gleichen Typeplaceholder eingesetzt werden.
|
||||||
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> gtvs = new HashMap<>();
|
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> gtvs = new HashMap<>();
|
||||||
for(ClassOrInterface cly : availableClasses){
|
for(ClassOrInterface cly : availableClasses){
|
||||||
pairs.addAll(getSuperTypes(cly, availableClasses, gtvs));
|
pairs.addAll(getSuperTypes(cly, availableClasses, gtvs, classLoader));
|
||||||
}
|
}
|
||||||
return pairs;
|
return pairs;
|
||||||
}
|
}
|
||||||
@@ -48,8 +49,8 @@ public class FCGenerator {
|
|||||||
* @param forType
|
* @param forType
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private static List<Pair> getSuperTypes(ClassOrInterface forType, Collection<ClassOrInterface> availableClasses) throws ClassNotFoundException {
|
private static List<Pair> getSuperTypes(ClassOrInterface forType, Collection<ClassOrInterface> availableClasses, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
return getSuperTypes(forType, availableClasses, new HashMap<>());
|
return getSuperTypes(forType, availableClasses, new HashMap<>(), classLoader);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,7 +62,7 @@ public class FCGenerator {
|
|||||||
* @throws ClassNotFoundException
|
* @throws ClassNotFoundException
|
||||||
*/
|
*/
|
||||||
private static List<Pair> getSuperTypes(ClassOrInterface forType, Collection<ClassOrInterface> availableClasses,
|
private static List<Pair> getSuperTypes(ClassOrInterface forType, Collection<ClassOrInterface> availableClasses,
|
||||||
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> gtvs) throws ClassNotFoundException {
|
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> gtvs, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
||||||
//Die GTVs, die in forType hinzukommen:
|
//Die GTVs, die in forType hinzukommen:
|
||||||
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> newGTVs = new HashMap<>();
|
HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> newGTVs = new HashMap<>();
|
||||||
@@ -86,7 +87,7 @@ public class FCGenerator {
|
|||||||
ClassOrInterface superClass;
|
ClassOrInterface superClass;
|
||||||
if(!hasSuperclass.isPresent()) //Wenn es die Klasse in den available Klasses nicht gibt wird sie im Classpath gesucht. Ansonsten Exception
|
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()));
|
superClass = ASTFactory.createClass(classLoader.loadClass(superType.getName().toString()));
|
||||||
}else{
|
}else{
|
||||||
superClass = hasSuperclass.get();
|
superClass = hasSuperclass.get();
|
||||||
}
|
}
|
||||||
@@ -120,7 +121,7 @@ public class FCGenerator {
|
|||||||
if(superClass.getClassName().equals(ASTFactory.createObjectClass().getClassName())){
|
if(superClass.getClassName().equals(ASTFactory.createObjectClass().getClassName())){
|
||||||
superTypes = Arrays.asList(new Pair(ASTFactory.createObjectType(), ASTFactory.createObjectType(), PairOperator.SMALLER));
|
superTypes = Arrays.asList(new Pair(ASTFactory.createObjectType(), ASTFactory.createObjectType(), PairOperator.SMALLER));
|
||||||
}else{
|
}else{
|
||||||
superTypes = getSuperTypes(superClass, availableClasses, newGTVs);
|
superTypes = getSuperTypes(superClass, availableClasses, newGTVs, classLoader);
|
||||||
}
|
}
|
||||||
|
|
||||||
retList.add(ret);
|
retList.add(ret);
|
||||||
|
@@ -17,6 +17,7 @@ import org.antlr.v4.runtime.Token;
|
|||||||
import org.antlr.v4.runtime.tree.TerminalNode;
|
import org.antlr.v4.runtime.tree.TerminalNode;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class StatementGenerator {
|
public class StatementGenerator {
|
||||||
|
|
||||||
@@ -209,7 +210,12 @@ public class StatementGenerator {
|
|||||||
}else throw new NotImplementedException();
|
}else throw new NotImplementedException();
|
||||||
|
|
||||||
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
||||||
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), getReceiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes = argumentList.getArguments().stream()
|
||||||
|
.map(x -> TypePlaceholder.fresh(methodInvocationContext.getStart()))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()),
|
||||||
|
getReceiver(receiver), name, argumentList, TypePlaceholder.fresh(methodInvocationContext.getStart()),
|
||||||
|
argTypes, methodInvocationContext.getStart());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,9 +285,24 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Statement convert(Java8Parser.ClassInstanceCreationExpressionContext stmt) {
|
private Statement convert(Java8Parser.ClassInstanceCreationExpressionContext newExpression) {
|
||||||
//TODO
|
Java8Parser.TypeArgumentsContext genericArgs = null;
|
||||||
throw new NotImplementedException();
|
if(newExpression.expressionName()!= null)throw new NotImplementedException();
|
||||||
|
if(newExpression.typeArgumentsOrDiamond()!= null){
|
||||||
|
if(newExpression.typeArgumentsOrDiamond().typeArguments()!=null){
|
||||||
|
genericArgs = newExpression.typeArgumentsOrDiamond().typeArguments();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(newExpression.typeArguments()!= null)throw new NotImplementedException();
|
||||||
|
|
||||||
|
TerminalNode identifier = newExpression.Identifier(0);
|
||||||
|
RefType newClass = (RefType) TypeGenerator.convertTypeName(identifier.getText(),genericArgs,identifier.getSymbol(),reg,generics);
|
||||||
|
|
||||||
|
ArgumentList args = convert(newExpression.argumentList());
|
||||||
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes = args.getArguments().stream()
|
||||||
|
.map(x -> TypePlaceholder.fresh(newExpression.getStart()))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
return new NewClass(newClass, args, null, argTypes, newExpression.getStart());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.PreIncrementExpressionContext stmt) {
|
private Statement convert(Java8Parser.PreIncrementExpressionContext stmt) {
|
||||||
@@ -767,7 +788,11 @@ public class StatementGenerator {
|
|||||||
}else {
|
}else {
|
||||||
Java8Parser.MethodInvocation_lf_primaryContext ctxt = e.methodInvocation_lf_primary();
|
Java8Parser.MethodInvocation_lf_primaryContext ctxt = e.methodInvocation_lf_primary();
|
||||||
String methodName = ctxt.Identifier().toString();
|
String methodName = ctxt.Identifier().toString();
|
||||||
return new MethodCall(TypePlaceholder.fresh(e.getStart()), getReceiver(expr), methodName, convert(ctxt.argumentList()), e.getStart());
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes = ctxt.argumentList().expression().stream()
|
||||||
|
.map(x -> TypePlaceholder.fresh(e.getStart()))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
return new MethodCall(TypePlaceholder.fresh(e.getStart()), getReceiver(expr), methodName,
|
||||||
|
convert(ctxt.argumentList()), TypePlaceholder.fresh(e.getStart()), argTypes, e.getStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -821,7 +846,10 @@ public class StatementGenerator {
|
|||||||
RefType newClass = (RefType) TypeGenerator.convertTypeName(identifier.getText(),genericArgs,identifier.getSymbol(),reg,generics);
|
RefType newClass = (RefType) TypeGenerator.convertTypeName(identifier.getText(),genericArgs,identifier.getSymbol(),reg,generics);
|
||||||
|
|
||||||
ArgumentList args = convert(newExpression.argumentList());
|
ArgumentList args = convert(newExpression.argumentList());
|
||||||
return new NewClass(newClass, args, newExpression.getStart());
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes = args.getArguments().stream()
|
||||||
|
.map(x -> TypePlaceholder.fresh(newExpression.getStart()))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
return new NewClass(newClass, args, null, argTypes, newExpression.getStart());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Expression convert(Java8Parser.LiteralContext literal) {
|
private Expression convert(Java8Parser.LiteralContext literal) {
|
||||||
@@ -879,7 +907,12 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
||||||
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), getReceiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes = argumentList.getArguments().stream()
|
||||||
|
.map(x -> TypePlaceholder.fresh(methodInvocationContext.getStart()))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()),
|
||||||
|
getReceiver(receiver), name, argumentList, TypePlaceholder.fresh(methodInvocationContext.getStart()),
|
||||||
|
argTypes, methodInvocationContext.getStart());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.DirectoryClassLoader;
|
||||||
import de.dhbwstuttgart.environment.PackageCrawler;
|
import de.dhbwstuttgart.environment.PackageCrawler;
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import java.lang.ClassNotFoundException;
|
import java.lang.ClassNotFoundException;
|
||||||
@@ -19,6 +20,7 @@ import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.net.URL;
|
||||||
import java.sql.Ref;
|
import java.sql.Ref;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -35,7 +37,7 @@ public class SyntaxTreeGenerator{
|
|||||||
Set<JavaClassName> imports = new HashSet();
|
Set<JavaClassName> imports = new HashSet();
|
||||||
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> fields = new HashMap<>(); //PL 2018-11-01 fields eingefuegt, damit die fields immer die gleiche TPH bekommen
|
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> fields = new HashMap<>(); //PL 2018-11-01 fields eingefuegt, damit die fields immer die gleiche TPH bekommen
|
||||||
|
|
||||||
List<Statement> fieldInitializations = new ArrayList<>();
|
List<Statement> fieldInitializations = new ArrayList<>(); //PL 2019-10-23: Muss für jede Klasse neu initilisiert werden
|
||||||
|
|
||||||
public SyntaxTreeGenerator(JavaClassRegistry reg, GenericsRegistry globalGenerics){
|
public SyntaxTreeGenerator(JavaClassRegistry reg, GenericsRegistry globalGenerics){
|
||||||
//Die Generics müssen während des Bauens des AST erstellt werden,
|
//Die Generics müssen während des Bauens des AST erstellt werden,
|
||||||
@@ -74,10 +76,10 @@ public class SyntaxTreeGenerator{
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SourceFile convert(Java8Parser.CompilationUnitContext ctx, PackageCrawler packageCrawler) throws ClassNotFoundException{
|
public SourceFile convert(Java8Parser.CompilationUnitContext ctx, PackageCrawler packageCrawler, DirectoryClassLoader classLoader) throws ClassNotFoundException{
|
||||||
if(ctx.packageDeclaration()!=null)this.pkgName = convert(ctx.packageDeclaration());
|
if(ctx.packageDeclaration()!=null)this.pkgName = convert(ctx.packageDeclaration());
|
||||||
List<ClassOrInterface> classes = new ArrayList<>();
|
List<ClassOrInterface> classes = new ArrayList<>();
|
||||||
Map<String, Integer> imports = GatherNames.getImports(ctx, packageCrawler);
|
Map<String, Integer> imports = GatherNames.getImports(ctx, packageCrawler, classLoader);
|
||||||
this.imports = imports.keySet().stream().map(name -> reg.getName(name)).collect(Collectors.toSet());
|
this.imports = imports.keySet().stream().map(name -> reg.getName(name)).collect(Collectors.toSet());
|
||||||
for(Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
for(Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
||||||
ClassOrInterface newClass;
|
ClassOrInterface newClass;
|
||||||
@@ -159,6 +161,7 @@ public class SyntaxTreeGenerator{
|
|||||||
|
|
||||||
private ClassOrInterface convertClass(Java8Parser.ClassDeclarationContext ctx) {
|
private ClassOrInterface convertClass(Java8Parser.ClassDeclarationContext ctx) {
|
||||||
ClassOrInterface newClass;
|
ClassOrInterface newClass;
|
||||||
|
fieldInitializations = new ArrayList<>(); //PL 2019-10-22: muss für jede Klasse neu initilisiert werden
|
||||||
if(ctx.normalClassDeclaration() != null){
|
if(ctx.normalClassDeclaration() != null){
|
||||||
newClass = convertNormal(ctx.normalClassDeclaration());
|
newClass = convertNormal(ctx.normalClassDeclaration());
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
package de.dhbwstuttgart.parser.scope;
|
package de.dhbwstuttgart.parser.scope;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.net.URL;
|
||||||
import java.util.HashMap;
|
import java.net.URLClassLoader;
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.DirectoryClassLoader;
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8BaseListener;
|
import de.dhbwstuttgart.parser.antlr.Java8BaseListener;
|
||||||
import de.dhbwstuttgart.syntaxtree.AbstractASTWalker;
|
import de.dhbwstuttgart.syntaxtree.AbstractASTWalker;
|
||||||
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
|
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
|
||||||
|
import org.antlr.v4.runtime.tree.ParseTreeWalker;
|
||||||
import org.antlr.v4.runtime.tree.TerminalNode;
|
import org.antlr.v4.runtime.tree.TerminalNode;
|
||||||
|
|
||||||
import de.dhbwstuttgart.environment.PackageCrawler;
|
import de.dhbwstuttgart.environment.PackageCrawler;
|
||||||
@@ -15,7 +16,7 @@ import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
|||||||
|
|
||||||
public class GatherNames {
|
public class GatherNames {
|
||||||
|
|
||||||
public static Map<String, Integer> getNames(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages) throws ClassNotFoundException{
|
public static Map<String, Integer> getNames(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages, DirectoryClassLoader classLoader) throws ClassNotFoundException{
|
||||||
Map<String, Integer> ret = new HashMap<>();
|
Map<String, Integer> ret = new HashMap<>();
|
||||||
String pkgName = getPackageName(ctx);
|
String pkgName = getPackageName(ctx);
|
||||||
String nameString = "";
|
String nameString = "";
|
||||||
@@ -64,14 +65,12 @@ public class GatherNames {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret.putAll(getImports(ctx, packages));
|
ret.putAll(getImports(ctx, packages, classLoader));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Map<String, Integer> getImports(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
public static Map<String, Integer> getImports(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages) throws ClassNotFoundException {
|
|
||||||
Map<String, Integer> ret = new HashMap<>();
|
Map<String, Integer> 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()){
|
for(Java8Parser.ImportDeclarationContext importDeclCtx : ctx.importDeclaration()){
|
||||||
if(importDeclCtx.singleTypeImportDeclaration() != null){
|
if(importDeclCtx.singleTypeImportDeclaration() != null){
|
||||||
|
@@ -84,7 +84,15 @@ public class JavaClassName {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return (packageName!=null ? packageName.toString() : "") + name;
|
return (packageName!=null ? packageName.toString() + "." : "") + name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPackageName() {
|
||||||
|
return (packageName!=null ? packageName.toString() : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClassName(){
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,6 +138,9 @@ class PackageName{
|
|||||||
String ret = "";
|
String ret = "";
|
||||||
if(names == null)return "";
|
if(names == null)return "";
|
||||||
for(String n : names)ret+=n+".";
|
for(String n : names)ret+=n+".";
|
||||||
|
if (ret != null && ret.length() > 0 && ret.charAt(ret.length() - 1) == '.') {
|
||||||
|
ret = ret.substring(0, ret.length() - 1);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package de.dhbwstuttgart.sat.asp.writer;
|
package de.dhbwstuttgart.sat.asp.writer;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.DirectoryClassLoader;
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator;
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator;
|
||||||
import de.dhbwstuttgart.sat.asp.ASPStringConverter;
|
import de.dhbwstuttgart.sat.asp.ASPStringConverter;
|
||||||
@@ -16,9 +17,9 @@ import java.util.*;
|
|||||||
|
|
||||||
public class ASPFactory implements TypeVisitor<String>{
|
public class ASPFactory implements TypeVisitor<String>{
|
||||||
|
|
||||||
public static String generateASP(ConstraintSet<Pair> constraints, Collection<ClassOrInterface> fcClasses) throws ClassNotFoundException{
|
public static String generateASP(ConstraintSet<Pair> constraints, Collection<ClassOrInterface> fcClasses, DirectoryClassLoader classLoader) throws ClassNotFoundException{
|
||||||
ASPFactory factory = new ASPFactory();
|
ASPFactory factory = new ASPFactory();
|
||||||
factory.convertFC(fcClasses);
|
factory.convertFC(fcClasses, classLoader);
|
||||||
List<Constraint<Pair>> constraints1 = constraints.cartesianProduct().iterator().next();
|
List<Constraint<Pair>> constraints1 = constraints.cartesianProduct().iterator().next();
|
||||||
for(Constraint<Pair> constraint : constraints1){
|
for(Constraint<Pair> constraint : constraints1){
|
||||||
for(Pair p : constraint){
|
for(Pair p : constraint){
|
||||||
@@ -32,8 +33,8 @@ public class ASPFactory implements TypeVisitor<String>{
|
|||||||
ASPWriter writer = new ASPWriter();
|
ASPWriter writer = new ASPWriter();
|
||||||
boolean isFCType = false;
|
boolean isFCType = false;
|
||||||
|
|
||||||
private void convertFC(Collection<ClassOrInterface> classes) throws ClassNotFoundException {
|
private void convertFC(Collection<ClassOrInterface> classes, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
Set<Pair> fc = FCGenerator.toFC(classes);
|
Set<Pair> fc = FCGenerator.toFC(classes, classLoader);
|
||||||
isFCType = true;
|
isFCType = true;
|
||||||
for(Pair fcp : fc){
|
for(Pair fcp : fc){
|
||||||
convertPair(fcp);
|
convertPair(fcp);
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package de.dhbwstuttgart.sat.asp.writer;
|
package de.dhbwstuttgart.sat.asp.writer;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.DirectoryClassLoader;
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator;
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.FCGenerator;
|
||||||
import de.dhbwstuttgart.sat.asp.ASPStringConverter;
|
import de.dhbwstuttgart.sat.asp.ASPStringConverter;
|
||||||
@@ -55,9 +56,9 @@ public class ASPGencayFactory implements TypeVisitor<String> {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String generateASP(ConstraintSet<Pair> constraints, Collection<ClassOrInterface> fcClasses) throws ClassNotFoundException{
|
public static String generateASP(ConstraintSet<Pair> constraints, Collection<ClassOrInterface> fcClasses, DirectoryClassLoader classLoader) throws ClassNotFoundException{
|
||||||
ASPGencayFactory factory = new ASPGencayFactory();
|
ASPGencayFactory factory = new ASPGencayFactory();
|
||||||
factory.convertFC(fcClasses);
|
factory.convertFC(fcClasses, classLoader);
|
||||||
List<Constraint<Pair>> constraints1 = constraints.cartesianProduct().iterator().next();
|
List<Constraint<Pair>> constraints1 = constraints.cartesianProduct().iterator().next();
|
||||||
for(Constraint<Pair> constraint : constraints1){
|
for(Constraint<Pair> constraint : constraints1){
|
||||||
for(Pair p : constraint){
|
for(Pair p : constraint){
|
||||||
@@ -69,8 +70,8 @@ public class ASPGencayFactory implements TypeVisitor<String> {
|
|||||||
return factory.writer.getASPFile();
|
return factory.writer.getASPFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void convertFC(Collection<ClassOrInterface> classes) throws ClassNotFoundException {
|
private void convertFC(Collection<ClassOrInterface> classes, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
Set<Pair> fc = FCGenerator.toFC(classes);
|
Set<Pair> fc = FCGenerator.toFC(classes, classLoader);
|
||||||
isFCType = true;
|
isFCType = true;
|
||||||
for(Pair fcp : fc){
|
for(Pair fcp : fc){
|
||||||
generateTheta((RefType) fcp.TA1);
|
generateTheta((RefType) fcp.TA1);
|
||||||
|
@@ -34,6 +34,7 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
|
|||||||
private List<RefType> implementedInterfaces;
|
private List<RefType> implementedInterfaces;
|
||||||
private List<Constructor> constructors;
|
private List<Constructor> constructors;
|
||||||
|
|
||||||
|
|
||||||
public ClassOrInterface(int modifiers, JavaClassName name, List<Field> fielddecl, Optional<Constructor> fieldInitializations, List<Method> methods, List<Constructor> constructors, GenericDeclarationList genericClassParameters,
|
public ClassOrInterface(int modifiers, JavaClassName name, List<Field> fielddecl, Optional<Constructor> fieldInitializations, List<Method> methods, List<Constructor> constructors, GenericDeclarationList genericClassParameters,
|
||||||
RefType superClass, Boolean isInterface, List<RefType> implementedInterfaces, Token offset){
|
RefType superClass, Boolean isInterface, List<RefType> implementedInterfaces, Token offset){
|
||||||
super(offset);
|
super(offset);
|
||||||
@@ -50,6 +51,23 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
|
|||||||
this.constructors = constructors;
|
this.constructors = constructors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* erzeugt fuer Fields, Konstruktoren und Methoden neue ArrayList-Objekte
|
||||||
|
* alle anderen Datenobjekte werden nur kopiert.
|
||||||
|
*/
|
||||||
|
public ClassOrInterface(ClassOrInterface cl){
|
||||||
|
super(cl.getOffset());
|
||||||
|
this.modifiers = cl.modifiers;
|
||||||
|
this.name = cl.name;
|
||||||
|
this.fields = new ArrayList<>(cl.fields);
|
||||||
|
this.fieldInitializations= cl.fieldInitializations;
|
||||||
|
this.genericClassParameters = cl.genericClassParameters;
|
||||||
|
this.superClass = cl.superClass;
|
||||||
|
this.isInterface = cl.isInterface;
|
||||||
|
this.implementedInterfaces = cl.implementedInterfaces;
|
||||||
|
this.methods = new ArrayList<>(cl.methods);
|
||||||
|
this.constructors = new ArrayList<>(cl.constructors);
|
||||||
|
}
|
||||||
|
|
||||||
// Gets class name
|
// Gets class name
|
||||||
public JavaClassName getClassName(){
|
public JavaClassName getClassName(){
|
||||||
return this.name;
|
return this.name;
|
||||||
|
@@ -27,7 +27,7 @@ public class Constructor extends Method {
|
|||||||
*/
|
*/
|
||||||
protected static Block prepareBlock(Block constructorBlock /*, List<Statement> fieldInitializations new ArrayList<>() geloescht PL 2018-11-24 */){
|
protected static Block prepareBlock(Block constructorBlock /*, List<Statement> fieldInitializations new ArrayList<>() geloescht PL 2018-11-24 */){
|
||||||
List<Statement> statements = constructorBlock.getStatements();
|
List<Statement> statements = constructorBlock.getStatements();
|
||||||
statements.add(0, new SuperCall(constructorBlock.getOffset()));
|
statements.add(0, new SuperCall(null, null, constructorBlock.getOffset()));
|
||||||
/* statements.addAll(fieldInitializations); geloescht PL 2018-11-24 */
|
/* statements.addAll(fieldInitializations); geloescht PL 2018-11-24 */
|
||||||
return new Block(statements, constructorBlock.getOffset());
|
return new Block(statements, constructorBlock.getOffset());
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,10 @@ package de.dhbwstuttgart.syntaxtree;
|
|||||||
|
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
@@ -16,10 +20,20 @@ public class GenericDeclarationList extends SyntaxTreeNode implements Iterable<G
|
|||||||
private Token offsetOfLastElement;
|
private Token offsetOfLastElement;
|
||||||
private List<GenericTypeVar> gtvs = new ArrayList<>();
|
private List<GenericTypeVar> gtvs = new ArrayList<>();
|
||||||
|
|
||||||
public GenericDeclarationList(List<GenericTypeVar> values, Token endOffset) {
|
@SuppressWarnings("unchecked")
|
||||||
|
public GenericDeclarationList(Iterable<? extends GenericTypeVar> values, Token endOffset) {
|
||||||
|
super(endOffset);
|
||||||
|
gtvs = isListOfGenericTypeVar(values) ? (List<GenericTypeVar>)values : Lists.newArrayList(values);
|
||||||
|
this.offsetOfLastElement = endOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenericDeclarationList(ArrayList<GenericTypeVar> values, Token endOffset) {
|
||||||
super(endOffset);
|
super(endOffset);
|
||||||
gtvs = values;
|
gtvs = values;
|
||||||
this.offsetOfLastElement = endOffset;
|
this.offsetOfLastElement = endOffset; }
|
||||||
|
|
||||||
|
private boolean isListOfGenericTypeVar(Iterable<? extends GenericTypeVar> values) {
|
||||||
|
return values instanceof List && ((List<?>)values).size() > 0 && ((List<?>)values).get(0) instanceof GenericTypeVar;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -26,6 +26,13 @@ public class SourceFile extends SyntaxTreeNode{
|
|||||||
this.imports = imports;
|
this.imports = imports;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SourceFile(SourceFile sf) {
|
||||||
|
super(new NullToken());
|
||||||
|
this.KlassenVektor = new ArrayList<>(sf.KlassenVektor);
|
||||||
|
this.imports = new HashSet<>(sf.imports);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getPkgName(){
|
public String getPkgName(){
|
||||||
return this.pkgName;
|
return this.pkgName;
|
||||||
}
|
}
|
||||||
|
@@ -70,7 +70,7 @@ public class ASTFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Field createField(java.lang.reflect.Field field, JavaClassName jreClass) {
|
private static Field createField(java.lang.reflect.Field field, JavaClassName jreClass) {
|
||||||
return new Field(field.getName(), createType(field.getType()), field.getModifiers(), new NullToken());
|
return new Field(field.getName(), createType(field.getGenericType()), field.getModifiers(), new NullToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
//private static RefType createType(Class classType) {
|
//private static RefType createType(Class classType) {
|
||||||
@@ -189,11 +189,11 @@ public class ASTFactory {
|
|||||||
|
|
||||||
public static de.dhbwstuttgart.syntaxtree.GenericTypeVar createGeneric(TypeVariable jreTypeVar, String jreTVName, Class context, String parentMethod){
|
public static de.dhbwstuttgart.syntaxtree.GenericTypeVar createGeneric(TypeVariable jreTypeVar, String jreTVName, Class context, String parentMethod){
|
||||||
JavaClassName parentClass = new JavaClassName(context.getName());
|
JavaClassName parentClass = new JavaClassName(context.getName());
|
||||||
List<RefType> genericBounds = new ArrayList<>();
|
List<RefTypeOrTPHOrWildcardOrGeneric> genericBounds = new ArrayList<>();
|
||||||
java.lang.reflect.Type[] bounds = jreTypeVar.getBounds();
|
java.lang.reflect.Type[] bounds = jreTypeVar.getBounds();
|
||||||
if(bounds.length > 0){
|
if(bounds.length > 0){
|
||||||
for(java.lang.reflect.Type bound : bounds){
|
for(java.lang.reflect.Type bound : bounds){
|
||||||
genericBounds.add((RefType) createType(bound));
|
genericBounds.add(createType(bound));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new de.dhbwstuttgart.syntaxtree.GenericTypeVar(jreTVName, genericBounds, new NullToken(), new NullToken());
|
return new de.dhbwstuttgart.syntaxtree.GenericTypeVar(jreTVName, genericBounds, new NullToken(), new NullToken());
|
||||||
|
@@ -7,6 +7,7 @@ import java.util.regex.Matcher;
|
|||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.DirectoryClassLoader;
|
||||||
import de.dhbwstuttgart.exceptions.DebugException;
|
import de.dhbwstuttgart.exceptions.DebugException;
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
@@ -31,7 +32,7 @@ public class UnifyTypeFactory {
|
|||||||
|
|
||||||
private static ArrayList<PlaceholderType> PLACEHOLDERS = new ArrayList<>();
|
private static ArrayList<PlaceholderType> PLACEHOLDERS = new ArrayList<>();
|
||||||
|
|
||||||
public static FiniteClosure generateFC(List<ClassOrInterface> fromClasses, Writer logFile) throws ClassNotFoundException {
|
public static FiniteClosure generateFC(List<ClassOrInterface> fromClasses, Writer logFile, DirectoryClassLoader classLoader) throws ClassNotFoundException {
|
||||||
/*
|
/*
|
||||||
Die transitive Hülle muss funktionieren.
|
Die transitive Hülle muss funktionieren.
|
||||||
Man darf schreiben List<A> extends AL<A>
|
Man darf schreiben List<A> extends AL<A>
|
||||||
@@ -42,7 +43,7 @@ public class UnifyTypeFactory {
|
|||||||
Generell dürfen sie immer die gleichen Namen haben.
|
Generell dürfen sie immer die gleichen Namen haben.
|
||||||
TODO: die transitive Hülle bilden
|
TODO: die transitive Hülle bilden
|
||||||
*/
|
*/
|
||||||
return new FiniteClosure(FCGenerator.toUnifyFC(fromClasses), logFile);
|
return new FiniteClosure(FCGenerator.toUnifyFC(fromClasses, classLoader), logFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UnifyPair generateSmallerPair(UnifyType tl, UnifyType tr){
|
public static UnifyPair generateSmallerPair(UnifyType tl, UnifyType tr){
|
||||||
@@ -122,6 +123,7 @@ public class UnifyTypeFactory {
|
|||||||
System.out.println("XXX"+innerType);
|
System.out.println("XXX"+innerType);
|
||||||
}
|
}
|
||||||
PlaceholderType ntph = new PlaceholderType(tph.getName());
|
PlaceholderType ntph = new PlaceholderType(tph.getName());
|
||||||
|
ntph.setVariance(tph.getVariance());
|
||||||
int in = PLACEHOLDERS.indexOf(ntph);
|
int in = PLACEHOLDERS.indexOf(ntph);
|
||||||
if (in == -1) {
|
if (in == -1) {
|
||||||
PLACEHOLDERS.add(ntph);
|
PLACEHOLDERS.add(ntph);
|
||||||
|
@@ -21,13 +21,24 @@ public class MethodCall extends Statement
|
|||||||
{
|
{
|
||||||
public final String name;
|
public final String name;
|
||||||
public final Receiver receiver;
|
public final Receiver receiver;
|
||||||
|
|
||||||
public final ArgumentList arglist;
|
public final ArgumentList arglist;
|
||||||
|
|
||||||
public MethodCall(RefTypeOrTPHOrWildcardOrGeneric retType, Receiver receiver, String methodName, ArgumentList argumentList, Token offset){
|
/*
|
||||||
|
* noetig fuer Bytecodegenerierung
|
||||||
|
*/
|
||||||
|
public RefTypeOrTPHOrWildcardOrGeneric receiverType;
|
||||||
|
public final ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes;
|
||||||
|
|
||||||
|
|
||||||
|
public MethodCall(RefTypeOrTPHOrWildcardOrGeneric retType, Receiver receiver, String methodName, ArgumentList argumentList,
|
||||||
|
RefTypeOrTPHOrWildcardOrGeneric receiverType, ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes, Token offset){
|
||||||
super(retType,offset);
|
super(retType,offset);
|
||||||
this.arglist = argumentList;
|
this.arglist = argumentList;
|
||||||
this.name = methodName;
|
this.name = methodName;
|
||||||
this.receiver = receiver;
|
this.receiver = receiver;
|
||||||
|
this.receiverType = receiverType;
|
||||||
|
this.argTypes = argTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -29,8 +29,10 @@ public class NewClass extends MethodCall
|
|||||||
* @param args Argumente mit denen der New-Call aufgerufen wurde
|
* @param args Argumente mit denen der New-Call aufgerufen wurde
|
||||||
* @param start
|
* @param start
|
||||||
*/
|
*/
|
||||||
public NewClass(RefType newClass, ArgumentList args, Token start) {
|
public NewClass(RefType newClass, ArgumentList args, RefTypeOrTPHOrWildcardOrGeneric receiverType,
|
||||||
super(newClass, new ExpressionReceiver(new EmptyStmt(start)), newClass.getName().toString(), args, start);
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes, Token start) {
|
||||||
|
super(newClass, new ExpressionReceiver(new EmptyStmt(start)), newClass.getName().toString(),
|
||||||
|
args, receiverType, argTypes, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -2,6 +2,7 @@ package de.dhbwstuttgart.syntaxtree.statement;
|
|||||||
|
|
||||||
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.Void;
|
import de.dhbwstuttgart.syntaxtree.type.Void;
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
@@ -12,12 +13,14 @@ import java.util.ArrayList;
|
|||||||
|
|
||||||
public class SuperCall extends MethodCall
|
public class SuperCall extends MethodCall
|
||||||
{
|
{
|
||||||
public SuperCall(Token offset){
|
public SuperCall(RefTypeOrTPHOrWildcardOrGeneric receiverType,
|
||||||
this(new ArgumentList(new ArrayList<Expression>(), offset),offset);
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes, Token offset){
|
||||||
|
this(new ArgumentList(new ArrayList<Expression>(), offset), receiverType, argTypes, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SuperCall(ArgumentList argumentList, Token offset){
|
public SuperCall(ArgumentList argumentList, RefTypeOrTPHOrWildcardOrGeneric receiverType,
|
||||||
super(new Void(offset), new ExpressionReceiver(new This(offset)), "<init>", argumentList, offset);
|
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes, Token offset){
|
||||||
|
super(new Void(offset), new ExpressionReceiver(new This(offset)), "<init>", argumentList, receiverType, argTypes, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -19,4 +19,8 @@ public class This extends Expression
|
|||||||
public void accept(StatementVisitor visitor) {
|
public void accept(StatementVisitor visitor) {
|
||||||
visitor.visit(this);
|
visitor.visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "this: "+ this.getType();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,7 @@ public class ThisCall extends MethodCall
|
|||||||
{
|
{
|
||||||
public ThisCall(Receiver receiver, ArgumentList arglist, int offset)
|
public ThisCall(Receiver receiver, ArgumentList arglist, int offset)
|
||||||
{
|
{
|
||||||
super(null, null, null, null, null);
|
super(null, null, null, null, null, null, null);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,6 +19,11 @@ public class TypePlaceholder extends RefTypeOrTPHOrWildcardOrGeneric
|
|||||||
{
|
{
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wird bisher nicht genutzt
|
||||||
|
* setVariance muss ggf. auskommentiert werden.
|
||||||
|
*/
|
||||||
|
int variance = 0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -69,6 +74,16 @@ public class TypePlaceholder extends RefTypeOrTPHOrWildcardOrGeneric
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* wird bisher nicht genutzt
|
||||||
|
public void setVariance(int variance) {
|
||||||
|
this.variance= variance;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getVariance() {
|
||||||
|
return this.variance;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ASTVisitor visitor) {
|
public void accept(ASTVisitor visitor) {
|
||||||
visitor.visit(this);
|
visitor.visit(this);
|
||||||
|
@@ -4,6 +4,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.This;
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultPair;
|
import de.dhbwstuttgart.typeinference.result.ResultPair;
|
||||||
|
|
||||||
public class TypeInsert {
|
public class TypeInsert {
|
||||||
@@ -53,6 +54,11 @@ public class TypeInsert {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<TypeInsertPoint> getAdditionalPoints() {
|
||||||
|
return this.inserts;
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return point.toString();
|
return point.toString();
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,18 @@
|
|||||||
package de.dhbwstuttgart.typedeployment;
|
package de.dhbwstuttgart.typedeployment;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericGenratorResultForSourceFile;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResult;
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericsGeneratorResultForClass;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.MethodUtility;
|
||||||
|
import de.dhbwstuttgart.bytecode.utilities.Resolver;
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.syntaxtree.*;
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.*;
|
import de.dhbwstuttgart.syntaxtree.type.*;
|
||||||
import de.dhbwstuttgart.typeinference.result.*;
|
import de.dhbwstuttgart.typeinference.result.*;
|
||||||
|
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -22,68 +31,98 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public class TypeInsertFactory {
|
public class TypeInsertFactory {
|
||||||
|
|
||||||
|
private static List<ResultSet> newResults;
|
||||||
|
|
||||||
public static Set<TypeInsert> createTypeInsertPoints(SourceFile forSourcefile, ResultSet withResults){
|
public static Set<TypeInsert> createTypeInsertPoints(SourceFile forSourcefile, ResultSet withResults, List<ResultSet> newResults){
|
||||||
|
TypeInsertFactory.newResults = newResults;
|
||||||
return new TypeInsertPlacer().getTypeInserts(forSourcefile, withResults);
|
return new TypeInsertPlacer().getTypeInserts(forSourcefile, withResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TypeInsert createInsertPoints(RefTypeOrTPHOrWildcardOrGeneric type, Token offset, ClassOrInterface cl, Method m,
|
public static TypeInsert createInsertPoints(RefTypeOrTPHOrWildcardOrGeneric type, Token offset, ClassOrInterface cl, Method m,
|
||||||
ResultSet resultSet) {
|
ResultSet resultSet) {
|
||||||
|
|
||||||
|
try {
|
||||||
ResolvedType resolvedType = resultSet.resolveType(type);
|
ResolvedType resolvedType = resultSet.resolveType(type);
|
||||||
TypeInsertPoint insertPoint = new TypeInsertPoint(offset,
|
TypeInsertPoint insertPoint = new TypeInsertPoint(offset,
|
||||||
new TypeToInsertString(resolvedType.resolvedType).insert);
|
new TypeToInsertString(resolvedType.resolvedType).insert);
|
||||||
|
List<GenericGenratorResultForSourceFile> simplifyResults = JavaTXCompiler.INSTANCE.getGeneratedGenericResultsForAllSourceFiles(newResults);
|
||||||
|
for (GenericGenratorResultForSourceFile simplifyResultsEntries : simplifyResults) {
|
||||||
|
GenericsGeneratorResultForClass genericResultsForClass = simplifyResultsEntries.getSimplifyResultsByName(cl.getClassName());
|
||||||
|
return new TypeInsert(insertPoint, createGenericInsert(genericResultsForClass, cl, m, resultSet, offset), resolvedType.getResultPair());
|
||||||
|
}
|
||||||
|
|
||||||
return new TypeInsert(insertPoint, new HashSet<>(), resolvedType.getResultPair());
|
return new TypeInsert(insertPoint, new HashSet<>(), resolvedType.getResultPair());
|
||||||
}
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
private static TypeInsertPoint createGenericInsert(Set<GenericInsertPair> toInsert, ClassOrInterface cl, Method m){
|
return null;
|
||||||
//Momentan wird Methode ignoriert. Parameter werden immer als Klassenparameter angefügt:
|
|
||||||
//Offset zum Einstzen bestimmen:
|
|
||||||
Token offset;
|
|
||||||
String insert = "";
|
|
||||||
String end;
|
|
||||||
if(cl.getGenerics().iterator().hasNext()){
|
|
||||||
//offset = cl.getGenerics().iterator().next().getOffset();
|
|
||||||
offset = cl.getGenerics().getOffset();
|
|
||||||
end=",";
|
|
||||||
}else{
|
|
||||||
offset = cl.getGenerics().getOffset();
|
|
||||||
insert += "<";
|
|
||||||
end = ">";
|
|
||||||
}
|
|
||||||
|
|
||||||
//Alle einzusetzenden Generics und deren Bounds bestimmen:
|
|
||||||
HashMap<TypePlaceholder, HashSet<TypePlaceholder>> genericsAndBounds = new HashMap<>();
|
|
||||||
for(GenericInsertPair p : toInsert){
|
|
||||||
if(!genericsAndBounds.containsKey(p.TA1)){
|
|
||||||
genericsAndBounds.put((TypePlaceholder) p.TA1, new HashSet<>());
|
|
||||||
}
|
|
||||||
if(p.TA2 != null){
|
|
||||||
genericsAndBounds.get(p.TA1).add((TypePlaceholder) p.TA2);
|
|
||||||
if(!genericsAndBounds.containsKey(p.TA2)){
|
|
||||||
genericsAndBounds.put((TypePlaceholder) p.TA2, new HashSet<>());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//String zum Einsetzen (Generics mit bounds) generieren:
|
private static synchronized Set<TypeInsertPoint> createGenericInsert(GenericsGeneratorResultForClass genericResult, ClassOrInterface cl, Method m, ResultSet resultSet, Token mOffset){
|
||||||
Iterator<TypePlaceholder> it = genericsAndBounds.keySet().iterator();
|
Set<TypeInsertPoint> result = createGenericClassInserts(genericResult, cl);
|
||||||
if(! it.hasNext())return new TypeInsertPoint(offset, "");
|
|
||||||
while(it.hasNext()){
|
for (Method method : cl.getMethods()) {
|
||||||
TypePlaceholder tph = it.next();
|
Resolver resolver = new Resolver(resultSet);
|
||||||
insert += tph.getName();
|
List<GenericsGeneratorResult> methodConstraints = genericResult.getMethodConstraintsByID(MethodUtility.createID(resolver, method));
|
||||||
Set<TypePlaceholder> bounds = genericsAndBounds.get(tph);
|
result.addAll(createMethodConstraints(method, methodConstraints, mOffset));
|
||||||
if(bounds.size() > 0){
|
}
|
||||||
insert += " extends ";
|
|
||||||
Iterator<TypePlaceholder> boundIt = bounds.iterator();
|
return result;
|
||||||
while(boundIt.hasNext()){
|
}
|
||||||
TypePlaceholder bound = boundIt.next();
|
|
||||||
insert += bound.getName();
|
private static Set<TypeInsertPoint> createMethodConstraints(Method method, List<GenericsGeneratorResult> constraints, Token mOffset) {
|
||||||
if(boundIt.hasNext())insert += " & ";
|
Set<TypeInsertPoint> result = new HashSet<>();
|
||||||
|
Token offset = mOffset;
|
||||||
|
|
||||||
|
if (constraints.size() == 0) {
|
||||||
|
result.add(new TypeInsertPoint(offset, ""));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
String insert = " <";
|
||||||
|
|
||||||
|
for (GenericsGeneratorResult genericInsertConstraint : constraints) {
|
||||||
|
if (genericInsertConstraint.getConstraint().getRight().equals(Type.getInternalName(Object.class))) {
|
||||||
|
insert += genericInsertConstraint.getConstraint().getLeft();
|
||||||
|
} else {
|
||||||
|
insert += genericInsertConstraint.getConstraint().getLeft() + " extends " + genericInsertConstraint.getConstraint().getRight() + ", ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(it.hasNext())insert+=",";
|
|
||||||
|
insert = insert.substring(0, insert.length() -2);
|
||||||
|
insert += ">";
|
||||||
|
|
||||||
|
result.add(new TypeInsertPoint(offset, insert));
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
return new TypeInsertPoint(offset, insert + end);
|
|
||||||
|
private static Set<TypeInsertPoint> createGenericClassInserts(GenericsGeneratorResultForClass genericResult, ClassOrInterface cl) {
|
||||||
|
Set<TypeInsertPoint> result = new HashSet<>();
|
||||||
|
Token offset = cl.getGenerics().getOffset();
|
||||||
|
|
||||||
|
List<GenericsGeneratorResult> classConstraints = genericResult.getClassConstraints();
|
||||||
|
|
||||||
|
if (classConstraints.size() == 0) {
|
||||||
|
result.add(new TypeInsertPoint(offset, ""));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
String insert = " <";
|
||||||
|
|
||||||
|
for (GenericsGeneratorResult genericInsertConstraint : classConstraints) {
|
||||||
|
if (genericInsertConstraint.getConstraint().getRight().equals(Type.getInternalName(Object.class))) {
|
||||||
|
insert += genericInsertConstraint.getConstraint().getLeft();
|
||||||
|
} else {
|
||||||
|
insert += genericInsertConstraint.getConstraint().getLeft() + " extends " + genericInsertConstraint.getConstraint().getRight() + ", ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
insert = insert.substring(0, insert.length() -2);
|
||||||
|
insert += ">";
|
||||||
|
|
||||||
|
result.add(new TypeInsertPoint(offset, insert));
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,13 +1,12 @@
|
|||||||
package de.dhbwstuttgart.typedeployment;
|
package de.dhbwstuttgart.typedeployment;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.*;
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.JavaInternalExpression;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class TypeInsertPlacer extends AbstractASTWalker{
|
public class TypeInsertPlacer extends AbstractASTWalker{
|
||||||
|
@@ -6,6 +6,7 @@ import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
|
|||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class TypeInsertPoint {
|
public class TypeInsertPoint {
|
||||||
@@ -53,6 +54,10 @@ public class TypeInsertPoint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<TypeInsertPoint> getAdditionalPoints() {
|
||||||
|
return this.getAdditionalPoints();
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return point.toString() + " " + insertString.toString();
|
return point.toString() + " " + insertString.toString();
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ import de.dhbwstuttgart.typeinference.unify.GuavaSetOperations;
|
|||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -29,7 +30,10 @@ public class ConstraintSet<A> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(){
|
public String toString(){
|
||||||
return cartesianProduct().toString();
|
BinaryOperator<String> b = (x,y) -> x+y;
|
||||||
|
return "\nUND:" + this.undConstraints.toString() + "\n" +
|
||||||
|
"ODER:" + this.oderConstraints.stream().reduce("", (x,y) -> x.toString()+ "\n" +y, b);
|
||||||
|
//cartesianProduct().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<List<Constraint<A>>> cartesianProduct(){
|
public Set<List<Constraint<A>>> cartesianProduct(){
|
||||||
|
@@ -46,7 +46,7 @@ public class TYPE {
|
|||||||
/*
|
/*
|
||||||
TODO: Hier eine Information erstellen nur mit den importierte Klassen einer einzigen SourceFile
|
TODO: Hier eine Information erstellen nur mit den importierte Klassen einer einzigen SourceFile
|
||||||
private TypeInferenceInformation getTypeInferenceInformation(sourceFile) {
|
private TypeInferenceInformation getTypeInferenceInformation(sourceFile) {
|
||||||
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
|
DirectoryClassLoader classLoader = DirectoryClassLoader.getSystemClassLoader();
|
||||||
Set<ClassOrInterface> classes = new HashSet<>();
|
Set<ClassOrInterface> classes = new HashSet<>();
|
||||||
|
|
||||||
for(SourceFile sourceFile : sfs){
|
for(SourceFile sourceFile : sfs){
|
||||||
|
@@ -17,6 +17,7 @@ import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption;
|
|||||||
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.*;
|
import de.dhbwstuttgart.typeinference.constraints.*;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -159,10 +160,12 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
//Es wird in OderConstraints davon ausgegangen dass die Bedingungen für die Typen der Argumente links stehen
|
||||||
|
//und die Typen der Rückgabewerte immer rechts stehen (vgl. JavaTXCompiler)
|
||||||
public void visit(MethodCall methodCall) {
|
public void visit(MethodCall methodCall) {
|
||||||
methodCall.receiver.accept(this);
|
methodCall.receiver.accept(this);
|
||||||
//Overloading:
|
//Overloading:
|
||||||
Set<Constraint> methodConstraints = new HashSet<>();
|
Set<Constraint<Pair>> methodConstraints = new HashSet<>();
|
||||||
for(MethodAssumption m : this.getMethods(methodCall.name, methodCall.arglist, info)){
|
for(MethodAssumption m : this.getMethods(methodCall.name, methodCall.arglist, info)){
|
||||||
GenericsResolver resolver = getResolverInstance();
|
GenericsResolver resolver = getResolverInstance();
|
||||||
methodConstraints.add(generateConstraint(methodCall, m, info, resolver));
|
methodConstraints.add(generateConstraint(methodCall, m, info, resolver));
|
||||||
@@ -222,6 +225,8 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
//Es wird in OderConstraints davon ausgegangen dass die Bedingungen für die Typen der Argumente links stehen
|
||||||
|
//und die Typen der Rückgabewerte immer rechts stehen (vgl. JavaTXCompiler)
|
||||||
public void visit(BinaryExpr binary) {
|
public void visit(BinaryExpr binary) {
|
||||||
binary.lexpr.accept(this);
|
binary.lexpr.accept(this);
|
||||||
binary.rexpr.accept(this);
|
binary.rexpr.accept(this);
|
||||||
@@ -248,7 +253,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
numeric = new Constraint<>();
|
numeric = new Constraint<>();
|
||||||
numeric.add(new Pair(binary.lexpr.getType(), bytee, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.lexpr.getType(), bytee, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.rexpr.getType(), bytee, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.rexpr.getType(), bytee, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.getType(), integer, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.getType(), integer, PairOperator.EQUALSDOT));
|
||||||
numericAdditionOrStringConcatenation.add(numeric);
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
}
|
}
|
||||||
//PL eingefuegt 2018-07-17
|
//PL eingefuegt 2018-07-17
|
||||||
@@ -256,7 +261,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
numeric = new Constraint<>();
|
numeric = new Constraint<>();
|
||||||
numeric.add(new Pair(binary.lexpr.getType(), shortt, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.lexpr.getType(), shortt, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.rexpr.getType(), shortt, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.rexpr.getType(), shortt, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.getType(), integer, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.getType(), integer, PairOperator.EQUALSDOT));
|
||||||
numericAdditionOrStringConcatenation.add(numeric);
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
}
|
}
|
||||||
//PL eingefuegt 2018-07-17
|
//PL eingefuegt 2018-07-17
|
||||||
@@ -264,7 +269,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
numeric = new Constraint<>();
|
numeric = new Constraint<>();
|
||||||
numeric.add(new Pair(binary.lexpr.getType(), integer, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.lexpr.getType(), integer, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.rexpr.getType(), integer, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.rexpr.getType(), integer, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(integer, binary.getType(), PairOperator.SMALLERDOT));
|
numeric.add(new Pair(integer, binary.getType(), PairOperator.EQUALSDOT));
|
||||||
numericAdditionOrStringConcatenation.add(numeric);
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
}
|
}
|
||||||
//PL eingefuegt 2018-07-17
|
//PL eingefuegt 2018-07-17
|
||||||
@@ -272,7 +277,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
numeric = new Constraint<>();
|
numeric = new Constraint<>();
|
||||||
numeric.add(new Pair(binary.lexpr.getType(), longg, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.lexpr.getType(), longg, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.rexpr.getType(), longg, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.rexpr.getType(), longg, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(longg, binary.getType(), PairOperator.SMALLERDOT));
|
numeric.add(new Pair(longg, binary.getType(), PairOperator.EQUALSDOT));
|
||||||
numericAdditionOrStringConcatenation.add(numeric);
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
}
|
}
|
||||||
//PL eingefuegt 2018-07-17
|
//PL eingefuegt 2018-07-17
|
||||||
@@ -280,7 +285,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
numeric = new Constraint<>();
|
numeric = new Constraint<>();
|
||||||
numeric.add(new Pair(binary.lexpr.getType(), floatt, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.lexpr.getType(), floatt, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.rexpr.getType(), floatt, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.rexpr.getType(), floatt, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(floatt, binary.getType(), PairOperator.SMALLERDOT));
|
numeric.add(new Pair(floatt, binary.getType(), PairOperator.EQUALSDOT));
|
||||||
numericAdditionOrStringConcatenation.add(numeric);
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
}
|
}
|
||||||
//PL eingefuegt 2018-07-17
|
//PL eingefuegt 2018-07-17
|
||||||
@@ -288,7 +293,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
numeric = new Constraint<>();
|
numeric = new Constraint<>();
|
||||||
numeric.add(new Pair(binary.lexpr.getType(), doublee, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.lexpr.getType(), doublee, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(binary.rexpr.getType(), doublee, PairOperator.SMALLERDOT));
|
numeric.add(new Pair(binary.rexpr.getType(), doublee, PairOperator.SMALLERDOT));
|
||||||
numeric.add(new Pair(doublee, binary.getType(), PairOperator.SMALLERDOT));
|
numeric.add(new Pair(doublee, binary.getType(), PairOperator.EQUALSDOT));
|
||||||
numericAdditionOrStringConcatenation.add(numeric);
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
}
|
}
|
||||||
/* PL auskommentiert Anfang 2018-07-17
|
/* PL auskommentiert Anfang 2018-07-17
|
||||||
@@ -362,7 +367,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
constraintsSet.addUndConstraint(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERNEQDOT));
|
constraintsSet.addUndConstraint(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERNEQDOT));
|
||||||
constraintsSet.addUndConstraint(new Pair(binary.rexpr.getType(), number, PairOperator.SMALLERNEQDOT));
|
constraintsSet.addUndConstraint(new Pair(binary.rexpr.getType(), number, PairOperator.SMALLERNEQDOT));
|
||||||
//Rückgabetyp ist Boolean
|
//Rückgabetyp ist Boolean
|
||||||
constraintsSet.addUndConstraint(new Pair(bool, binary.getType(), PairOperator.SMALLERDOT));
|
constraintsSet.addUndConstraint(new Pair(bool, binary.getType(), PairOperator.EQUALSDOT));
|
||||||
|
|
||||||
//auskommentiert PL 2018-05-24
|
//auskommentiert PL 2018-05-24
|
||||||
//constraintsSet.addUndConstraint(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERDOT));
|
//constraintsSet.addUndConstraint(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERDOT));
|
||||||
@@ -374,7 +379,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
The equality operators may be used to compare two operands that are convertible (§5.1.8) to numeric type, or two operands of type boolean or Boolean, or two operands that are each of either reference type or the null type. All other cases result in a compile-time error.
|
The equality operators may be used to compare two operands that are convertible (§5.1.8) to numeric type, or two operands of type boolean or Boolean, or two operands that are each of either reference type or the null type. All other cases result in a compile-time error.
|
||||||
*/
|
*/
|
||||||
//Der Equals Operator geht mit fast allen Typen, daher werden hier keine Constraints gesetzt
|
//Der Equals Operator geht mit fast allen Typen, daher werden hier keine Constraints gesetzt
|
||||||
constraintsSet.addUndConstraint(new Pair(bool, binary.getType(), PairOperator.SMALLERDOT));
|
constraintsSet.addUndConstraint(new Pair(bool, binary.getType(), PairOperator.EQUALSDOT));
|
||||||
}else{
|
}else{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
@@ -555,7 +560,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
|
|
||||||
protected Constraint<Pair> generateConstraint(MethodCall forMethod, MethodAssumption assumption,
|
protected Constraint<Pair> generateConstraint(MethodCall forMethod, MethodAssumption assumption,
|
||||||
TypeInferenceBlockInformation info, GenericsResolver resolver){
|
TypeInferenceBlockInformation info, GenericsResolver resolver){
|
||||||
Constraint methodConstraint = new Constraint();
|
Constraint<Pair> methodConstraint = new Constraint<>();
|
||||||
ClassOrInterface receiverCl = assumption.getReceiver();
|
ClassOrInterface receiverCl = assumption.getReceiver();
|
||||||
/*
|
/*
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
||||||
@@ -569,7 +574,13 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric retType = assumption.getReceiverType(resolver);
|
RefTypeOrTPHOrWildcardOrGeneric retType = assumption.getReceiverType(resolver);
|
||||||
methodConstraint.add(new Pair(forMethod.receiver.getType(), retType,
|
methodConstraint.add(new Pair(forMethod.receiver.getType(), retType,
|
||||||
PairOperator.SMALLERDOT));
|
PairOperator.EQUALSDOT));//PL 2020-03-17 SMALLERDOT in EQUALSDOT umgewandelt, weil alle geerbten Methoden in den jeweilen Klassen enthalten sind.
|
||||||
|
|
||||||
|
//Fuer Bytecodegenerierung PL 2020-03-09 wird derzeit nicht benutzt ANFANG
|
||||||
|
//methodConstraint.add(new Pair(forMethod.receiverType, retType,
|
||||||
|
// PairOperator.EQUALSDOT));
|
||||||
|
//Fuer Bytecodegenerierung PL 2020-03-09 wird derzeit nicht benutzt ENDE
|
||||||
|
|
||||||
methodConstraint.add(new Pair(assumption.getReturnType(resolver), forMethod.getType(),
|
methodConstraint.add(new Pair(assumption.getReturnType(resolver), forMethod.getType(),
|
||||||
PairOperator.EQUALSDOT));
|
PairOperator.EQUALSDOT));
|
||||||
methodConstraint.addAll(generateParameterConstraints(forMethod, assumption, info, resolver));
|
methodConstraint.addAll(generateParameterConstraints(forMethod, assumption, info, resolver));
|
||||||
@@ -584,6 +595,10 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
RefTypeOrTPHOrWildcardOrGeneric argType = foMethod.arglist.getArguments().get(i).getType();
|
RefTypeOrTPHOrWildcardOrGeneric argType = foMethod.arglist.getArguments().get(i).getType();
|
||||||
RefTypeOrTPHOrWildcardOrGeneric assType = assumption.getArgTypes(resolver).get(i);
|
RefTypeOrTPHOrWildcardOrGeneric assType = assumption.getArgTypes(resolver).get(i);
|
||||||
ret.add(new Pair(argType, assType, PairOperator.SMALLERDOT));
|
ret.add(new Pair(argType, assType, PairOperator.SMALLERDOT));
|
||||||
|
|
||||||
|
//Fuer Bytecodegenerierung PL 2020-03-09 wird derzeit nicht benutzt ANFANG
|
||||||
|
// ret.add(new Pair(foMethod.argTypes.get(i), assType, PairOperator.EQUALSDOT));
|
||||||
|
//Fuer Bytecodegenerierung PL 2020-03-09 wird derzeit nicht benutzt ENDE
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -666,8 +681,11 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
protected Constraint<Pair> generateConstructorConstraint(NewClass forConstructor, MethodAssumption assumption,
|
protected Constraint<Pair> generateConstructorConstraint(NewClass forConstructor, MethodAssumption assumption,
|
||||||
TypeInferenceBlockInformation info, GenericsResolver resolver){
|
TypeInferenceBlockInformation info, GenericsResolver resolver){
|
||||||
Constraint methodConstraint = new Constraint();
|
Constraint methodConstraint = new Constraint();
|
||||||
|
//WELCHEN SINN MACHT DIESER CONSTRAINT???
|
||||||
|
//Ist er nicht immer classname <. classname und damit redundant?
|
||||||
methodConstraint.add(new Pair(assumption.getReturnType(resolver), forConstructor.getType(),
|
methodConstraint.add(new Pair(assumption.getReturnType(resolver), forConstructor.getType(),
|
||||||
PairOperator.SMALLERDOT));
|
PairOperator.SMALLERDOT));
|
||||||
|
//WELCHEN SINN MACHT DIESER CONSTRAINT???
|
||||||
methodConstraint.addAll(generateParameterConstraints(forConstructor, assumption, info, resolver));
|
methodConstraint.addAll(generateParameterConstraints(forConstructor, assumption, info, resolver));
|
||||||
return methodConstraint;
|
return methodConstraint;
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,7 @@ import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
|
|||||||
public class Match implements IMatch {
|
public class Match implements IMatch {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
//vorne muss das Pattern stehen
|
||||||
//A<X> =. A<Integer> ==> True
|
//A<X> =. A<Integer> ==> True
|
||||||
//A<Integer> =. A<X> ==> False
|
//A<Integer> =. A<X> ==> False
|
||||||
public Optional<Unifier> match(ArrayList<UnifyPair> termsList) {
|
public Optional<Unifier> match(ArrayList<UnifyPair> termsList) {
|
||||||
|
@@ -39,8 +39,8 @@ public class TypeUnify2Task extends TypeUnifyTask {
|
|||||||
return new HashSet<>(); }
|
return new HashSet<>(); }
|
||||||
else
|
else
|
||||||
*/
|
*/
|
||||||
|
//writeLog("xxx");
|
||||||
noOfThread--;
|
//noOfThread--;
|
||||||
synchronized (usedTasks) {
|
synchronized (usedTasks) {
|
||||||
if (this.myIsCancelled()) {
|
if (this.myIsCancelled()) {
|
||||||
return new HashSet<>();
|
return new HashSet<>();
|
||||||
|
@@ -28,6 +28,7 @@ import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
|||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IMatch;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IRuleSet;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IRuleSet;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.ISetOperations;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.ISetOperations;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
|
||||||
@@ -173,7 +174,8 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
writeLog("thNo2 " + thNo);
|
writeLog("thNo2 " + thNo);
|
||||||
try {
|
try {
|
||||||
this.logFile = //new OutputStreamWriter(new NullOutputStream());
|
this.logFile = //new OutputStreamWriter(new NullOutputStream());
|
||||||
new FileWriter(new File(System.getProperty("user.dir")+"/src/test/resources/logFiles/"+"Thread_"+thNo));
|
//new FileWriter(new File(System.getProperty("user.dir")+"/src/test/resources/logFiles/"+"Thread_"+thNo));
|
||||||
|
new FileWriter(new File(System.getProperty("user.dir")+"/logFiles/"+"Thread_"+thNo));
|
||||||
logFile.write("");
|
logFile.write("");
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
@@ -307,7 +309,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
nOfUnify++;
|
nOfUnify++;
|
||||||
writeLog(nOfUnify.toString() + " Unifikation: " + eq.toString());
|
writeLog(nOfUnify.toString() + " Unifikation: " + eq.toString());
|
||||||
writeLog(nOfUnify.toString() + " Oderconstraints: " + oderConstraints.toString());
|
writeLog(nOfUnify.toString() + " Oderconstraints: " + oderConstraints.toString());
|
||||||
//eq = eq.stream().map(x -> {x.setVariance((byte)-1); return x;}).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Variancen auf alle Gleichungen vererben
|
* Variancen auf alle Gleichungen vererben
|
||||||
@@ -606,8 +607,8 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
for (UnifyPair ele : nextSetasList.get(0)) {//check ob a <. ty base oder ob Ueberladung
|
for (UnifyPair ele : nextSetasList.get(0)) {//check ob a <. ty base oder ob Ueberladung
|
||||||
sameBase = sameBase && ele.getBasePair() != null && ele.getBasePair().equals(fstBasePair);
|
sameBase = sameBase && ele.getBasePair() != null && ele.getBasePair().equals(fstBasePair);
|
||||||
}
|
}
|
||||||
if (sameBase) {
|
if (sameBase) { //angefuegt PL 2020-02-30
|
||||||
Optional<Integer> xi = nextSetasList.stream().map(x -> x.stream().filter(y -> y.getLhsType() instanceof PlaceholderType)
|
Optional<Integer> xi = nextSetasList.stream().map(x -> x.stream().filter(y -> (y.getLhsType() instanceof PlaceholderType && !(y.getRhsType() instanceof PlaceholderType)))
|
||||||
.filter(z -> ((PlaceholderType)z.getLhsType()).getVariance() != 0)
|
.filter(z -> ((PlaceholderType)z.getLhsType()).getVariance() != 0)
|
||||||
.map(c -> ((PlaceholderType)c.getLhsType()).getVariance())
|
.map(c -> ((PlaceholderType)c.getLhsType()).getVariance())
|
||||||
.reduce((a,b)-> {if (a==b) return a; else return 0; })) //2 kommt insbesondere bei Oder-Constraints vor
|
.reduce((a,b)-> {if (a==b) return a; else return 0; })) //2 kommt insbesondere bei Oder-Constraints vor
|
||||||
@@ -730,6 +731,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
}
|
}
|
||||||
else if (variance == -1) {
|
else if (variance == -1) {
|
||||||
a = oup.min(nextSetasList.iterator());
|
a = oup.min(nextSetasList.iterator());
|
||||||
|
writeLog("Min: a in " + variance + " "+ a);
|
||||||
nextSetasList.remove(a);
|
nextSetasList.remove(a);
|
||||||
nextSetasListRest = new ArrayList<>(nextSetasList);
|
nextSetasListRest = new ArrayList<>(nextSetasList);
|
||||||
Iterator<Set<UnifyPair>> nextSetasListItRest = new ArrayList<Set<UnifyPair>>(nextSetasListRest).iterator();
|
Iterator<Set<UnifyPair>> nextSetasListItRest = new ArrayList<Set<UnifyPair>>(nextSetasListRest).iterator();
|
||||||
@@ -903,9 +905,10 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
|
|
||||||
/* FORK ANFANG */
|
/* FORK ANFANG */
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
noOfThread--;
|
|
||||||
writeLog("wait "+ forkOrig.thNo);
|
writeLog("wait "+ forkOrig.thNo);
|
||||||
|
noOfThread--;
|
||||||
res = forkOrig.join();
|
res = forkOrig.join();
|
||||||
|
//noOfThread++;
|
||||||
forkOrig.writeLog("final Orig 1");
|
forkOrig.writeLog("final Orig 1");
|
||||||
forkOrig.closeLogFile();
|
forkOrig.closeLogFile();
|
||||||
//Set<Set<UnifyPair>> fork_res = forkOrig.join();
|
//Set<Set<UnifyPair>> fork_res = forkOrig.join();
|
||||||
@@ -918,7 +921,9 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
forks.forEach(x -> writeLog("wait: " + x.thNo));
|
forks.forEach(x -> writeLog("wait: " + x.thNo));
|
||||||
for(TypeUnify2Task fork : forks) {
|
for(TypeUnify2Task fork : forks) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
noOfThread--;
|
||||||
Set<Set<UnifyPair>> fork_res = fork.join();
|
Set<Set<UnifyPair>> fork_res = fork.join();
|
||||||
|
//noOfThread++;
|
||||||
writeLog("Join " + new Integer(fork.thNo).toString());
|
writeLog("Join " + new Integer(fork.thNo).toString());
|
||||||
//noOfThread--; an das Ende von compute verschoben
|
//noOfThread--; an das Ende von compute verschoben
|
||||||
writeLog("fork_res: " + fork_res.toString());
|
writeLog("fork_res: " + fork_res.toString());
|
||||||
@@ -931,7 +936,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
fork.closeLogFile();
|
fork.closeLogFile();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
noOfThread++;
|
//noOfThread++;
|
||||||
} else {
|
} else {
|
||||||
if(parallel && (variance == -1) && noOfThread <= MaxNoOfThreads) {
|
if(parallel && (variance == -1) && noOfThread <= MaxNoOfThreads) {
|
||||||
Set<TypeUnify2Task> forks = new HashSet<>();
|
Set<TypeUnify2Task> forks = new HashSet<>();
|
||||||
@@ -1006,9 +1011,10 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
|
|
||||||
/* FORK ANFANG */
|
/* FORK ANFANG */
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
noOfThread--;
|
|
||||||
writeLog("wait "+ forkOrig.thNo);
|
writeLog("wait "+ forkOrig.thNo);
|
||||||
|
noOfThread--;
|
||||||
res = forkOrig.join();
|
res = forkOrig.join();
|
||||||
|
//noOfThread++;
|
||||||
forkOrig.writeLog("final Orig -1");
|
forkOrig.writeLog("final Orig -1");
|
||||||
forkOrig.closeLogFile();
|
forkOrig.closeLogFile();
|
||||||
//Set<Set<UnifyPair>> fork_res = forkOrig.join();
|
//Set<Set<UnifyPair>> fork_res = forkOrig.join();
|
||||||
@@ -1021,7 +1027,9 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
forks.forEach(x -> writeLog("wait: " + x.thNo));
|
forks.forEach(x -> writeLog("wait: " + x.thNo));
|
||||||
for(TypeUnify2Task fork : forks) {
|
for(TypeUnify2Task fork : forks) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
noOfThread--;
|
||||||
Set<Set<UnifyPair>> fork_res = fork.join();
|
Set<Set<UnifyPair>> fork_res = fork.join();
|
||||||
|
//noOfThread++;
|
||||||
writeLog("Join " + new Integer(fork.thNo).toString());
|
writeLog("Join " + new Integer(fork.thNo).toString());
|
||||||
//noOfThread--; an das Ende von compute verschoben
|
//noOfThread--; an das Ende von compute verschoben
|
||||||
writeLog("fork_res: " + fork_res.toString());
|
writeLog("fork_res: " + fork_res.toString());
|
||||||
@@ -1034,7 +1042,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
fork.closeLogFile();
|
fork.closeLogFile();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
noOfThread++;
|
//noOfThread++;
|
||||||
} else {
|
} else {
|
||||||
if(parallel && (variance == 2) && noOfThread <= MaxNoOfThreads) {
|
if(parallel && (variance == 2) && noOfThread <= MaxNoOfThreads) {
|
||||||
writeLog("var2einstieg");
|
writeLog("var2einstieg");
|
||||||
@@ -1061,7 +1069,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
}
|
}
|
||||||
while (!nextSetasListRest.isEmpty()) {
|
while (!nextSetasListRest.isEmpty()) {
|
||||||
Set<UnifyPair> nSaL = nextSetasListRest.remove(0);
|
Set<UnifyPair> nSaL = nextSetasListRest.remove(0);
|
||||||
//nextSetasList.remove(nSaL);
|
nextSetasList.remove(nSaL); //PL einkommentiert 20-02-03
|
||||||
Set<UnifyPair> newEq = new HashSet<>(eq);
|
Set<UnifyPair> newEq = new HashSet<>(eq);
|
||||||
Set<Set<UnifyPair>> newElems = new HashSet<>(elems);
|
Set<Set<UnifyPair>> newElems = new HashSet<>(elems);
|
||||||
List<Set<Set<UnifyPair>>> newOderConstraints = new ArrayList<>(oderConstraints);
|
List<Set<Set<UnifyPair>>> newOderConstraints = new ArrayList<>(oderConstraints);
|
||||||
@@ -1079,9 +1087,10 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
|
|
||||||
/* FORK ANFANG */
|
/* FORK ANFANG */
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
noOfThread--;
|
|
||||||
writeLog("wait "+ forkOrig.thNo);
|
writeLog("wait "+ forkOrig.thNo);
|
||||||
|
noOfThread--;
|
||||||
res = forkOrig.join();
|
res = forkOrig.join();
|
||||||
|
//noOfThread++;
|
||||||
forkOrig.writeLog("final Orig 2");
|
forkOrig.writeLog("final Orig 2");
|
||||||
forkOrig.closeLogFile();
|
forkOrig.closeLogFile();
|
||||||
//Set<Set<UnifyPair>> fork_res = forkOrig.join();
|
//Set<Set<UnifyPair>> fork_res = forkOrig.join();
|
||||||
@@ -1093,7 +1102,9 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
forks.forEach(x -> writeLog("wait: " + x.thNo));
|
forks.forEach(x -> writeLog("wait: " + x.thNo));
|
||||||
for(TypeUnify2Task fork : forks) {
|
for(TypeUnify2Task fork : forks) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
noOfThread--;
|
||||||
Set<Set<UnifyPair>> fork_res = fork.join();
|
Set<Set<UnifyPair>> fork_res = fork.join();
|
||||||
|
//noOfThread++;
|
||||||
writeLog("Join " + new Integer(fork.thNo).toString());
|
writeLog("Join " + new Integer(fork.thNo).toString());
|
||||||
//noOfThread--; an das Ende von compute verschoben
|
//noOfThread--; an das Ende von compute verschoben
|
||||||
add_res.add(fork_res);
|
add_res.add(fork_res);
|
||||||
@@ -1101,7 +1112,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
fork.closeLogFile();
|
fork.closeLogFile();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
noOfThread++;
|
//noOfThread++;
|
||||||
} else {
|
} else {
|
||||||
//parallel = false; //Wenn MaxNoOfThreads erreicht ist, sequentiell weiterarbeiten
|
//parallel = false; //Wenn MaxNoOfThreads erreicht ist, sequentiell weiterarbeiten
|
||||||
elems.add(a); //PL 2019-01-16 muss das wirklich hin steht schon in Zeile 859 ja braucht man siehe Zeile 859
|
elems.add(a); //PL 2019-01-16 muss das wirklich hin steht schon in Zeile 859 ja braucht man siehe Zeile 859
|
||||||
@@ -1435,7 +1446,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
//else result.stream().filter(y -> !isUndefinedPairSet(y));
|
//else result.stream().filter(y -> !isUndefinedPairSet(y));
|
||||||
writeLog("res: " + res.toString());
|
writeLog("res: " + res.toString());
|
||||||
}
|
}
|
||||||
|
//2020-02-02: if (variance ==2) Hier Aufruf von filterOverriding einfuegen
|
||||||
writeLog("Return computeCR: " + result.toString());
|
writeLog("Return computeCR: " + result.toString());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1754,6 +1765,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
* (as in case 1 where sigma is added to the innermost set).
|
* (as in case 1 where sigma is added to the innermost set).
|
||||||
*/
|
*/
|
||||||
protected Set<Set<Set<Set<UnifyPair>>>> calculatePairSets(Set<UnifyPair> eq2s, List<Set<Set<UnifyPair>>> oderConstraintsInput, IFiniteClosure fc, Set<UnifyPair> undefined, List<Set<Set<UnifyPair>>> oderConstraintsOutput) {
|
protected Set<Set<Set<Set<UnifyPair>>>> calculatePairSets(Set<UnifyPair> eq2s, List<Set<Set<UnifyPair>>> oderConstraintsInput, IFiniteClosure fc, Set<UnifyPair> undefined, List<Set<Set<UnifyPair>>> oderConstraintsOutput) {
|
||||||
|
writeLog("eq2s: " + eq2s.toString());
|
||||||
oderConstraintsOutput.addAll(oderConstraintsInput);
|
oderConstraintsOutput.addAll(oderConstraintsInput);
|
||||||
List<Set<Set<Set<UnifyPair>>>> result = new ArrayList<>(9);
|
List<Set<Set<Set<UnifyPair>>>> result = new ArrayList<>(9);
|
||||||
|
|
||||||
@@ -1763,17 +1775,30 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
|
|
||||||
ArrayList<UnifyPair> eq2sprime = new ArrayList<>(eq2s);
|
ArrayList<UnifyPair> eq2sprime = new ArrayList<>(eq2s);
|
||||||
Iterator<UnifyPair> eq2sprimeit = eq2sprime.iterator();
|
Iterator<UnifyPair> eq2sprimeit = eq2sprime.iterator();
|
||||||
|
ArrayList<UnifyPair> eq2sAsListFst = new ArrayList<>();
|
||||||
|
ArrayList<UnifyPair> eq2sAsListSnd = new ArrayList<>();
|
||||||
|
ArrayList<UnifyPair> eq2sAsListBack = new ArrayList<>();
|
||||||
ArrayList<UnifyPair> eq2sAsList = new ArrayList<>();
|
ArrayList<UnifyPair> eq2sAsList = new ArrayList<>();
|
||||||
Boolean first = true;
|
Boolean first = true;
|
||||||
while(eq2sprimeit.hasNext()) {// alle mit Variance != 0 nach vorne schieben
|
while(eq2sprimeit.hasNext()) {// alle mit Variance != 0 nach vorne schieben
|
||||||
UnifyPair up = eq2sprimeit.next();
|
UnifyPair up = eq2sprimeit.next();
|
||||||
if ((up.getLhsType() instanceof PlaceholderType && ((PlaceholderType)up.getLhsType()).getVariance() != 0)
|
if ((up.getLhsType() instanceof PlaceholderType && ((PlaceholderType)up.getLhsType()).getVariance() != 0 && !((PlaceholderType)up.getLhsType()).isInnerType())
|
||||||
|| (up.getRhsType() instanceof PlaceholderType && ((PlaceholderType)up.getRhsType()).getVariance() != 0)) {
|
|| (up.getRhsType() instanceof PlaceholderType && ((PlaceholderType)up.getRhsType()).getVariance() != 0) && !((PlaceholderType)up.getRhsType()).isInnerType()) {
|
||||||
eq2sAsList.add(up);
|
eq2sAsListFst.add(up);
|
||||||
|
eq2s.remove(up);
|
||||||
|
}
|
||||||
|
else if ((up.getLhsType() instanceof PlaceholderType && ((PlaceholderType)up.getLhsType()).getVariance() != 0 && ((PlaceholderType)up.getLhsType()).isInnerType())
|
||||||
|
|| (up.getRhsType() instanceof PlaceholderType && ((PlaceholderType)up.getRhsType()).getVariance() != 0) && ((PlaceholderType)up.getRhsType()).isInnerType()) {
|
||||||
|
eq2sAsListSnd.add(up);
|
||||||
|
eq2s.remove(up);
|
||||||
|
}
|
||||||
|
else if ((up.getLhsType() instanceof PlaceholderType && ((PlaceholderType)up.getLhsType()).isInnerType())
|
||||||
|
|| (up.getRhsType() instanceof PlaceholderType && ((PlaceholderType)up.getRhsType()).isInnerType())) {
|
||||||
|
eq2sAsListBack.add(up);
|
||||||
eq2s.remove(up);
|
eq2s.remove(up);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (eq2sAsList.isEmpty()) {
|
if (eq2sAsListFst.isEmpty()) {
|
||||||
List<Set<Set<UnifyPair>>> oderConstraintsVariance = oderConstraintsOutput.stream() //Alle Elemente rauswerfen, die Variance 0 haben oder keine TPH in LHS oder RHS sind
|
List<Set<Set<UnifyPair>>> oderConstraintsVariance = oderConstraintsOutput.stream() //Alle Elemente rauswerfen, die Variance 0 haben oder keine TPH in LHS oder RHS sind
|
||||||
.filter(x -> x.stream()
|
.filter(x -> x.stream()
|
||||||
.filter(y ->
|
.filter(y ->
|
||||||
@@ -1788,13 +1813,24 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
oderConstraintsOutput.remove(ret);
|
oderConstraintsOutput.remove(ret);
|
||||||
//Set<UnifyPair> retFlat = new HashSet<>();
|
//Set<UnifyPair> retFlat = new HashSet<>();
|
||||||
//ret.stream().forEach(x -> retFlat.addAll(x));
|
//ret.stream().forEach(x -> retFlat.addAll(x));
|
||||||
ret.stream().forEach(x -> x.stream().forEach(y -> y.addSubstitutions(x)));
|
ret.stream().forEach(x -> x.stream().forEach(y -> { Set<UnifyPair> x_new = new HashSet<>(x); //PL 2020-03-18: y selbst darf nicht in die Substitutionen
|
||||||
|
x_new.remove(y);
|
||||||
|
y.addSubstitutions(x_new);
|
||||||
|
}));
|
||||||
result.get(8).add(ret);
|
result.get(8).add(ret);
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
writeLog("eq2s: " + eq2s.toString());
|
||||||
|
writeLog("eq2sAsListFst: " + eq2sAsListFst.toString());
|
||||||
|
writeLog("eq2sAsListSnd: " + eq2sAsListSnd.toString());
|
||||||
|
writeLog("eq2sAsListBack: " + eq2sAsListBack.toString());
|
||||||
|
|
||||||
|
eq2sAsList.addAll(eq2sAsListFst);
|
||||||
|
eq2sAsList.addAll(eq2sAsListSnd);
|
||||||
eq2sAsList.addAll(eq2s);
|
eq2sAsList.addAll(eq2s);
|
||||||
|
eq2sAsList.addAll(eq2sAsListBack);
|
||||||
|
|
||||||
if (eq2sAsList.isEmpty() && first) {//Alle eq2s sind empty und alle oderConstraints mit Variance != 0 sind bearbeitet
|
if (eq2sAsList.isEmpty() && first) {//Alle eq2s sind empty und alle oderConstraints mit Variance != 0 sind bearbeitet
|
||||||
if (!oderConstraintsOutput.isEmpty()) {
|
if (!oderConstraintsOutput.isEmpty()) {
|
||||||
@@ -1803,7 +1839,10 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
// System.out.println("M");
|
// System.out.println("M");
|
||||||
//Set<UnifyPair> retFlat = new HashSet<>();
|
//Set<UnifyPair> retFlat = new HashSet<>();
|
||||||
//ret.stream().forEach(x -> retFlat.addAll(x));
|
//ret.stream().forEach(x -> retFlat.addAll(x));
|
||||||
ret.stream().forEach(x -> x.stream().forEach(y -> y.addSubstitutions(x)));
|
ret.stream().forEach(x -> x.stream().forEach(y -> { Set<UnifyPair> x_new = new HashSet<>(x); //PL 2020-03-18: y selbst darf nicht in die Substitutionen
|
||||||
|
x_new.remove(y);
|
||||||
|
y.addSubstitutions(x_new);
|
||||||
|
}));
|
||||||
result.get(8).add(ret);
|
result.get(8).add(ret);
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
@@ -2023,7 +2062,14 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
protected Set<Set<UnifyPair>> unifyCase1(UnifyPair pair, IFiniteClosure fc) {
|
protected Set<Set<UnifyPair>> unifyCase1(UnifyPair pair, IFiniteClosure fc) {
|
||||||
PlaceholderType a = (PlaceholderType)pair.getLhsType();
|
PlaceholderType a = (PlaceholderType)pair.getLhsType();
|
||||||
UnifyType thetaPrime = pair.getRhsType();
|
UnifyType thetaPrime = pair.getRhsType();
|
||||||
byte variance = pair.getVariance();
|
|
||||||
|
if (thetaPrime instanceof ExtendsType) {
|
||||||
|
thetaPrime = ((ExtendsType)thetaPrime).getExtendedType();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thetaPrime instanceof SuperType) {
|
||||||
|
//HIER MUSS NOCH WAS UEBERLEGT WERDEN
|
||||||
|
}
|
||||||
|
|
||||||
Set<Set<UnifyPair>> result = new HashSet<>();
|
Set<Set<UnifyPair>> result = new HashSet<>();
|
||||||
|
|
||||||
@@ -2042,7 +2088,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
//}
|
//}
|
||||||
Set<UnifyType> cs = fc.getAllTypesByName(thetaPrime.getName());//cs= [java.util.Vector<NP>, java.util.Vector<java.util.Vector<java.lang.Integer>>, ????java.util.Vector<gen_hv>???]
|
Set<UnifyType> cs = fc.getAllTypesByName(thetaPrime.getName());//cs= [java.util.Vector<NP>, java.util.Vector<java.util.Vector<java.lang.Integer>>, ????java.util.Vector<gen_hv>???]
|
||||||
|
|
||||||
|
writeLog("cs: " + cs.toString());
|
||||||
//PL 18-02-06 entfernt, kommt durch unify wieder rein
|
//PL 18-02-06 entfernt, kommt durch unify wieder rein
|
||||||
//cs.add(thetaPrime);
|
//cs.add(thetaPrime);
|
||||||
//PL 18-02-06 entfernt
|
//PL 18-02-06 entfernt
|
||||||
@@ -2056,13 +2102,19 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
return x.accept(new freshPlaceholder(), hm);
|
return x.accept(new freshPlaceholder(), hm);
|
||||||
}).collect(Collectors.toCollection(HashSet::new));
|
}).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
|
||||||
|
IMatch match = new Match();
|
||||||
for(UnifyType c : csPHRenamed) {
|
for(UnifyType c : csPHRenamed) {
|
||||||
//PL 18-02-05 getChildren durch smaller ersetzt in getChildren werden die Varianlen nicht ersetzt.
|
//PL 18-02-05 getChildren durch smaller ersetzt in getChildren werden die Varianlen nicht ersetzt.
|
||||||
Set<UnifyType> thetaQs = new HashSet<>();
|
Set<UnifyType> thetaQs = new HashSet<>();
|
||||||
//TODO smaller wieder reinnehmen?
|
//TODO smaller wieder reinnehmen?
|
||||||
//thetaQs.add(c);//
|
//thetaQs.add(c);//
|
||||||
thetaQs = fc.smaller(c, new HashSet<>()).stream().collect(Collectors.toCollection(HashSet::new));
|
thetaQs = fc.smaller(c, new HashSet<>()).stream().collect(Collectors.toCollection(HashSet::new));
|
||||||
|
ArrayList<UnifyPair> ml = new ArrayList<>();
|
||||||
|
ml.add(new UnifyPair(c, thetaPrime, PairOperator.EQUALSDOT));
|
||||||
|
if (!(match.match(ml)).isPresent()) {
|
||||||
|
thetaQs.remove(c);
|
||||||
|
}
|
||||||
|
writeLog("thetaQs von " + c + ": " + thetaQs.toString());
|
||||||
//Set<UnifyType> thetaQs = fc.getChildren(c).stream().collect(Collectors.toCollection(HashSet::new));
|
//Set<UnifyType> thetaQs = fc.getChildren(c).stream().collect(Collectors.toCollection(HashSet::new));
|
||||||
//thetaQs.add(thetaPrime); //PL 18-02-05 wieder geloescht
|
//thetaQs.add(thetaPrime); //PL 18-02-05 wieder geloescht
|
||||||
//PL 2017-10-03: War auskommentiert habe ich wieder einkommentiert,
|
//PL 2017-10-03: War auskommentiert habe ich wieder einkommentiert,
|
||||||
@@ -2070,7 +2122,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
|
|
||||||
//PL 18-02-06: eingefuegt, thetaQs der Form V<V<...>> <. V'<V<...>> werden entfernt
|
//PL 18-02-06: eingefuegt, thetaQs der Form V<V<...>> <. V'<V<...>> werden entfernt
|
||||||
//TODO PL 19-01-14 wieder reinnehmen kurzfristig auskommentiert
|
//TODO PL 19-01-14 wieder reinnehmen kurzfristig auskommentiert
|
||||||
thetaQs = thetaQs.stream().filter(ut -> ut.getTypeParams().arePlaceholders()).collect(Collectors.toCollection(HashSet::new));
|
//thetaQs = thetaQs.stream().filter(ut -> ut.getTypeParams().arePlaceholders()).collect(Collectors.toCollection(HashSet::new));
|
||||||
//PL 18-02-06: eingefuegt
|
//PL 18-02-06: eingefuegt
|
||||||
|
|
||||||
Set<UnifyType> thetaQPrimes = new HashSet<>();
|
Set<UnifyType> thetaQPrimes = new HashSet<>();
|
||||||
@@ -2086,8 +2138,8 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
for(TypeParams tp : permuteParams(candidateParams))
|
for(TypeParams tp : permuteParams(candidateParams))
|
||||||
thetaQPrimes.add(c.setTypeParams(tp));
|
thetaQPrimes.add(c.setTypeParams(tp));
|
||||||
}
|
}
|
||||||
|
writeLog("thetaQPrimes von " + c + ": " + thetaQPrimes.toString());
|
||||||
for(UnifyType tqp : thetaQPrimes) {
|
for(UnifyType tqp : thetaQPrimes) {//PL 2020-03-08 umbauen in der Schleife wird nur unifizierbarer Typ gesucht break am Ende
|
||||||
Collection<PlaceholderType> tphs = tqp.getInvolvedPlaceholderTypes();
|
Collection<PlaceholderType> tphs = tqp.getInvolvedPlaceholderTypes();
|
||||||
Optional<Unifier> opt = stdUnify.unify(tqp, thetaPrime);
|
Optional<Unifier> opt = stdUnify.unify(tqp, thetaPrime);
|
||||||
if (!opt.isPresent()) {
|
if (!opt.isPresent()) {
|
||||||
@@ -2106,7 +2158,10 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
}
|
}
|
||||||
//List<UnifyType> freshTphs = new ArrayList<>(); PL 18-02-06 in die For-Schleife verschoben
|
//List<UnifyType> freshTphs = new ArrayList<>(); PL 18-02-06 in die For-Schleife verschoben
|
||||||
for (UnifyType tq : thetaQs) {
|
for (UnifyType tq : thetaQs) {
|
||||||
Set<UnifyType> smaller = fc.smaller(unifier.apply(tq), new HashSet<>());
|
//geaendert PL 20-03-07
|
||||||
|
Set<UnifyType> smaller = new HashSet<>();
|
||||||
|
smaller.add(unifier.apply(tq));
|
||||||
|
//Set<UnifyType> smaller = fc.smaller(unifier.apply(tq), new HashSet<>());
|
||||||
//eingefuegt PL 2018-03-29 Anfang ? ext. theta hinzufuegen
|
//eingefuegt PL 2018-03-29 Anfang ? ext. theta hinzufuegen
|
||||||
if (a.isWildcardable()) {
|
if (a.isWildcardable()) {
|
||||||
Set<UnifyType> smaller_ext = smaller.stream().filter(x -> !(x instanceof ExtendsType) && !(x instanceof SuperType))
|
Set<UnifyType> smaller_ext = smaller.stream().filter(x -> !(x instanceof ExtendsType) && !(x instanceof SuperType))
|
||||||
@@ -2148,16 +2203,14 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
}
|
}
|
||||||
resultPrime.addAll(substitutionSet);
|
resultPrime.addAll(substitutionSet);
|
||||||
//writeLog("Substitution: " + substitutionSet.toString());
|
//writeLog("Substitution: " + substitutionSet.toString());
|
||||||
resultPrime = resultPrime.stream().map(x -> { x.setVariance(variance); return x;}).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
result.add(resultPrime);
|
result.add(resultPrime);
|
||||||
//writeLog("Result: " + resultPrime.toString());
|
//writeLog("Result: " + resultPrime.toString());
|
||||||
//writeLog("MAX: " + oup.max(resultPrime.iterator()).toString());
|
//writeLog("MAX: " + oup.max(resultPrime.iterator()).toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
writeLog("result von " + pair + ": " + result.toString());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2167,7 +2220,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
private Set<Set<UnifyPair>> unifyCase2(UnifyPair pair, IFiniteClosure fc) {
|
private Set<Set<UnifyPair>> unifyCase2(UnifyPair pair, IFiniteClosure fc) {
|
||||||
PlaceholderType a = (PlaceholderType) pair.getLhsType();
|
PlaceholderType a = (PlaceholderType) pair.getLhsType();
|
||||||
ExtendsType extThetaPrime = (ExtendsType) pair.getRhsType();
|
ExtendsType extThetaPrime = (ExtendsType) pair.getRhsType();
|
||||||
byte variance = pair.getVariance();
|
|
||||||
Set<Set<UnifyPair>> result = new HashSet<>();
|
Set<Set<UnifyPair>> result = new HashSet<>();
|
||||||
|
|
||||||
UnifyType aPrime = PlaceholderType.freshPlaceholder();
|
UnifyType aPrime = PlaceholderType.freshPlaceholder();
|
||||||
@@ -2182,7 +2234,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
resultPrime = new HashSet<>();
|
resultPrime = new HashSet<>();
|
||||||
resultPrime.add(new UnifyPair(a, extAPrime, PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(a, extAPrime, PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
||||||
resultPrime.add(new UnifyPair(aPrime, thetaPrime, PairOperator.SMALLERDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(aPrime, thetaPrime, PairOperator.SMALLERDOT, pair.getSubstitution(), pair));
|
||||||
resultPrime = resultPrime.stream().map(x -> { x.setVariance(variance); return x;}).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
result.add(resultPrime);
|
result.add(resultPrime);
|
||||||
//writeLog("Result: " + resultPrime.toString());
|
//writeLog("Result: " + resultPrime.toString());
|
||||||
return result;
|
return result;
|
||||||
@@ -2195,7 +2246,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
PlaceholderType a = (PlaceholderType) pair.getLhsType();
|
PlaceholderType a = (PlaceholderType) pair.getLhsType();
|
||||||
a.reversVariance();
|
a.reversVariance();
|
||||||
SuperType subThetaPrime = (SuperType) pair.getRhsType();
|
SuperType subThetaPrime = (SuperType) pair.getRhsType();
|
||||||
byte variance = pair.getVariance();
|
|
||||||
Set<Set<UnifyPair>> result = new HashSet<>();
|
Set<Set<UnifyPair>> result = new HashSet<>();
|
||||||
|
|
||||||
UnifyType aPrime = PlaceholderType.freshPlaceholder();
|
UnifyType aPrime = PlaceholderType.freshPlaceholder();
|
||||||
@@ -2211,7 +2261,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
resultPrime = new HashSet<>();
|
resultPrime = new HashSet<>();
|
||||||
resultPrime.add(new UnifyPair(a, supAPrime, PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(a, supAPrime, PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
||||||
resultPrime.add(new UnifyPair(thetaPrime, aPrime, PairOperator.SMALLERDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(thetaPrime, aPrime, PairOperator.SMALLERDOT, pair.getSubstitution(), pair));
|
||||||
resultPrime = resultPrime.stream().map(x -> { x.setVariance(variance); return x;}).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
result.add(resultPrime);
|
result.add(resultPrime);
|
||||||
//writeLog(resultPrime.toString());
|
//writeLog(resultPrime.toString());
|
||||||
|
|
||||||
@@ -2224,7 +2273,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
private Set<Set<UnifyPair>> unifyCase5(UnifyPair pair, IFiniteClosure fc) {
|
private Set<Set<UnifyPair>> unifyCase5(UnifyPair pair, IFiniteClosure fc) {
|
||||||
UnifyType theta = pair.getLhsType();
|
UnifyType theta = pair.getLhsType();
|
||||||
PlaceholderType a = (PlaceholderType) pair.getRhsType();
|
PlaceholderType a = (PlaceholderType) pair.getRhsType();
|
||||||
byte variance = pair.getVariance();
|
|
||||||
Set<Set<UnifyPair>> result = new HashSet<>();
|
Set<Set<UnifyPair>> result = new HashSet<>();
|
||||||
|
|
||||||
boolean allGen = theta.getTypeParams().size() > 0;
|
boolean allGen = theta.getTypeParams().size() > 0;
|
||||||
@@ -2288,7 +2336,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
resultPrime.add(new UnifyPair(a, thetaS, PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(a, thetaS, PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
||||||
else
|
else
|
||||||
resultPrime.add(new UnifyPair(a, thetaS.setTypeParams(new TypeParams(freshTphs)), PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(a, thetaS.setTypeParams(new TypeParams(freshTphs)), PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
||||||
resultPrime = resultPrime.stream().map(x -> { x.setVariance(variance); return x;}).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
result.add(resultPrime);
|
result.add(resultPrime);
|
||||||
//writeLog("FBOUNDED2: " + pair.getfBounded());
|
//writeLog("FBOUNDED2: " + pair.getfBounded());
|
||||||
//writeLog("resultPrime Theta < a: " + greater + pair + "THETA: " + theta + "FBOUNDED: " + pair.getfBounded() + " " + resultPrime.toString());
|
//writeLog("resultPrime Theta < a: " + greater + pair + "THETA: " + theta + "FBOUNDED: " + pair.getfBounded() + " " + resultPrime.toString());
|
||||||
@@ -2303,7 +2350,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
private Set<Set<UnifyPair>> unifyCase8(UnifyPair pair, IFiniteClosure fc) {
|
private Set<Set<UnifyPair>> unifyCase8(UnifyPair pair, IFiniteClosure fc) {
|
||||||
UnifyType theta = pair.getLhsType();
|
UnifyType theta = pair.getLhsType();
|
||||||
PlaceholderType a = (PlaceholderType) pair.getRhsType();
|
PlaceholderType a = (PlaceholderType) pair.getRhsType();
|
||||||
byte variance = pair.getVariance();
|
|
||||||
Set<Set<UnifyPair>> result = new HashSet<>();
|
Set<Set<UnifyPair>> result = new HashSet<>();
|
||||||
//for(UnifyType thetaS : fc.grArg(theta)) {
|
//for(UnifyType thetaS : fc.grArg(theta)) {
|
||||||
Set<UnifyPair> resultPrime = new HashSet<>();
|
Set<UnifyPair> resultPrime = new HashSet<>();
|
||||||
@@ -2324,7 +2370,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
resultPrime = new HashSet<>();
|
resultPrime = new HashSet<>();
|
||||||
resultPrime.add(new UnifyPair(a, new SuperType(freshTph), PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(a, new SuperType(freshTph), PairOperator.EQUALSDOT, pair.getSubstitution(), pair));
|
||||||
resultPrime.add(new UnifyPair(freshTph, theta, PairOperator.SMALLERDOT, pair.getSubstitution(), pair));
|
resultPrime.add(new UnifyPair(freshTph, theta, PairOperator.SMALLERDOT, pair.getSubstitution(), pair));
|
||||||
resultPrime = resultPrime.stream().map(x -> { x.setVariance(variance); return x;}).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
result.add(resultPrime);
|
result.add(resultPrime);
|
||||||
//writeLog(resultPrime.toString());
|
//writeLog(resultPrime.toString());
|
||||||
//}
|
//}
|
||||||
|
@@ -711,13 +711,15 @@ implements IFiniteClosure {
|
|||||||
HashSet<UnifyPair> hs = new HashSet<>();
|
HashSet<UnifyPair> hs = new HashSet<>();
|
||||||
hs.add(up);
|
hs.add(up);
|
||||||
Set<UnifyPair> smallerRes = unifyTask.applyTypeUnificationRules(hs, this);
|
Set<UnifyPair> smallerRes = unifyTask.applyTypeUnificationRules(hs, this);
|
||||||
if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
|
/*
|
||||||
|
//if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
|
||||||
{try {
|
{try {
|
||||||
logFile.write("\nsmallerRes: " + smallerRes);//"smallerHash: " + greaterHash.toString());
|
logFile.write("\nsmallerRes: " + smallerRes);//"smallerHash: " + greaterHash.toString());
|
||||||
logFile.flush();
|
logFile.flush();
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
System.err.println("no LogFile");}}
|
System.err.println("no LogFile");}}
|
||||||
|
*/
|
||||||
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
|
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
|
||||||
Predicate<UnifyPair> delFun = x -> !((x.getLhsType() instanceof PlaceholderType ||
|
Predicate<UnifyPair> delFun = x -> !((x.getLhsType() instanceof PlaceholderType ||
|
||||||
x.getRhsType() instanceof PlaceholderType)
|
x.getRhsType() instanceof PlaceholderType)
|
||||||
@@ -732,13 +734,15 @@ implements IFiniteClosure {
|
|||||||
hs = new HashSet<>();
|
hs = new HashSet<>();
|
||||||
hs.add(up);
|
hs.add(up);
|
||||||
Set<UnifyPair> greaterRes = unifyTask.applyTypeUnificationRules(hs, this);
|
Set<UnifyPair> greaterRes = unifyTask.applyTypeUnificationRules(hs, this);
|
||||||
if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
|
/*
|
||||||
|
//if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
|
||||||
{try {
|
{try {
|
||||||
logFile.write("\ngreaterRes: " + greaterRes);//"smallerHash: " + greaterHash.toString());
|
logFile.write("\ngreaterRes: " + greaterRes);//"smallerHash: " + greaterHash.toString());
|
||||||
logFile.flush();
|
logFile.flush();
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
System.err.println("no LogFile");}}
|
System.err.println("no LogFile");}}
|
||||||
|
*/
|
||||||
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
|
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
|
||||||
long greaterLen = greaterRes.stream().filter(delFun).count();
|
long greaterLen = greaterRes.stream().filter(delFun).count();
|
||||||
if (greaterLen == 0) return 1;
|
if (greaterLen == 0) return 1;
|
||||||
|
@@ -293,24 +293,25 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
|
|||||||
} else {
|
} else {
|
||||||
if (leftlewc.size() > 0) {
|
if (leftlewc.size() > 0) {
|
||||||
Set<UnifyPair> subst;
|
Set<UnifyPair> subst;
|
||||||
if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
subst = leftlewc.stream().map(x -> {
|
||||||
subst = leftlewc.stream().map(x -> new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
if (x.getLhsType() instanceof PlaceholderType) {
|
||||||
|
return new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
subst = leftlewc.stream().map(x -> new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
return new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT);
|
||||||
}
|
}}).collect(Collectors.toCollection(HashSet::new));
|
||||||
Unifier uni = new Unifier();
|
Unifier uni = new Unifier();
|
||||||
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
|
||||||
lseq = uni.apply(lseq);
|
lseq = uni.apply(lseq);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Set<UnifyPair> subst;
|
Set<UnifyPair> subst;
|
||||||
if (rightlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
subst = rightlewc.stream().map(x -> {
|
||||||
subst = rightlewc.stream().map(x -> new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
if (x.getLhsType() instanceof PlaceholderType) {
|
||||||
|
return new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
subst = rightlewc.stream().map(x -> new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
return new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT);
|
||||||
}
|
}}).collect(Collectors.toCollection(HashSet::new));
|
||||||
Unifier uni = new Unifier();
|
Unifier uni = new Unifier();
|
||||||
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
||||||
rseq = uni.apply(rseq);
|
rseq = uni.apply(rseq);
|
||||||
|
@@ -29,15 +29,6 @@ public class UnifyPair {
|
|||||||
*/
|
*/
|
||||||
private PairOperator pairOp;
|
private PairOperator pairOp;
|
||||||
|
|
||||||
/** wieder loesecn wird nicht mehr benoetigt PL 2018-03-31
|
|
||||||
* variance shows the variance of the pair
|
|
||||||
* -1: contravariant
|
|
||||||
* 1 covariant
|
|
||||||
* 0 invariant
|
|
||||||
* PL 2018-03-21
|
|
||||||
*/
|
|
||||||
private byte variance = 0;
|
|
||||||
|
|
||||||
private boolean undefinedPair = false;
|
private boolean undefinedPair = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,7 +74,6 @@ public class UnifyPair {
|
|||||||
pairOp = op;
|
pairOp = op;
|
||||||
substitution = uni;
|
substitution = uni;
|
||||||
basePair = base;
|
basePair = base;
|
||||||
this.variance = variance;
|
|
||||||
|
|
||||||
|
|
||||||
// Caching hashcode
|
// Caching hashcode
|
||||||
@@ -125,14 +115,6 @@ public class UnifyPair {
|
|||||||
substitution.addAll(sup);
|
substitution.addAll(sup);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte getVariance() {
|
|
||||||
return variance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVariance(byte v) {
|
|
||||||
variance = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUndefinedPair() {
|
public void setUndefinedPair() {
|
||||||
undefinedPair = true;
|
undefinedPair = true;
|
||||||
}
|
}
|
||||||
@@ -213,12 +195,14 @@ public class UnifyPair {
|
|||||||
if (other.getBasePair() != basePair || (other.getBasePair() == null && basePair == null)) {
|
if (other.getBasePair() != basePair || (other.getBasePair() == null && basePair == null)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!other.getBasePair().equals(basePair) ||
|
if (!other.getBasePair().equals(basePair) ||
|
||||||
!other.getAllSubstitutions().equals(getAllSubstitutions())) {
|
!other.getAllSubstitutions().equals(getAllSubstitutions())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return other.getPairOp() == pairOp
|
return other.getPairOp() == pairOp
|
||||||
&& other.getLhsType().equals(lhs)
|
&& other.getLhsType().equals(lhs)
|
||||||
&& other.getRhsType().equals(rhs);
|
&& other.getRhsType().equals(rhs);
|
||||||
|
@@ -1,52 +0,0 @@
|
|||||||
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.Clingo;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
|
||||||
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 javax.json.Json;
|
|
||||||
import javax.json.JsonObject;
|
|
||||||
import java.io.*;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
public class ClingoTest {
|
|
||||||
public static final String tempDirectory = "/tmp/";
|
|
||||||
private final TypePlaceholder testType = TypePlaceholder.fresh(new NullToken());
|
|
||||||
@Test
|
|
||||||
public void test() throws IOException, InterruptedException, ClassNotFoundException {
|
|
||||||
String content = "";
|
|
||||||
content = ASPFactory.generateASP(this.getPairs(), this.getFC());
|
|
||||||
|
|
||||||
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();
|
|
||||||
System.out.println(result);
|
|
||||||
ResultSet resultSet = ASPParser.parse(result, Arrays.asList(testType));
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric resolvedType = resultSet.resolveType(testType).resolvedType;
|
|
||||||
assert resolvedType.toString().equals(ASTFactory.createObjectType().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
public Collection<ClassOrInterface> getFC() {
|
|
||||||
Set<ClassOrInterface> ret = new HashSet<>();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConstraintSet<Pair> getPairs() {
|
|
||||||
ConstraintSet<Pair> ret = new ConstraintSet<>();
|
|
||||||
ret.addUndConstraint(new Pair(testType, ASTFactory.createObjectType(), PairOperator.EQUALSDOT));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,103 +0,0 @@
|
|||||||
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.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;
|
|
||||||
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.sql.Ref;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
public class UnifyWithoutWildcards {
|
|
||||||
|
|
||||||
public static final String tempDirectory = "/tmp/";
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void adapt() throws InterruptedException, IOException, ClassNotFoundException {
|
|
||||||
ConstraintSet<Pair> testSet = new ConstraintSet<>();
|
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken()));
|
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> 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));
|
|
||||||
ResultSet resultSet = run(testSet);
|
|
||||||
System.out.println(ResultSetPrinter.print(resultSet));
|
|
||||||
assert resultSet.results.size() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResultSet run(ConstraintSet<Pair> toTest) throws IOException, InterruptedException, ClassNotFoundException {
|
|
||||||
String content = "";
|
|
||||||
content = ASPFactory.generateASP(toTest, this.getFC());
|
|
||||||
|
|
||||||
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<List<TypePlaceholder>>{
|
|
||||||
@Override
|
|
||||||
public List<TypePlaceholder> visit(RefType refType) {
|
|
||||||
ArrayList<TypePlaceholder> ret = new ArrayList<>();
|
|
||||||
for(RefTypeOrTPHOrWildcardOrGeneric param : refType.getParaList()){
|
|
||||||
ret.addAll(param.acceptTV(this));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<TypePlaceholder> visit(SuperWildcardType superWildcardType) {
|
|
||||||
return superWildcardType.getInnerType().acceptTV(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<TypePlaceholder> visit(TypePlaceholder typePlaceholder) {
|
|
||||||
return Arrays.asList(typePlaceholder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<TypePlaceholder> visit(ExtendsWildcardType extendsWildcardType) {
|
|
||||||
return extendsWildcardType.getInnerType().acceptTV(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<TypePlaceholder> visit(GenericRefType genericRefType) {
|
|
||||||
return new ArrayList<>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Collection<TypePlaceholder> getInvolvedTPHS(ConstraintSet<Pair> toTest) {
|
|
||||||
List<TypePlaceholder> 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Collection<ClassOrInterface> getFC() {
|
|
||||||
Set<ClassOrInterface> 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<A> extends HashMap<A,Map<Integer, A>>{}
|
|
||||||
}
|
|
@@ -1,63 +0,0 @@
|
|||||||
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 simple() throws ClassNotFoundException {
|
|
||||||
ConstraintSet<Pair> testSet = new ConstraintSet<>();
|
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken()));
|
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> 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<Pair> testSet = new ConstraintSet<>();
|
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> list1 = Arrays.asList(TypePlaceholder.fresh(new NullToken()));
|
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> 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<ClassOrInterface> getFC() {
|
|
||||||
Set<ClassOrInterface> 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<Vector<Integer>> {}
|
|
@@ -1,70 +0,0 @@
|
|||||||
package asp.typeinference;
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.core.JavaTXCompiler;
|
|
||||||
import de.dhbwstuttgart.sat.asp.writer.ASPFactory;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
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 {
|
|
||||||
|
|
||||||
public static final String rootDirectory = System.getProperty("user.dir")+"/src/test/resources/javFiles/";
|
|
||||||
private static final List<File> filesToTest = new ArrayList<>();
|
|
||||||
protected File fileToTest = null;
|
|
||||||
|
|
||||||
public ASPTest(){
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@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"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"fc.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"Lambda.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"Lambda2.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"Lambda3.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"Vector.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"Generics.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"MethodsEasy.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"Matrix.jav"));
|
|
||||||
//filesToTest.add(new File(rootDirectory+"Import.jav"));
|
|
||||||
JavaTXCompiler compiler = new JavaTXCompiler(fileToTest);
|
|
||||||
Set<ClassOrInterface> allClasses = new HashSet<>();
|
|
||||||
for(SourceFile sf : compiler.sourceFiles.values()) {
|
|
||||||
allClasses.addAll(compiler.getAvailableClasses(sf));
|
|
||||||
}
|
|
||||||
for(SourceFile sf : compiler.sourceFiles.values()) {
|
|
||||||
allClasses.addAll(sf.getClasses());
|
|
||||||
}
|
|
||||||
|
|
||||||
final ConstraintSet<Pair> cons = compiler.getConstraints();
|
|
||||||
String asp = ASPFactory.generateASP(cons, allClasses);
|
|
||||||
System.out.println(asp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static String readFile(String path, Charset encoding)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
|
||||||
return new String(encoded, encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@@ -1,9 +0,0 @@
|
|||||||
package asp.typeinference;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
public class GenericsTest extends ASPTest {
|
|
||||||
public GenericsTest() {
|
|
||||||
this.fileToTest = new File(rootDirectory+"Generics.jav");
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,9 +0,0 @@
|
|||||||
package asp.typeinference;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
public class VectorTest extends ASPTest {
|
|
||||||
public VectorTest() {
|
|
||||||
this.fileToTest = new File(rootDirectory+"Vector.jav");
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,10 +0,0 @@
|
|||||||
package asp.unifywithoutwildcards;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class ASPTests {
|
|
||||||
@Test
|
|
||||||
public void test(){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@@ -37,14 +37,14 @@ public class BinaryTest {
|
|||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
Method m2 = classToTest.getDeclaredMethod("m2", Integer.class,Integer.class);
|
Method m2 = classToTest.getDeclaredMethod("m2", Integer.class,Integer.class);
|
||||||
Integer res = (Integer) m2.invoke(instanceOfClass, 2,3);
|
Integer res = (Integer) m2.invoke(instanceOfClass, 2,3);
|
||||||
assertEquals(6, res);
|
assertEquals(new Integer(6), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testM3() throws Exception {
|
public void testM3() throws Exception {
|
||||||
Method m3 = classToTest.getDeclaredMethod("m3", Integer.class);
|
Method m3 = classToTest.getDeclaredMethod("m3", Integer.class);
|
||||||
Integer res = (Integer) m3.invoke(instanceOfClass, 2);
|
Integer res = (Integer) m3.invoke(instanceOfClass, 2);
|
||||||
assertEquals(4, res);
|
assertEquals(new Integer(4), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -38,7 +38,7 @@ public class FacTest {
|
|||||||
public void testInteger() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testInteger() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method getFac = classToTest.getDeclaredMethod("getFac", Integer.class);
|
Method getFac = classToTest.getDeclaredMethod("getFac", Integer.class);
|
||||||
Integer result = (Integer) getFac.invoke(instanceOfClass,3);
|
Integer result = (Integer) getFac.invoke(instanceOfClass,3);
|
||||||
assertEquals(result, 6);
|
assertEquals(result, new Integer(6));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -51,7 +51,7 @@ public class FacultyTest {
|
|||||||
// Integer result = (Integer) apply.invoke(lambda,i);
|
// Integer result = (Integer) apply.invoke(lambda,i);
|
||||||
Integer result = (Integer) getFact.invoke(instanceOfClass,i);
|
Integer result = (Integer) getFact.invoke(instanceOfClass,i);
|
||||||
|
|
||||||
assertEquals(6, result);
|
assertEquals(new Integer(6), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -40,7 +40,7 @@ public class FieldTphConsMethTest {
|
|||||||
Field a = classToTest.getDeclaredField("a");
|
Field a = classToTest.getDeclaredField("a");
|
||||||
a.setAccessible(true);
|
a.setAccessible(true);
|
||||||
|
|
||||||
Method m = classToTest.getDeclaredMethod("m", Object.class);
|
Method m = classToTest.getDeclaredMethod("id", Object.class);
|
||||||
Object result = m.invoke(instanceOfClass, 42);
|
Object result = m.invoke(instanceOfClass, 42);
|
||||||
|
|
||||||
assertEquals(42,result);
|
assertEquals(42,result);
|
||||||
|
@@ -8,9 +8,10 @@ import java.net.URL;
|
|||||||
import java.net.URLClassLoader;
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.core.JavaTXCompiler;
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class IdTest {
|
public class IdTest {
|
||||||
|
|
||||||
|
@@ -43,7 +43,7 @@ public class LambdaTest {
|
|||||||
System.out.println(m.invoke(instanceOfClass).toString());
|
System.out.println(m.invoke(instanceOfClass).toString());
|
||||||
Integer result = (Integer) apply.invoke(m.invoke(instanceOfClass), i);
|
Integer result = (Integer) apply.invoke(m.invoke(instanceOfClass), i);
|
||||||
|
|
||||||
assertEquals(77, result);
|
assertEquals(i, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -29,19 +29,19 @@ public class MatrixOpTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IOException, InstantiationException, NoSuchFieldException {
|
public void test() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IOException, InstantiationException, NoSuchFieldException {
|
||||||
path = System.getProperty("user.dir")+"/src/test/resources/bytecode/javFiles/MatrixOP.jav";
|
path = System.getProperty("user.dir") + "/src/test/resources/bytecode/javFiles/MatrixOP.jav";
|
||||||
fileToTest = new File(path);
|
fileToTest = new File(path);
|
||||||
compiler = new JavaTXCompiler(fileToTest);
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/";
|
pathToClassFile = System.getProperty("user.dir") + "/src/test/resources/testBytecode/generatedBC/";
|
||||||
compiler.generateBytecode(pathToClassFile);
|
compiler.generateBytecode(pathToClassFile);
|
||||||
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
loader = new URLClassLoader(new URL[]{new URL("file://" + pathToClassFile)});
|
||||||
classToTest = loader.loadClass("MatrixOP");
|
classToTest = loader.loadClass("MatrixOP");
|
||||||
|
|
||||||
Vector<Vector<Integer>> vv = new Vector<Vector<Integer>>();
|
Vector<Vector<Integer>> vv = new Vector<Vector<Integer>>();
|
||||||
Vector<Integer> v1 = new Vector<Integer> ();
|
Vector<Integer> v1 = new Vector<Integer>();
|
||||||
v1.addElement(2);
|
v1.addElement(2);
|
||||||
v1.addElement(2);
|
v1.addElement(2);
|
||||||
Vector<Integer> v2 = new Vector<Integer> ();
|
Vector<Integer> v2 = new Vector<Integer>();
|
||||||
v2.addElement(3);
|
v2.addElement(3);
|
||||||
v2.addElement(3);
|
v2.addElement(3);
|
||||||
//Matrix m1 = new Matrix();
|
//Matrix m1 = new Matrix();
|
||||||
@@ -53,10 +53,10 @@ public class MatrixOpTest {
|
|||||||
instanceOfClass_m1 = classToTest.getDeclaredConstructor(Vector.class).newInstance(vv); //Matrix m1 = new Matrix(vv);
|
instanceOfClass_m1 = classToTest.getDeclaredConstructor(Vector.class).newInstance(vv); //Matrix m1 = new Matrix(vv);
|
||||||
|
|
||||||
Vector<Vector<Integer>> vv1 = new Vector<Vector<Integer>>();
|
Vector<Vector<Integer>> vv1 = new Vector<Vector<Integer>>();
|
||||||
Vector<Integer> v3 = new Vector<Integer> ();
|
Vector<Integer> v3 = new Vector<Integer>();
|
||||||
v3.addElement(2);
|
v3.addElement(2);
|
||||||
v3.addElement(2);
|
v3.addElement(2);
|
||||||
Vector<Integer> v4 = new Vector<Integer> ();
|
Vector<Integer> v4 = new Vector<Integer>();
|
||||||
v4.addElement(3);
|
v4.addElement(3);
|
||||||
v4.addElement(3);
|
v4.addElement(3);
|
||||||
//Matrix m2 = new Matrix();
|
//Matrix m2 = new Matrix();
|
||||||
@@ -68,7 +68,6 @@ public class MatrixOpTest {
|
|||||||
instanceOfClass_m2 = classToTest.getDeclaredConstructor(Vector.class).newInstance(vv1);//Matrix m2 = new Matrix(vv1);
|
instanceOfClass_m2 = classToTest.getDeclaredConstructor(Vector.class).newInstance(vv1);//Matrix m2 = new Matrix(vv1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Matrix m3 = m1.mul(vv1);
|
//Matrix m3 = m1.mul(vv1);
|
||||||
// Method mul = classToTest.getDeclaredMethod("mul", Vector.class);
|
// Method mul = classToTest.getDeclaredMethod("mul", Vector.class);
|
||||||
// Object result = mul.invoke(instanceOfClass_m1, instanceOfClass_m2);
|
// Object result = mul.invoke(instanceOfClass_m1, instanceOfClass_m2);
|
||||||
@@ -76,18 +75,18 @@ public class MatrixOpTest {
|
|||||||
mul.setAccessible(true);
|
mul.setAccessible(true);
|
||||||
|
|
||||||
Class<?> lambda = mul.get(instanceOfClass_m1).getClass();
|
Class<?> lambda = mul.get(instanceOfClass_m1).getClass();
|
||||||
Method apply = lambda.getMethod("apply", Object.class,Object.class);
|
Method apply = lambda.getMethod("apply", Object.class, Object.class);
|
||||||
// Damit man auf die Methode zugreifen kann
|
// Damit man auf die Methode zugreifen kann
|
||||||
apply.setAccessible(true);
|
apply.setAccessible(true);
|
||||||
|
|
||||||
Object result = apply.invoke(mul.get(instanceOfClass_m1),instanceOfClass_m1, instanceOfClass_m2);
|
Object result = apply.invoke(mul.get(instanceOfClass_m1), instanceOfClass_m1, instanceOfClass_m2);
|
||||||
System.out.println(instanceOfClass_m1.toString() + " * " + instanceOfClass_m2.toString() + " = " + result.toString());
|
System.out.println(instanceOfClass_m1.toString() + " * " + instanceOfClass_m2.toString() + " = " + result.toString());
|
||||||
|
|
||||||
Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
|
Vector<Vector<Integer>> res = new Vector<Vector<Integer>>();
|
||||||
Vector<Integer> v5 = new Vector<Integer> ();
|
Vector<Integer> v5 = new Vector<Integer>();
|
||||||
v5.addElement(10);
|
v5.addElement(10);
|
||||||
v5.addElement(10);
|
v5.addElement(10);
|
||||||
Vector<Integer> v6 = new Vector<Integer> ();
|
Vector<Integer> v6 = new Vector<Integer>();
|
||||||
v6.addElement(15);
|
v6.addElement(15);
|
||||||
v6.addElement(15);
|
v6.addElement(15);
|
||||||
//Matrix m2 = new Matrix();
|
//Matrix m2 = new Matrix();
|
||||||
|
@@ -85,7 +85,6 @@ public class MatrixTest {
|
|||||||
res.addElement(v6);
|
res.addElement(v6);
|
||||||
instanceOfClass_m3 = classToTest.getDeclaredConstructor(Vector.class).newInstance(res);
|
instanceOfClass_m3 = classToTest.getDeclaredConstructor(Vector.class).newInstance(res);
|
||||||
assertEquals(result, instanceOfClass_m3);
|
assertEquals(result, instanceOfClass_m3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -7,11 +7,14 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLClassLoader;
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.genericsGeneratorTypes.GenericGenratorResultForSourceFile;
|
||||||
import de.dhbwstuttgart.core.JavaTXCompiler;
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
public class OLTest {
|
public class OLTest {
|
||||||
private static String path;
|
private static String path;
|
||||||
@@ -30,7 +33,9 @@ public class OLTest {
|
|||||||
fileToTest = new File(path);
|
fileToTest = new File(path);
|
||||||
compiler = new JavaTXCompiler(fileToTest);
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/";
|
pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/";
|
||||||
compiler.generateBytecode(pathToClassFile);
|
List<ResultSet> typeinferenceResult = compiler.typeInference();
|
||||||
|
List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles = compiler.getGeneratedGenericResultsForAllSourceFiles(typeinferenceResult);
|
||||||
|
compiler.generateBytecode(new File(pathToClassFile),typeinferenceResult,simplifyResultsForAllSourceFiles);
|
||||||
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
classToTest = loader.loadClass("OL");
|
classToTest = loader.loadClass("OL");
|
||||||
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
@@ -47,14 +52,14 @@ public class OLTest {
|
|||||||
public void testmInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testmInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method m = classToTest.getDeclaredMethod("m", Integer.class);
|
Method m = classToTest.getDeclaredMethod("m", Integer.class);
|
||||||
Integer result = (Integer) m.invoke(instanceOfClass, 5);
|
Integer result = (Integer) m.invoke(instanceOfClass, 5);
|
||||||
assertEquals(10, result);
|
assertEquals(new Integer(10), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testmDouble() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testmDouble() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method m = classToTest.getDeclaredMethod("m", Double.class);
|
Method m = classToTest.getDeclaredMethod("m", Double.class);
|
||||||
Double result = (Double) m.invoke(instanceOfClass, 5.0);
|
Double result = (Double) m.invoke(instanceOfClass, 5.0);
|
||||||
assertEquals(10.0, result);
|
assertEquals(new Double(10.0), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -73,14 +78,14 @@ public class OLTest {
|
|||||||
public void testmainInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testmainInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method main = classToTest1.getDeclaredMethod("main", Integer.class);
|
Method main = classToTest1.getDeclaredMethod("main", Integer.class);
|
||||||
Integer result = (Integer) main.invoke(instanceOfClass1, 5);
|
Integer result = (Integer) main.invoke(instanceOfClass1, 5);
|
||||||
assertEquals(10, result);
|
assertEquals(new Integer(10), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testmainDouble() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testmainDouble() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method main = classToTest1.getDeclaredMethod("main", Double.class);
|
Method main = classToTest1.getDeclaredMethod("main", Double.class);
|
||||||
Double result = (Double) main.invoke(instanceOfClass1, 5.0);
|
Double result = (Double) main.invoke(instanceOfClass1, 5.0);
|
||||||
assertEquals(10.0, result);
|
assertEquals(new Double(10.0), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@@ -54,7 +54,7 @@ public class OpTest {
|
|||||||
|
|
||||||
Integer result = (Integer) m.invoke(instanceOfClass, 7,3);
|
Integer result = (Integer) m.invoke(instanceOfClass, 7,3);
|
||||||
|
|
||||||
assertEquals(10, result);
|
assertEquals(new Integer(10), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -38,28 +38,28 @@ public class PostIncTest {
|
|||||||
public void testM1() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testM1() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method m = classToTest.getDeclaredMethod("m");
|
Method m = classToTest.getDeclaredMethod("m");
|
||||||
Integer res = (Integer) m.invoke(instanceOfClass);
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
assertEquals(1, res);
|
assertEquals(new Integer(1), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testM2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testM2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method m = classToTest.getDeclaredMethod("m2");
|
Method m = classToTest.getDeclaredMethod("m2");
|
||||||
Integer res = (Integer) m.invoke(instanceOfClass);
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
assertEquals(0, res);
|
assertEquals(new Integer(0), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testD1() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testD1() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method m = classToTest.getDeclaredMethod("d");
|
Method m = classToTest.getDeclaredMethod("d");
|
||||||
Integer res = (Integer) m.invoke(instanceOfClass);
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
assertEquals(-1, res);
|
assertEquals(new Integer(-1), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testD2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
public void testD2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
Method m = classToTest.getDeclaredMethod("d2");
|
Method m = classToTest.getDeclaredMethod("d2");
|
||||||
Integer res = (Integer) m.invoke(instanceOfClass);
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
assertEquals(0, res);
|
assertEquals(new Integer(0), res);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user