forked from JavaTX/JavaCompilerCore
Compare commits
126 Commits
unify-test
...
addPackage
Author | SHA1 | Date | |
---|---|---|---|
|
e634f2ca67 | ||
|
c964fa7ce2 | ||
|
941a3bed66 | ||
|
653901ef32 | ||
|
2e03b5b10c | ||
|
670e3ed99f | ||
|
c8ece0a010 | ||
|
c27e1fa4e1 | ||
|
b3b25b7869 | ||
|
9240b0d163 | ||
|
a0a813f87c | ||
|
60b182b9b1 | ||
|
8e2d4e1c70 | ||
|
907ab2fcec | ||
|
eb27003515 | ||
|
71c801c19c | ||
|
ba750187ba | ||
|
ccf5df1f1e | ||
|
3de735ebe3 | ||
|
fd3d4e97a1 | ||
|
6deeb4105f | ||
|
9d4980d9a1 | ||
|
b83e2c10e3 | ||
|
4f10e789d4 | ||
|
8b9f0d6376 | ||
|
3f919be1bf | ||
|
97bdfe1d3a | ||
|
7c7dbf3769 | ||
|
577faa88af | ||
|
8bdb7e7b13 | ||
|
eca187da79 | ||
|
850af6a6ae | ||
|
ed1bb44089 | ||
|
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 |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -23,3 +23,9 @@ bin
|
|||||||
|
|
||||||
#
|
#
|
||||||
manually/
|
manually/
|
||||||
|
|
||||||
|
logFiles/**
|
||||||
|
!logFiles/.gitkeep
|
||||||
|
|
||||||
|
src/main/java/de/dhbwstuttgart/parser/antlr/
|
||||||
|
src/main/java/de/dhbwstuttgart/sat/asp/parser/antlr/
|
||||||
|
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
12
pom.xml
12
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>
|
||||||
@@ -75,7 +75,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
|
|||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<sourceDirectory>src/main/antlr4/java8</sourceDirectory>
|
<sourceDirectory>src/main/antlr4/java8</sourceDirectory>
|
||||||
<outputDirectory>${project.basedir}/target/generated-sources/antlr4/de/dhbwstuttgart/parser/antlr</outputDirectory>
|
<outputDirectory>${project.basedir}/src/main/java/de/dhbwstuttgart/parser/antlr</outputDirectory>
|
||||||
<arguments>
|
<arguments>
|
||||||
<argument>-package</argument>
|
<argument>-package</argument>
|
||||||
<argument>de.dhbwstuttgart.parser.antlr</argument>
|
<argument>de.dhbwstuttgart.parser.antlr</argument>
|
||||||
@@ -89,7 +89,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
|
|||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<sourceDirectory>src/main/antlr4/sat</sourceDirectory>
|
<sourceDirectory>src/main/antlr4/sat</sourceDirectory>
|
||||||
<outputDirectory>${project.basedir}/target/generated-sources/antlr4/de/dhbwstuttgart/sat/asp/parser/antlr</outputDirectory>
|
<outputDirectory>${project.basedir}/src/main/java/de/dhbwstuttgart/sat/asp/parser/antlr</outputDirectory>
|
||||||
<arguments>
|
<arguments>
|
||||||
<argument>-package</argument>
|
<argument>-package</argument>
|
||||||
<argument>de.dhbwstuttgart.sat.asp.parser.antlr</argument>
|
<argument>de.dhbwstuttgart.sat.asp.parser.antlr</argument>
|
||||||
@@ -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,14 @@
|
|||||||
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.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 +16,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 +74,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 +83,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 +97,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 +107,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 ClassLoader 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, ClassLoader 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 +147,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 +174,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 +214,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 +225,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 +253,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 +273,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 +288,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 +339,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 +430,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,93 +1,166 @@
|
|||||||
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);
|
||||||
|
|
||||||
|
sw.visitFormalTypeParameter("R");
|
||||||
|
// getBounds vom Return-Type
|
||||||
|
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
||||||
|
sw.visitClassBound().visitEnd();
|
||||||
|
// TODO: prüfe ob Return-Type = void,
|
||||||
|
sw.visitSuperclass().visitClassType(Type.getInternalName(Object.class));
|
||||||
|
sw.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void defineTypeVariablesForParametersOfFunN(int numberOfParams) {
|
||||||
for (int i = 0; i < numberOfParams; i++) {
|
for (int i = 0; i < numberOfParams; i++) {
|
||||||
int j = i + 1;
|
int j = i + 1;
|
||||||
sw.visitFormalTypeParameter("T" + j);
|
sw.visitFormalTypeParameter("T" + j);
|
||||||
@@ -95,221 +168,42 @@ public class Signature {
|
|||||||
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
||||||
sw.visitClassBound().visitEnd();
|
sw.visitClassBound().visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
sw.visitFormalTypeParameter("R");
|
|
||||||
// getBounds vom Return-Type
|
|
||||||
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
|
||||||
sw.visitClassBound().visitEnd();
|
|
||||||
// TODO: prüfe ob Return-Type = void,
|
|
||||||
sw.visitSuperclass().visitClassType(Type.getInternalName(Object.class));;
|
|
||||||
sw.visitEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates signature for a method or constructor with @see {@link SignatureWriter}
|
|
||||||
* Signature looks like:
|
|
||||||
* <typevaliables (K:Ljava/lang/Object "Bounds")>(params L.. OR T.. Or basistape)ReturnType
|
|
||||||
*
|
|
||||||
* @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().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
|
||||||
@@ -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() {
|
||||||
|
defineTypeVariablesForClassOrInterface();
|
||||||
|
|
||||||
|
defineGenericsFromConstraints(consClass,genericsAndBounds);
|
||||||
|
|
||||||
|
String sClass = classOrInterface.getSuperClass().acceptTV(new TypeToSignature());
|
||||||
|
sw.visitSuperclass().visitClassType(sClass.substring(1, sClass.length() - 1));
|
||||||
|
sw.visitEnd();
|
||||||
|
return sw.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void defineTypeVariablesForClassOrInterface() {
|
||||||
Iterator<GenericTypeVar> itr = classOrInterface.getGenerics().iterator();
|
Iterator<GenericTypeVar> itr = classOrInterface.getGenerics().iterator();
|
||||||
|
|
||||||
while (itr.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
GenericTypeVar g = itr.next();
|
GenericTypeVar g = itr.next();
|
||||||
getBoundsOfTypeVar(g,genericsAndBounds);
|
visitTypeVarsAndTheirBounds(g, genericsAndBounds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!consClass.isEmpty()) {
|
/**
|
||||||
ArrayList<String> types = new ArrayList<>();
|
* @param genericsAndBounds2
|
||||||
ArrayList<String> superTypes = new ArrayList<>();
|
*
|
||||||
|
*/
|
||||||
|
private void defineGenericsFromConstraints(List<GenericsGeneratorResult> constraints, HashMap<String,String> genericsAndBounds2) {
|
||||||
|
constraints.forEach(c -> {
|
||||||
|
String typeVariable = c.getConstraint().getLeft() + SPECIAL_CHAR;
|
||||||
|
sw.visitFormalTypeParameter(typeVariable);
|
||||||
|
|
||||||
for(TPHConstraint cons : consClass) {
|
String bound = c.getConstraint().getRight();
|
||||||
types.add(cons.getLeft());
|
bound = checkBound(bound);
|
||||||
superTypes.add(cons.getRight());
|
genericsAndBounds2.put(typeVariable, bound);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
for(TPHConstraint cons : consClass) {
|
/**
|
||||||
String t = cons.getLeft()+"$";
|
* @param bound
|
||||||
String bound = cons.getRight()+"$";
|
* @return
|
||||||
sw.visitFormalTypeParameter(t);
|
*/
|
||||||
|
private String checkBound(String bound) {
|
||||||
|
if (bound.equals(Type.getInternalName(Object.class))) {
|
||||||
|
visitClassBound(bound);
|
||||||
|
} else {
|
||||||
|
bound += SPECIAL_CHAR;
|
||||||
sw.visitClassBound().visitTypeVariable(bound);
|
sw.visitClassBound().visitTypeVariable(bound);
|
||||||
genericsAndBounds.put(t, bound);
|
}
|
||||||
|
return bound;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(TPHConstraint cons : consClass) {
|
/**
|
||||||
if(!types.contains(cons.getRight()) && !genericsAndBounds.keySet().contains(cons.getRight()+"$")) {
|
* @param bound
|
||||||
String t = cons.getRight()+"$";
|
*/
|
||||||
String bound = Type.getInternalName(Object.class);
|
private void visitClassBound(String bound) {
|
||||||
sw.visitFormalTypeParameter(t);
|
|
||||||
sw.visitClassBound().visitClassType(bound);
|
sw.visitClassBound().visitClassType(bound);
|
||||||
genericsAndBounds.put(t, bound);
|
|
||||||
sw.visitClassBound().visitEnd();
|
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());
|
|
||||||
sw.visitSuperclass().visitClassType(sClass.substring(1, sClass.length()-1));
|
|
||||||
sw.visitEnd();
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Get bounds of type variable
|
* Get bounds of type variable
|
||||||
|
*
|
||||||
* @param g type variable
|
* @param g type variable
|
||||||
* @param genAndBounds
|
* @param genAndBounds
|
||||||
*/
|
*/
|
||||||
private void getBoundsOfTypeVar(GenericTypeVar g, HashMap<String, String> genAndBounds) {
|
private void visitTypeVarsAndTheirBounds(GenericTypeVar g, HashMap<String, String> genAndBounds) {
|
||||||
sw.visitFormalTypeParameter(g.getName());
|
sw.visitFormalTypeParameter(g.getName());
|
||||||
|
|
||||||
Iterator<? extends RefTypeOrTPHOrWildcardOrGeneric> bItr = g.getBounds().iterator();
|
Iterator<? extends RefTypeOrTPHOrWildcardOrGeneric> bItr = g.getBounds().iterator();
|
||||||
while (bItr.hasNext()) {
|
while (bItr.hasNext()) {
|
||||||
RefTypeOrTPHOrWildcardOrGeneric b = bItr.next();
|
RefTypeOrTPHOrWildcardOrGeneric b = bItr.next();
|
||||||
String boundDesc = b.acceptTV(new TypeToDescriptor());
|
String boundDesc = b.acceptTV(new TypeToDescriptor());
|
||||||
// System.out.println("GetBounds: " + boundDesc);
|
|
||||||
// Ensure that <...> extends java.lang.Object OR ...
|
// Ensure that <...> extends java.lang.Object OR ...
|
||||||
if (b instanceof GenericRefType) {
|
if (b instanceof GenericRefType) {
|
||||||
sw.visitClassBound().visitTypeVariable(boundDesc);
|
sw.visitClassBound().visitTypeVariable(boundDesc);
|
||||||
} else {
|
} else {
|
||||||
sw.visitClassBound().visitClassType(boundDesc);
|
visitClassBound(boundDesc);
|
||||||
sw.visitClassBound().visitEnd();
|
|
||||||
}
|
}
|
||||||
genAndBounds.put(g.getName(), boundDesc);
|
genAndBounds.put(g.getName(), boundDesc);
|
||||||
}
|
}
|
||||||
// sw.visitClassBound().visitEnd();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
if(sw == null)
|
||||||
|
return super.toString();
|
||||||
return sw.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) {
|
|
||||||
FileOutputStream output;
|
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getDescriptorOfApplyMethod(String methodCallType) {
|
||||||
|
return new DescriptorToString().createDescForFunN(methCall.arglist, methodCallType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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<>();
|
||||||
|
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.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, ClassLoader 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, ClassLoader 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,31 @@
|
|||||||
|
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 extends URLClassLoader {
|
||||||
|
public DirectoryClassLoader(File directory, java.lang.ClassLoader parent) {
|
||||||
|
super(generateURLArray(dirToURL(directory)), parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectoryClassLoader(List<File> directory, java.lang.ClassLoader parent) {
|
||||||
|
super(directory.stream().map(DirectoryClassLoader::dirToURL).collect(Collectors.toList()).toArray(new URL[0]), parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -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())
|
||||||
|
@@ -22,16 +22,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, ClassLoader 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, ClassLoader 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 +48,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, ClassLoader classLoader) throws ClassNotFoundException {
|
||||||
return getSuperTypes(forType, availableClasses, new HashMap<>());
|
return getSuperTypes(forType, availableClasses, new HashMap<>(), classLoader);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,7 +61,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, ClassLoader 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 +86,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 +120,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,6 +19,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 +36,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 +75,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, ClassLoader 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 +160,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,13 @@
|
|||||||
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.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 +15,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, ClassLoader 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 +64,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, ClassLoader 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,9 +16,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, ClassLoader 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 +32,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, ClassLoader 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);
|
||||||
|
@@ -55,9 +55,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, ClassLoader 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 +69,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, ClassLoader 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);
|
||||||
|
@@ -23,6 +23,7 @@ import java.util.Optional;
|
|||||||
* Stellt jede Art von Klasse dar. Auch abstrakte Klassen und Interfaces
|
* Stellt jede Art von Klasse dar. Auch abstrakte Klassen und Interfaces
|
||||||
*/
|
*/
|
||||||
public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
|
public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
|
||||||
|
private Boolean methodAdded = false; //wird benoetigt bei in JavaTXCompiler.getConstraints()
|
||||||
protected int modifiers;
|
protected int modifiers;
|
||||||
protected JavaClassName name;
|
protected JavaClassName name;
|
||||||
private List<Field> fields = new ArrayList<>();
|
private List<Field> fields = new ArrayList<>();
|
||||||
@@ -34,6 +35,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 +52,33 @@ 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 if it is added
|
||||||
|
public Boolean areMethodsAdded() {
|
||||||
|
return methodAdded;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Sets that it is added
|
||||||
|
public void setMethodsAdded() {
|
||||||
|
methodAdded = true;
|
||||||
|
}
|
||||||
|
|
||||||
// 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
|
||||||
|
@@ -31,6 +31,7 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope
|
|||||||
private ExceptionList exceptionlist;
|
private ExceptionList exceptionlist;
|
||||||
private GenericDeclarationList generics;
|
private GenericDeclarationList generics;
|
||||||
private final RefTypeOrTPHOrWildcardOrGeneric returnType;
|
private final RefTypeOrTPHOrWildcardOrGeneric returnType;
|
||||||
|
public final Boolean isInherited;
|
||||||
|
|
||||||
public Method(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, ParameterList parameterList, Block block,
|
public Method(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, ParameterList parameterList, Block block,
|
||||||
GenericDeclarationList gtvDeclarations, Token offset) {
|
GenericDeclarationList gtvDeclarations, Token offset) {
|
||||||
@@ -41,6 +42,19 @@ public class Method extends SyntaxTreeNode implements IItemWithOffset, TypeScope
|
|||||||
this.parameterlist = parameterList;
|
this.parameterlist = parameterList;
|
||||||
this.block = block;
|
this.block = block;
|
||||||
this.generics = gtvDeclarations;
|
this.generics = gtvDeclarations;
|
||||||
|
this.isInherited = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Method(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, ParameterList parameterList, Block block,
|
||||||
|
GenericDeclarationList gtvDeclarations, Token offset, Boolean isInherited) {
|
||||||
|
super(offset);
|
||||||
|
this.name = name;
|
||||||
|
this.modifier = modifier;
|
||||||
|
this.returnType = returnType;
|
||||||
|
this.parameterlist = parameterList;
|
||||||
|
this.block = block;
|
||||||
|
this.generics = gtvDeclarations;
|
||||||
|
this.isInherited = isInherited;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ParameterList getParameterList() {
|
public ParameterList getParameterList() {
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -3,8 +3,11 @@ package de.dhbwstuttgart.syntaxtree.factory;
|
|||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
@@ -35,8 +38,15 @@ public class ASTFactory {
|
|||||||
for(java.lang.reflect.Constructor constructor : jreClass.getConstructors()){
|
for(java.lang.reflect.Constructor constructor : jreClass.getConstructors()){
|
||||||
konstruktoren.add(createConstructor(constructor, jreClass));
|
konstruktoren.add(createConstructor(constructor, jreClass));
|
||||||
}
|
}
|
||||||
for(java.lang.reflect.Method method : jreClass.getMethods()){
|
Set<java.lang.reflect.Method> allMethods = new HashSet<>(Arrays.asList(jreClass.getMethods()));
|
||||||
methoden.add(createMethod(method, jreClass));
|
Set<java.lang.reflect.Method> allDeclaredMethods = new HashSet<>(Arrays.asList(jreClass.getDeclaredMethods()));
|
||||||
|
Set<java.lang.reflect.Method> allInheritedMethods = new HashSet<>(allMethods);
|
||||||
|
allInheritedMethods.removeAll(allDeclaredMethods);
|
||||||
|
for(java.lang.reflect.Method method : allDeclaredMethods){
|
||||||
|
methoden.add(createMethod(method, jreClass, false));
|
||||||
|
}
|
||||||
|
for(java.lang.reflect.Method method : allInheritedMethods){
|
||||||
|
methoden.add(createMethod(method, jreClass, true));
|
||||||
}
|
}
|
||||||
List<Field> felder = new ArrayList<>();
|
List<Field> felder = new ArrayList<>();
|
||||||
for(java.lang.reflect.Field field : jreClass.getDeclaredFields()){
|
for(java.lang.reflect.Field field : jreClass.getDeclaredFields()){
|
||||||
@@ -70,7 +80,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) {
|
||||||
@@ -102,7 +112,7 @@ public class ASTFactory {
|
|||||||
return new de.dhbwstuttgart.syntaxtree.Constructor(modifier, name,returnType, parameterList, block, gtvDeclarations, offset /*, new ArrayList<>() geloescht PL 2018-11-24 */);
|
return new de.dhbwstuttgart.syntaxtree.Constructor(modifier, name,returnType, parameterList, block, gtvDeclarations, offset /*, new ArrayList<>() geloescht PL 2018-11-24 */);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass){
|
public static Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass, Boolean isInherited){
|
||||||
String name = jreMethod.getName();
|
String name = jreMethod.getName();
|
||||||
RefTypeOrTPHOrWildcardOrGeneric returnType;
|
RefTypeOrTPHOrWildcardOrGeneric returnType;
|
||||||
Type jreRetType;
|
Type jreRetType;
|
||||||
@@ -126,7 +136,7 @@ public class ASTFactory {
|
|||||||
GenericDeclarationList gtvDeclarations = createGenerics(jreMethod.getTypeParameters(), inClass, jreMethod.getName());
|
GenericDeclarationList gtvDeclarations = createGenerics(jreMethod.getTypeParameters(), inClass, jreMethod.getName());
|
||||||
Token offset = new NullToken();
|
Token offset = new NullToken();
|
||||||
|
|
||||||
return new Method(jreMethod.getModifiers(), name,returnType, parameterList, block, gtvDeclarations, offset);
|
return new Method(jreMethod.getModifiers(), name,returnType, parameterList, block, gtvDeclarations, offset, isInherited);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GenericDeclarationList createGenerics(TypeVariable[] typeParameters, Class context, String methodName){
|
public static GenericDeclarationList createGenerics(TypeVariable[] typeParameters, Class context, String methodName){
|
||||||
@@ -189,11 +199,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());
|
||||||
|
@@ -31,7 +31,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, ClassLoader 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 +42,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 +122,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);
|
||||||
@@ -152,8 +153,12 @@ public class UnifyTypeFactory {
|
|||||||
return constraints.map(UnifyTypeFactory::convert);
|
return constraints.map(UnifyTypeFactory::convert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//NEVER USED
|
||||||
public static Constraint<UnifyPair> convert(Constraint<Pair> constraint){
|
public static Constraint<UnifyPair> convert(Constraint<Pair> constraint){
|
||||||
return constraint.stream().map(UnifyTypeFactory::convert).collect(Collectors.toCollection(Constraint::new));
|
Constraint<UnifyPair> unifyPairConstraint = constraint.stream()
|
||||||
|
.map(UnifyTypeFactory::convert)
|
||||||
|
.collect(Collectors.toCollection( () -> new Constraint<UnifyPair> (constraint.isInherited(), convert(constraint.getExtendConstraint()))));
|
||||||
|
return unifyPairConstraint;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UnifyPair convert(Pair p) {
|
public static UnifyPair convert(Pair p) {
|
||||||
|
@@ -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);
|
||||||
|
@@ -7,6 +7,7 @@ import de.dhbwstuttgart.syntaxtree.type.*;
|
|||||||
|
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public class OutputGenerator implements ASTVisitor{
|
public class OutputGenerator implements ASTVisitor{
|
||||||
private static final String TAB = " ";
|
private static final String TAB = " ";
|
||||||
@@ -123,6 +124,11 @@ public class OutputGenerator implements ASTVisitor{
|
|||||||
f.accept(this);
|
f.accept(this);
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
}
|
}
|
||||||
|
Optional<Constructor> fI;
|
||||||
|
if ((fI = classOrInterface.getfieldInitializations()).isPresent()) {
|
||||||
|
out.append("Initializations:");
|
||||||
|
fI.get().accept(this);
|
||||||
|
}
|
||||||
for(Method m : classOrInterface.getMethods()){
|
for(Method m : classOrInterface.getMethods()){
|
||||||
out.append(tabs);
|
out.append(tabs);
|
||||||
m.accept(this);
|
m.accept(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();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TypeInsertPoint createGenericInsert(Set<GenericInsertPair> toInsert, ClassOrInterface cl, Method m){
|
private static synchronized Set<TypeInsertPoint> createGenericInsert(GenericsGeneratorResultForClass genericResult, ClassOrInterface cl, Method m, ResultSet resultSet, Token mOffset){
|
||||||
//Momentan wird Methode ignoriert. Parameter werden immer als Klassenparameter angefügt:
|
Set<TypeInsertPoint> result = createGenericClassInserts(genericResult, cl);
|
||||||
//Offset zum Einstzen bestimmen:
|
|
||||||
Token offset;
|
for (Method method : cl.getMethods()) {
|
||||||
String insert = "";
|
Resolver resolver = new Resolver(resultSet);
|
||||||
String end;
|
List<GenericsGeneratorResult> methodConstraints = genericResult.getMethodConstraintsByID(MethodUtility.createID(resolver, method));
|
||||||
if(cl.getGenerics().iterator().hasNext()){
|
result.addAll(createMethodConstraints(method, methodConstraints, mOffset));
|
||||||
//offset = cl.getGenerics().iterator().next().getOffset();
|
}
|
||||||
offset = cl.getGenerics().getOffset();
|
|
||||||
end=",";
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Set<TypeInsertPoint> createMethodConstraints(Method method, List<GenericsGeneratorResult> constraints, Token mOffset) {
|
||||||
|
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 {
|
} else {
|
||||||
offset = cl.getGenerics().getOffset();
|
insert += genericInsertConstraint.getConstraint().getLeft() + " extends " + genericInsertConstraint.getConstraint().getRight() + ", ";
|
||||||
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:
|
insert = insert.substring(0, insert.length() -2);
|
||||||
Iterator<TypePlaceholder> it = genericsAndBounds.keySet().iterator();
|
insert += ">";
|
||||||
if(! it.hasNext())return new TypeInsertPoint(offset, "");
|
|
||||||
while(it.hasNext()){
|
result.add(new TypeInsertPoint(offset, insert));
|
||||||
TypePlaceholder tph = it.next();
|
return result;
|
||||||
insert += tph.getName();
|
}
|
||||||
Set<TypePlaceholder> bounds = genericsAndBounds.get(tph);
|
|
||||||
if(bounds.size() > 0){
|
private static Set<TypeInsertPoint> createGenericClassInserts(GenericsGeneratorResultForClass genericResult, ClassOrInterface cl) {
|
||||||
insert += " extends ";
|
Set<TypeInsertPoint> result = new HashSet<>();
|
||||||
Iterator<TypePlaceholder> boundIt = bounds.iterator();
|
Token offset = cl.getGenerics().getOffset();
|
||||||
while(boundIt.hasNext()){
|
|
||||||
TypePlaceholder bound = boundIt.next();
|
List<GenericsGeneratorResult> classConstraints = genericResult.getClassConstraints();
|
||||||
insert += bound.getName();
|
|
||||||
if(boundIt.hasNext())insert += " & ";
|
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() + ", ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(it.hasNext())insert+=",";
|
|
||||||
}
|
insert = insert.substring(0, insert.length() -2);
|
||||||
return new TypeInsertPoint(offset, insert + end);
|
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();
|
||||||
}
|
}
|
||||||
|
@@ -17,13 +17,15 @@ public class MethodAssumption extends Assumption{
|
|||||||
private ClassOrInterface receiver;
|
private ClassOrInterface receiver;
|
||||||
private RefTypeOrTPHOrWildcardOrGeneric retType;
|
private RefTypeOrTPHOrWildcardOrGeneric retType;
|
||||||
List<? extends RefTypeOrTPHOrWildcardOrGeneric> params;
|
List<? extends RefTypeOrTPHOrWildcardOrGeneric> params;
|
||||||
|
private final Boolean isInherited;
|
||||||
|
|
||||||
public MethodAssumption(ClassOrInterface receiver, RefTypeOrTPHOrWildcardOrGeneric retType,
|
public MethodAssumption(ClassOrInterface receiver, RefTypeOrTPHOrWildcardOrGeneric retType,
|
||||||
List<? extends RefTypeOrTPHOrWildcardOrGeneric> params, TypeScope scope){
|
List<? extends RefTypeOrTPHOrWildcardOrGeneric> params, TypeScope scope, Boolean isInherited){
|
||||||
super(scope);
|
super(scope);
|
||||||
this.receiver = receiver;
|
this.receiver = receiver;
|
||||||
this.retType = retType;
|
this.retType = retType;
|
||||||
this.params = params;
|
this.params = params;
|
||||||
|
this.isInherited = isInherited;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -70,4 +72,8 @@ public class MethodAssumption extends Assumption{
|
|||||||
|
|
||||||
return receiverType;
|
return receiverType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean isInherited() {
|
||||||
|
return isInherited;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,4 +7,47 @@ import java.util.HashSet;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class Constraint<A> extends HashSet<A> {
|
public class Constraint<A> extends HashSet<A> {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private Boolean isInherited = false;//wird nur für die Method-Constraints benoetigt
|
||||||
|
private Constraint<A> extendConstraint = null;
|
||||||
|
|
||||||
|
public Constraint() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Constraint(Boolean isInherited) {
|
||||||
|
this.isInherited = isInherited;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Constraint(Boolean isInherited, Constraint<A> extendConstraint) {
|
||||||
|
this.isInherited = isInherited;
|
||||||
|
this.extendConstraint = extendConstraint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsInherited(Boolean isInherited) {
|
||||||
|
this.isInherited = isInherited;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isInherited() {
|
||||||
|
return isInherited;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Constraint<A> getExtendConstraint() {
|
||||||
|
return extendConstraint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExtendConstraint(Constraint<A> c) {
|
||||||
|
extendConstraint = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return super.toString() + " isInherited = " + isInherited
|
||||||
|
//" + extendsContraint: " + (extendConstraint != null ? extendConstraint.toStringBase() : "null" )
|
||||||
|
+ "\n" ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toStringBase() {
|
||||||
|
return super.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(){
|
||||||
@@ -42,15 +46,48 @@ public class ConstraintSet<A> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <B> ConstraintSet<B> map(Function<? super A, ? extends B> o) {
|
public <B> ConstraintSet<B> map(Function<? super A, ? extends B> o) {
|
||||||
|
Hashtable<Constraint<A>,Constraint<B>> CSA2CSB = new Hashtable<>();
|
||||||
ConstraintSet<B> ret = new ConstraintSet<>();
|
ConstraintSet<B> ret = new ConstraintSet<>();
|
||||||
ret.undConstraints = undConstraints.stream().map(o).collect(Collectors.toCollection(Constraint<B>::new));
|
ret.undConstraints = undConstraints.stream().map(o).collect(Collectors.toCollection(Constraint<B>::new));
|
||||||
List<Set<Constraint<B>>> newOder = new ArrayList<>();
|
List<Set<Constraint<B>>> newOder = new ArrayList<>();
|
||||||
|
/*
|
||||||
|
for(Set<Constraint<A>> oderConstraint : oderConstraints){
|
||||||
|
oderConstraint.forEach(as -> {
|
||||||
|
Constraint<B> newConst = as.stream()
|
||||||
|
.map(o)
|
||||||
|
.collect(Collectors.toCollection(
|
||||||
|
() -> new Constraint<B> (as.isInherited())));
|
||||||
|
CSA2CSB.put(as, newConst);} );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
for(Set<Constraint<A>> oderConstraint : oderConstraints){
|
for(Set<Constraint<A>> oderConstraint : oderConstraints){
|
||||||
newOder.add(
|
newOder.add(
|
||||||
oderConstraint.parallelStream().map((Constraint<A> as) ->
|
oderConstraint.parallelStream().map((Constraint<A> as) -> {
|
||||||
as.stream().map(o).collect(Collectors.toCollection(Constraint<B>::new))).collect(Collectors.toSet())
|
|
||||||
|
Constraint<B> newConst = as.stream()
|
||||||
|
.map(o)
|
||||||
|
.collect(Collectors.toCollection((as.getExtendConstraint() != null)
|
||||||
|
? () -> new Constraint<B> (as.isInherited(),
|
||||||
|
as.getExtendConstraint().stream().map(o).collect(Collectors.toCollection(Constraint::new)))
|
||||||
|
: () -> new Constraint<B> (as.isInherited())
|
||||||
|
));
|
||||||
|
|
||||||
|
//CSA2CSB.put(as, newConst);
|
||||||
|
|
||||||
|
return newConst;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Constraint<B> bs = CSA2CSB.get(as);
|
||||||
|
if (as.getExtendConstraint() != null) {
|
||||||
|
bs.setExtendConstraint(CSA2CSB.get(as.getExtendConstraint()));
|
||||||
|
}
|
||||||
|
return bs;
|
||||||
|
*/
|
||||||
|
}).collect(Collectors.toSet())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.oderConstraints = newOder;
|
ret.oderConstraints = newOder;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@@ -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){
|
||||||
|
@@ -16,7 +16,10 @@ import de.dhbwstuttgart.typeinference.assumptions.FunNClass;
|
|||||||
import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption;
|
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.ExtendsType;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -159,13 +162,27 @@ 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));
|
Constraint<Pair> oneMethodConstraint = generateConstraint(methodCall, m, info, resolver);
|
||||||
|
methodConstraints.add(oneMethodConstraint);
|
||||||
|
|
||||||
|
Constraint<Pair> extendsOneMethodConstraint = oneMethodConstraint.stream()
|
||||||
|
.map(x -> (x.TA1 instanceof TypePlaceholder &&
|
||||||
|
x.GetOperator() == PairOperator.EQUALSDOT &&
|
||||||
|
!(x.TA2 instanceof TypePlaceholder))
|
||||||
|
? new Pair(x.TA1, new ExtendsWildcardType(x.TA2, x.TA2.getOffset()), PairOperator.EQUALSDOT)
|
||||||
|
: x)
|
||||||
|
.collect(Collectors.toCollection(() -> new Constraint<Pair>(oneMethodConstraint.isInherited())));
|
||||||
|
oneMethodConstraint.setExtendConstraint(extendsOneMethodConstraint);
|
||||||
|
extendsOneMethodConstraint.setExtendConstraint(oneMethodConstraint);
|
||||||
|
methodConstraints.add(extendsOneMethodConstraint);
|
||||||
}
|
}
|
||||||
if(methodConstraints.size()<1){
|
if(methodConstraints.size()<1){
|
||||||
throw new TypeinferenceException("Methode "+methodCall.name+" ist nicht vorhanden!",methodCall.getOffset());
|
throw new TypeinferenceException("Methode "+methodCall.name+" ist nicht vorhanden!",methodCall.getOffset());
|
||||||
@@ -222,6 +239,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 +267,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 +275,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 +283,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 +291,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 +299,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 +307,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 +381,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 +393,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 +574,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<>(assumption.isInherited());
|
||||||
ClassOrInterface receiverCl = assumption.getReceiver();
|
ClassOrInterface receiverCl = assumption.getReceiver();
|
||||||
/*
|
/*
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
||||||
@@ -569,7 +588,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 +609,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;
|
||||||
}
|
}
|
||||||
@@ -611,7 +640,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
public RefTypeOrTPHOrWildcardOrGeneric getReturnType() {
|
public RefTypeOrTPHOrWildcardOrGeneric getReturnType() {
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
}));
|
}, false));
|
||||||
}
|
}
|
||||||
for(ClassOrInterface cl : info.getAvailableClasses()){
|
for(ClassOrInterface cl : info.getAvailableClasses()){
|
||||||
for(Method m : cl.getMethods()){
|
for(Method m : cl.getMethods()){
|
||||||
@@ -620,7 +649,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
RefTypeOrTPHOrWildcardOrGeneric retType = m.getReturnType();//info.checkGTV(m.getReturnType());
|
RefTypeOrTPHOrWildcardOrGeneric retType = m.getReturnType();//info.checkGTV(m.getReturnType());
|
||||||
|
|
||||||
ret.add(new MethodAssumption(cl, retType, convertParams(m.getParameterList(),info),
|
ret.add(new MethodAssumption(cl, retType, convertParams(m.getParameterList(),info),
|
||||||
createTypeScope(cl, m)));
|
createTypeScope(cl, m), m.isInherited));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -655,7 +684,7 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
for(Method m : cl.getConstructors()){
|
for(Method m : cl.getConstructors()){
|
||||||
if(m.getParameterList().getFormalparalist().size() == argList.getArguments().size()){
|
if(m.getParameterList().getFormalparalist().size() == argList.getArguments().size()){
|
||||||
ret.add(new MethodAssumption(cl, ofType, convertParams(m.getParameterList(),
|
ret.add(new MethodAssumption(cl, ofType, convertParams(m.getParameterList(),
|
||||||
info), createTypeScope(cl, m)));
|
info), createTypeScope(cl, m), m.isInherited));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -666,8 +695,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) {
|
||||||
|
@@ -26,11 +26,15 @@ import de.dhbwstuttgart.typeinference.unify.model.Unifier;
|
|||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.WildcardType;
|
import de.dhbwstuttgart.typeinference.unify.model.WildcardType;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
import de.dhbwstuttgart.typeinference.unify.distributeVariance;
|
import de.dhbwstuttgart.typeinference.unify.distributeVariance;
|
||||||
|
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
|
||||||
|
import org.apache.commons.io.output.NullOutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of the type inference rules.
|
* Implementation of the type inference rules.
|
||||||
@@ -43,6 +47,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
public RuleSet() {
|
public RuleSet() {
|
||||||
super();
|
super();
|
||||||
|
logFile = new OutputStreamWriter(new NullOutputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
RuleSet(Writer logFile) {
|
RuleSet(Writer logFile) {
|
||||||
@@ -627,7 +632,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<Set<UnifyPair>> subst(Set<UnifyPair> pairs, List<Set<Set<UnifyPair>>> oderConstraints) {
|
public Optional<Set<UnifyPair>> subst(Set<UnifyPair> pairs, List<Set<Constraint<UnifyPair>>> oderConstraints) {
|
||||||
HashMap<UnifyType, Integer> typeMap = new HashMap<>();
|
HashMap<UnifyType, Integer> typeMap = new HashMap<>();
|
||||||
|
|
||||||
Stack<UnifyType> occuringTypes = new Stack<>();
|
Stack<UnifyType> occuringTypes = new Stack<>();
|
||||||
@@ -674,16 +679,13 @@ public class RuleSet implements IRuleSet{
|
|||||||
result = result.stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(ArrayList::new));
|
result = result.stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(ArrayList::new));
|
||||||
result1 = result1.stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(LinkedList::new));
|
result1 = result1.stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(LinkedList::new));
|
||||||
|
|
||||||
Function<? super Set<UnifyPair>,? extends HashSet<UnifyPair>> applyUni = b -> b.stream().map(
|
Function<? super Constraint<UnifyPair>,? extends Constraint<UnifyPair>> applyUni = b -> b.stream().map(
|
||||||
x -> uni.apply(pair,x)).collect(Collectors.toCollection(HashSet::new));
|
x -> uni.apply(pair,x)).collect(Collectors.toCollection((b.getExtendConstraint() != null)
|
||||||
List<Set<Set<UnifyPair>>> oderConstraintsRet = new ArrayList<>();
|
? () -> new Constraint<UnifyPair>(
|
||||||
for(Set<Set<UnifyPair>> oc : oderConstraints) {
|
b.isInherited(),
|
||||||
//Set<Set<UnifyPair>> ocRet = new HashSet<>();
|
b.getExtendConstraint().stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(Constraint::new)))
|
||||||
//for(Set<UnifyPair> cs : oc) {
|
: () -> new Constraint<UnifyPair>(b.isInherited())
|
||||||
Set<Set<UnifyPair>> csRet = oc.stream().map(applyUni).collect(Collectors.toCollection(HashSet::new));
|
));
|
||||||
oderConstraintsRet.add(csRet);
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
oderConstraints.replaceAll(oc -> oc.stream().map(applyUni).collect(Collectors.toCollection(HashSet::new)));
|
oderConstraints.replaceAll(oc -> oc.stream().map(applyUni).collect(Collectors.toCollection(HashSet::new)));
|
||||||
/*
|
/*
|
||||||
oderConstraints = oderConstraints.stream().map(
|
oderConstraints = oderConstraints.stream().map(
|
||||||
|
@@ -28,7 +28,7 @@ public class TypeUnify {
|
|||||||
* @param cons
|
* @param cons
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Set<Set<UnifyPair>> unify(Set<UnifyPair> undConstrains, List<Set<Set<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
public Set<Set<UnifyPair>> unify(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
||||||
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
||||||
ForkJoinPool pool = new ForkJoinPool();
|
ForkJoinPool pool = new ForkJoinPool();
|
||||||
pool.invoke(unifyTask);
|
pool.invoke(unifyTask);
|
||||||
@@ -54,7 +54,7 @@ public class TypeUnify {
|
|||||||
* @param ret
|
* @param ret
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public UnifyResultModel unifyAsync(Set<UnifyPair> undConstrains, List<Set<Set<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
public UnifyResultModel unifyAsync(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
||||||
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
||||||
ForkJoinPool pool = new ForkJoinPool();
|
ForkJoinPool pool = new ForkJoinPool();
|
||||||
pool.invoke(unifyTask);
|
pool.invoke(unifyTask);
|
||||||
@@ -72,7 +72,7 @@ public class TypeUnify {
|
|||||||
* @param ret
|
* @param ret
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public UnifyResultModel unifyParallel(Set<UnifyPair> undConstrains, List<Set<Set<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
public UnifyResultModel unifyParallel(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
||||||
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
||||||
ForkJoinPool pool = new ForkJoinPool();
|
ForkJoinPool pool = new ForkJoinPool();
|
||||||
pool.invoke(unifyTask);
|
pool.invoke(unifyTask);
|
||||||
@@ -105,7 +105,7 @@ public class TypeUnify {
|
|||||||
* @param cons
|
* @param cons
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Set<Set<UnifyPair>> unifyOderConstraints(Set<UnifyPair> undConstrains, List<Set<Set<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
public Set<Set<UnifyPair>> unifyOderConstraints(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
||||||
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, usedTasks);
|
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, usedTasks);
|
||||||
Set<Set<UnifyPair>> res = unifyTask.compute();
|
Set<Set<UnifyPair>> res = unifyTask.compute();
|
||||||
try {
|
try {
|
||||||
|
@@ -18,7 +18,7 @@ public class TypeUnify2Task extends TypeUnifyTask {
|
|||||||
|
|
||||||
Set<Set<UnifyPair>> setToFlatten;
|
Set<Set<UnifyPair>> setToFlatten;
|
||||||
|
|
||||||
public TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq, List<Set<Set<UnifyPair>>> oderConstraints, Set<UnifyPair> nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks) {
|
public TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, Set<UnifyPair> nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks) {
|
||||||
super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, usedTasks);
|
super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, usedTasks);
|
||||||
this.setToFlatten = setToFlatten;
|
this.setToFlatten = setToFlatten;
|
||||||
this.nextSetElement = nextSetElement;
|
this.nextSetElement = nextSetElement;
|
||||||
@@ -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<>();
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,7 +92,7 @@ public interface IRuleSet {
|
|||||||
* @param pairs The set of pairs where the subst rule should apply.
|
* @param pairs The set of pairs where the subst rule should apply.
|
||||||
* @return An optional of the modified set, if there were any substitutions. An empty optional if there were no substitutions.
|
* @return An optional of the modified set, if there were any substitutions. An empty optional if there were no substitutions.
|
||||||
*/
|
*/
|
||||||
public Optional<Set<UnifyPair>> subst(Set<UnifyPair> pairs, List<Set<Set<UnifyPair>>> oderConstraints);
|
public Optional<Set<UnifyPair>> subst(Set<UnifyPair> pairs, List<Set<Constraint<UnifyPair>>> oderConstraints);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the subst-Rule to a set of pairs (usually Eq').
|
* Applies the subst-Rule to a set of pairs (usually Eq').
|
||||||
|
@@ -75,6 +75,17 @@ implements IFiniteClosure {
|
|||||||
|
|
||||||
// Build the transitive closure of the inheritance tree
|
// Build the transitive closure of the inheritance tree
|
||||||
for(UnifyPair pair : pairs) {
|
for(UnifyPair pair : pairs) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
try {
|
||||||
|
logFile.write("Pair: " + pair + "\n");
|
||||||
|
logFile.flush();
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
System.err.println("no LogFile");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if(pair.getPairOp() != PairOperator.SMALLER)
|
if(pair.getPairOp() != PairOperator.SMALLER)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -100,6 +111,10 @@ implements IFiniteClosure {
|
|||||||
// Add edges to build the transitive closure
|
// Add edges to build the transitive closure
|
||||||
parentNode.getPredecessors().stream().forEach(x -> x.addDescendant(childNode));
|
parentNode.getPredecessors().stream().forEach(x -> x.addDescendant(childNode));
|
||||||
childNode.getDescendants().stream().forEach(x -> x.addPredecessor(parentNode));
|
childNode.getDescendants().stream().forEach(x -> x.addPredecessor(parentNode));
|
||||||
|
|
||||||
|
//PL eingefuegt 2020-05-07 File UnitTest InheritTest.java
|
||||||
|
this.inheritanceGraph.forEach((x,y) -> { if (y.getDescendants().contains(parentNode)) { y.addDescendant(childNode); y.addAllDescendant(childNode.getDescendants());};
|
||||||
|
if (y.getPredecessors().contains(childNode)) { y.addPredecessor(parentNode); y.addAllPredecessor(parentNode.getPredecessors());};} );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the alternative representation with strings as keys
|
// Build the alternative representation with strings as keys
|
||||||
@@ -655,6 +670,7 @@ implements IFiniteClosure {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public int compare (UnifyType left, UnifyType right, PairOperator pairop) {
|
public int compare (UnifyType left, UnifyType right, PairOperator pairop) {
|
||||||
|
//try {logFile.write("left: "+ left + " right: " + right + " pairop: " + pairop);} catch (IOException ie) {}
|
||||||
if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
|
if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
|
||||||
System.out.println("");
|
System.out.println("");
|
||||||
/*
|
/*
|
||||||
@@ -711,13 +727,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,17 +750,22 @@ 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;
|
||||||
else return 0;
|
else {
|
||||||
|
//try {logFile.write("0 left: "+ left + " right: " + right + " pairop: " + pairop);} catch (IOException ie) {}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -45,6 +45,15 @@ class Node<T> {
|
|||||||
descendant.addPredecessor(this);
|
descendant.addPredecessor(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds some directed edges from this node to the descendant (this -> descendant)
|
||||||
|
*/
|
||||||
|
public void addAllDescendant(Set<Node<T>> allDescendants) {
|
||||||
|
for(Node<T> descendant: allDescendants) {
|
||||||
|
addDescendant(descendant);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a directed edge from the predecessor to this node (predecessor -> this)
|
* Adds a directed edge from the predecessor to this node (predecessor -> this)
|
||||||
*/
|
*/
|
||||||
@@ -56,6 +65,15 @@ class Node<T> {
|
|||||||
predecessor.addDescendant(this);
|
predecessor.addDescendant(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds some directed edges from the predecessor to this node (predecessor -> this)
|
||||||
|
*/
|
||||||
|
public void addAllPredecessor(Set<Node<T>> allPredecessors) {
|
||||||
|
for(Node<T> predecessor: allPredecessors) {
|
||||||
|
addPredecessor(predecessor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The content of this node.
|
* The content of this node.
|
||||||
*/
|
*/
|
||||||
|
@@ -0,0 +1,89 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public abstract class OrderingExtend<T> extends com.google.common.collect.Ordering<T> {
|
||||||
|
|
||||||
|
public List<T> maxElements(Iterable<T> iterable) {
|
||||||
|
ArrayList<T> ret = new ArrayList<>();
|
||||||
|
while (iterable.iterator().hasNext()) {
|
||||||
|
Set<T> believe = new HashSet<>();
|
||||||
|
|
||||||
|
T max = max(iterable);
|
||||||
|
ret.add(max);
|
||||||
|
|
||||||
|
Iterator<T> it = iterable.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
T elem = it.next();
|
||||||
|
if (!(compare(max, elem) == 1) && !max.equals(elem)) {
|
||||||
|
believe.add(elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterable = believe;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> minElements(Iterable<T> iterable) {
|
||||||
|
ArrayList<T> ret = new ArrayList<>();
|
||||||
|
while (iterable.iterator().hasNext()) {
|
||||||
|
Set<T> believe = new HashSet<>();
|
||||||
|
|
||||||
|
T min = min(iterable);
|
||||||
|
ret.add(min);
|
||||||
|
|
||||||
|
Iterator<T> it = iterable.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
T elem = it.next();
|
||||||
|
if (!(compare(min, elem) == -1) && !min.equals(elem)) {
|
||||||
|
believe.add(elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterable = believe;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<T> smallerEqThan(T elem, Iterable<T> iterable) {
|
||||||
|
List<T> ret = smallerThan(elem, iterable);
|
||||||
|
ret.add(elem);
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> smallerThan(T elem, Iterable<T> iterable) {
|
||||||
|
ArrayList<T> ret = new ArrayList<>();
|
||||||
|
Iterator<T> it = iterable.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
T itElem = it.next();
|
||||||
|
if (!itElem.equals(elem) && compare(elem, itElem) == 1) {
|
||||||
|
ret.add(itElem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> greaterEqThan(T elem, Iterable<T> iterable) {
|
||||||
|
List<T> ret = greaterThan(elem, iterable);
|
||||||
|
ret.add(elem);
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> greaterThan(T elem, Iterable<T> iterable) {
|
||||||
|
ArrayList<T> ret = new ArrayList<>();
|
||||||
|
Iterator<T> it = iterable.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
T itElem = it.next();
|
||||||
|
if (!itElem.equals(elem) && (compare(elem, itElem) == -1)) {
|
||||||
|
ret.add(itElem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
@@ -4,22 +4,25 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.BinaryOperator;
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import com.google.common.collect.Ordering;
|
import com.google.common.collect.Ordering;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.Match;
|
||||||
import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask;
|
import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
|
public class OrderingUnifyPair extends OrderingExtend<Set<UnifyPair>> {
|
||||||
|
|
||||||
protected IFiniteClosure fc;
|
protected IFiniteClosure fc;
|
||||||
|
|
||||||
@@ -42,7 +45,7 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
|
|||||||
}}
|
}}
|
||||||
catch (ClassCastException e) {
|
catch (ClassCastException e) {
|
||||||
try {
|
try {
|
||||||
((FiniteClosure)fc).logFile.write("ClassCastException: " + left.toString() +"\n\n");
|
((FiniteClosure)fc).logFile.write("ClassCastException: " + left.toString() + " " + left.getGroundBasePair() + "\n\n");
|
||||||
((FiniteClosure)fc).logFile.flush();
|
((FiniteClosure)fc).logFile.flush();
|
||||||
}
|
}
|
||||||
catch (IOException ie) {
|
catch (IOException ie) {
|
||||||
@@ -165,16 +168,7 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
|
|||||||
left.add(p4);
|
left.add(p4);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((left.size() == 1) && right.size() == 1) {
|
|
||||||
if (left.iterator().next().getLhsType().getName().equals("AFS")) {
|
|
||||||
System.out.println("");
|
|
||||||
}
|
|
||||||
if (((right.iterator().next().getRhsType() instanceof SuperType) && (((SuperType)right.iterator().next().getRhsType()).getSuperedType().getName().equals("java.lang.Object")))
|
|
||||||
||((left.iterator().next().getRhsType() instanceof SuperType) && (((SuperType)left.iterator().next().getRhsType()).getSuperedType().getName().equals("java.lang.Object"))))
|
|
||||||
{
|
|
||||||
System.out.println("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Set<UnifyPair> lefteq = left.stream()
|
Set<UnifyPair> lefteq = left.stream()
|
||||||
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
|
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
|
||||||
.collect(Collectors.toCollection(HashSet::new));
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
@@ -202,6 +196,135 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
|
|||||||
//if (lefteq.iterator().next().getLhsType().getName().equals("AJO")) {
|
//if (lefteq.iterator().next().getLhsType().getName().equals("AJO")) {
|
||||||
// System.out.print("");
|
// System.out.print("");
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
//ODER-CONSTRAINT
|
||||||
|
Set<UnifyPair> leftBase = left.stream().map(x -> x.getGroundBasePair()).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> rightBase = right.stream().map(x -> x.getGroundBasePair()).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
|
||||||
|
Set<UnifyPair> lefteqOder = left.stream()
|
||||||
|
.filter(x -> { UnifyPair y = x.getGroundBasePair();
|
||||||
|
/*try {
|
||||||
|
((FiniteClosure)fc).logFile.write("leftBase: " + leftBase.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("rightBase: " + rightBase.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("left: " + left.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("right: " + right.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("y: " + y.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("y.getLhsType() : " + y.getLhsType() .toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("y.getRhsType(): " + y.getRhsType().toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("x.getPairOp(): " + x.getPairOp().toString() +"\n\n");
|
||||||
|
}
|
||||||
|
catch (IOException ie) {
|
||||||
|
} */
|
||||||
|
return (y.getLhsType() instanceof PlaceholderType &&
|
||||||
|
!(y.getRhsType() instanceof PlaceholderType) &&
|
||||||
|
x.getPairOp() == PairOperator.EQUALSDOT);})
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> righteqOder = right.stream()
|
||||||
|
.filter(x -> { UnifyPair y = x.getGroundBasePair();
|
||||||
|
return (y.getLhsType() instanceof PlaceholderType &&
|
||||||
|
!(y.getRhsType() instanceof PlaceholderType) &&
|
||||||
|
x.getPairOp() == PairOperator.EQUALSDOT);})
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> lefteqRet = left.stream()
|
||||||
|
.filter(x -> { UnifyPair y = x.getGroundBasePair();
|
||||||
|
return (y.getRhsType() instanceof PlaceholderType &&
|
||||||
|
x.getPairOp() == PairOperator.EQUALSDOT);})
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> righteqRet = right.stream()
|
||||||
|
.filter(x -> { UnifyPair y = x.getGroundBasePair();
|
||||||
|
return (y.getRhsType() instanceof PlaceholderType &&
|
||||||
|
x.getPairOp() == PairOperator.EQUALSDOT);})
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> leftleOder = left.stream()
|
||||||
|
.filter(x -> (x.getPairOp() == PairOperator.SMALLERDOT))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> rightleOder = right.stream()
|
||||||
|
.filter(x -> (x.getPairOp() == PairOperator.SMALLERDOT))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
|
||||||
|
/*
|
||||||
|
synchronized(this) {
|
||||||
|
try {
|
||||||
|
((FiniteClosure)fc).logFile.write("leftBase: " + leftBase.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("rightBase: " + rightBase.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("left: " + left.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("right: " + right.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("lefteqOder: " + lefteqOder.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("righteqOder: " + righteqOder.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("lefteqRet: " + lefteqRet.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("righteqRet: " + righteqRet.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("leftleOder: " + leftleOder.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("rightleOder: " + rightleOder.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.flush();
|
||||||
|
}
|
||||||
|
catch (IOException ie) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
Integer compareEq;
|
||||||
|
if (lefteqOder.size() == 1 && righteqOder.size() == 1 && lefteqRet.size() == 1 && righteqRet.size() == 1) {
|
||||||
|
Match m = new Match();
|
||||||
|
if ((compareEq = compareEq(lefteqOder.iterator().next().getGroundBasePair(), righteqOder.iterator().next().getGroundBasePair())) == -1) {
|
||||||
|
ArrayList<UnifyPair> matchList =
|
||||||
|
rightleOder.stream().map(x -> {
|
||||||
|
UnifyPair leftElem = leftleOder.stream()
|
||||||
|
.filter(y -> y.getGroundBasePair().getLhsType().equals(x.getGroundBasePair().getLhsType()))
|
||||||
|
.findAny().get();
|
||||||
|
return new UnifyPair(x.getRhsType(), leftElem.getRhsType(), PairOperator.EQUALSDOT);})
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
if (m.match(matchList).isPresent()) {
|
||||||
|
//try { ((FiniteClosure)fc).logFile.write("result1: -1 \n\n"); } catch (IOException ie) {}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//try { ((FiniteClosure)fc).logFile.write("result1: 0 \n\n"); } catch (IOException ie) {}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (compareEq == 1) {
|
||||||
|
ArrayList<UnifyPair> matchList =
|
||||||
|
leftleOder.stream().map(x -> {
|
||||||
|
UnifyPair rightElem = rightleOder.stream()
|
||||||
|
.filter(y ->
|
||||||
|
y.getGroundBasePair().getLhsType().equals(x.getGroundBasePair().getLhsType()))
|
||||||
|
.findAny().get();
|
||||||
|
return new UnifyPair(x.getRhsType(), rightElem.getRhsType(), PairOperator.EQUALSDOT);})
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
if (m.match(matchList).isPresent()) {
|
||||||
|
//try { ((FiniteClosure)fc).logFile.write("result2: 1 \n\n"); } catch (IOException ie) {}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//try { ((FiniteClosure)fc).logFile.write("result2: 0 \n\n"); } catch (IOException ie) {}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
synchronized(this) {
|
||||||
|
try {
|
||||||
|
((FiniteClosure)fc).logFile.write("leftBase: " + leftBase.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("rightBase: " + rightBase.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("left: " + left.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("right: " + right.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("lefteqOder: " + lefteqOder.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("righteqOder: " + righteqOder.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("lefteqRet: " + lefteqRet.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("righteqRet: " + righteqRet.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("leftleOder: " + leftleOder.toString() +"\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("rightleOder: " + rightleOder.toString() +"\n\n");
|
||||||
|
((FiniteClosure)fc).logFile.write("result3: 0 \n\n");
|
||||||
|
((FiniteClosure)fc).logFile.flush();
|
||||||
|
}
|
||||||
|
catch (IOException ie) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (lefteq.size() == 1 && lefteq.iterator().next().getRhsType() instanceof ExtendsType && leftle.size() == 1 && righteq.size() == 0 && rightle.size() == 1) {
|
if (lefteq.size() == 1 && lefteq.iterator().next().getRhsType() instanceof ExtendsType && leftle.size() == 1 && righteq.size() == 0 && rightle.size() == 1) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -293,24 +416,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;
|
||||||
}
|
}
|
||||||
@@ -156,6 +138,11 @@ public class UnifyPair {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<UnifyPair> getThisAndAllBases () {
|
||||||
|
Set<UnifyPair> ret = getAllBases();
|
||||||
|
ret.add(this);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
public Set<UnifyPair> getAllBases () {
|
public Set<UnifyPair> getAllBases () {
|
||||||
Set<UnifyPair> ret = new HashSet<>();
|
Set<UnifyPair> ret = new HashSet<>();
|
||||||
if (basePair != null) {
|
if (basePair != null) {
|
||||||
@@ -213,12 +200,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);
|
||||||
@@ -233,12 +222,14 @@ public class UnifyPair {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
String ret = "";
|
String ret = "";
|
||||||
if (lhs instanceof PlaceholderType) {
|
if (lhs instanceof PlaceholderType) {
|
||||||
ret = new Integer(((PlaceholderType)lhs).getVariance()).toString() + " " + ((PlaceholderType)lhs).isInnerType()
|
ret = new Integer(((PlaceholderType)lhs).getVariance()).toString() + " "
|
||||||
+ " " + ((PlaceholderType)lhs).isWildcardable();
|
+ "WC: " + ((PlaceholderType)lhs).isWildcardable()
|
||||||
|
+ ", IT: " + ((PlaceholderType)lhs).isInnerType();
|
||||||
}
|
}
|
||||||
if (rhs instanceof PlaceholderType) {
|
if (rhs instanceof PlaceholderType) {
|
||||||
ret = ret + ", " + new Integer(((PlaceholderType)rhs).getVariance()).toString() + " " + ((PlaceholderType)rhs).isInnerType()
|
ret = ret + ", " + new Integer(((PlaceholderType)rhs).getVariance()).toString() + " "
|
||||||
+ " " + ((PlaceholderType)rhs).isWildcardable();
|
+ "WC: " + ((PlaceholderType)rhs).isWildcardable()
|
||||||
|
+ ", IT: " + ((PlaceholderType)rhs).isInnerType();
|
||||||
}
|
}
|
||||||
return "(" + lhs + " " + pairOp + " " + rhs + ", " + ret + ")"; //+ ", [" + getfBounded().toString()+ "])";
|
return "(" + lhs + " " + pairOp + " " + rhs + ", " + ret + ")"; //+ ", [" + getfBounded().toString()+ "])";
|
||||||
}
|
}
|
||||||
|
64
src/test/java/AllgemeinTest.java
Normal file
64
src/test/java/AllgemeinTest.java
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class AllgemeinTest {
|
||||||
|
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws Exception {
|
||||||
|
//String className = "GenTest";
|
||||||
|
//String className = "Overloading_Generics";
|
||||||
|
//String className = "Generics";
|
||||||
|
//String className = "OverloadingMain";
|
||||||
|
//String className = "OverrideMain";
|
||||||
|
//String className = "OverrideMainRet";
|
||||||
|
//String className = "FCTest1";
|
||||||
|
//String className = "FCTest2";
|
||||||
|
//String className = "Pair";
|
||||||
|
//String className = "FCTest3";
|
||||||
|
//String className = "Var";
|
||||||
|
//String className = "Put";
|
||||||
|
String className = "Twice";
|
||||||
|
//PL 2019-10-24: genutzt fuer unterschiedliche Tests
|
||||||
|
path = System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/" + className + ".jav";
|
||||||
|
//path = System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/Overloading_Generics.jav";
|
||||||
|
//path = System.getProperty("user.dir")+"/src/test/resources/bytecode/javFiles/mathStrucInteger.jav";
|
||||||
|
//compiler = new JavaTXCompiler(Lists.newArrayList(new File(System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/Overloading_Generics.jav")));
|
||||||
|
///*
|
||||||
|
compiler = new JavaTXCompiler(
|
||||||
|
Lists.newArrayList(new File(path)),
|
||||||
|
Lists.newArrayList(new File(System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/")));
|
||||||
|
//*/
|
||||||
|
compiler.generateBytecode(System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/");
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass(className);
|
||||||
|
//classToTest = loader.loadClass("Overloading_Generics");
|
||||||
|
//instanceOfClass = classToTest.getDeclaredConstructor().newInstance("A");
|
||||||
|
//classToTest = loader.loadClass("Overloading_Generics1");
|
||||||
|
//instanceOfClass = classToTest.getDeclaredConstructor(Object.class).newInstance("B");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -25,7 +25,7 @@ public class ClingoTest {
|
|||||||
@Test
|
@Test
|
||||||
public void test() throws IOException, InterruptedException, ClassNotFoundException {
|
public void test() throws IOException, InterruptedException, ClassNotFoundException {
|
||||||
String content = "";
|
String content = "";
|
||||||
content = ASPFactory.generateASP(this.getPairs(), this.getFC());
|
content = ASPFactory.generateASP(this.getPairs(), this.getFC(), ClassLoader.getSystemClassLoader());
|
||||||
|
|
||||||
PrintWriter writer = new PrintWriter(tempDirectory + "test.lp", "UTF-8");
|
PrintWriter writer = new PrintWriter(tempDirectory + "test.lp", "UTF-8");
|
||||||
writer.println(content);
|
writer.println(content);
|
||||||
|
@@ -40,7 +40,7 @@ public class UnifyWithoutWildcards {
|
|||||||
|
|
||||||
public ResultSet run(ConstraintSet<Pair> toTest) throws IOException, InterruptedException, ClassNotFoundException {
|
public ResultSet run(ConstraintSet<Pair> toTest) throws IOException, InterruptedException, ClassNotFoundException {
|
||||||
String content = "";
|
String content = "";
|
||||||
content = ASPFactory.generateASP(toTest, this.getFC());
|
content = ASPFactory.generateASP(toTest, this.getFC(), ClassLoader.getSystemClassLoader());
|
||||||
|
|
||||||
PrintWriter writer = new PrintWriter(tempDirectory + "test.lp", "UTF-8");
|
PrintWriter writer = new PrintWriter(tempDirectory + "test.lp", "UTF-8");
|
||||||
writer.println(content);
|
writer.println(content);
|
||||||
|
@@ -35,7 +35,7 @@ public class GeneratorTest extends UnifyWithoutWildcards{
|
|||||||
RefType t2 = new RefType(new JavaClassName("java.util.List"), list2, new NullToken());
|
RefType t2 = new RefType(new JavaClassName("java.util.List"), list2, new NullToken());
|
||||||
testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT));
|
testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT));
|
||||||
String resultSet = ASPGencayFactory.generateASP(testSet,
|
String resultSet = ASPGencayFactory.generateASP(testSet,
|
||||||
new HashSet<>(Arrays.asList(ASTFactory.createClass(List.class))));
|
new HashSet<>(Arrays.asList(ASTFactory.createClass(List.class))), ClassLoader.getSystemClassLoader());
|
||||||
System.out.println(resultSet);
|
System.out.println(resultSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ public class GeneratorTest extends UnifyWithoutWildcards{
|
|||||||
RefType t1 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Matrix"), list1, 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());
|
RefType t2 = new RefType(new JavaClassName("java.util.HashMap"), list2, new NullToken());
|
||||||
testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT));
|
testSet.addUndConstraint(new Pair(t1, t2, PairOperator.SMALLERDOT));
|
||||||
String resultSet = ASPGencayFactory.generateASP(testSet, this.getFC());
|
String resultSet = ASPGencayFactory.generateASP(testSet, this.getFC(), ClassLoader.getSystemClassLoader());
|
||||||
System.out.println(resultSet);
|
System.out.println(resultSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -55,7 +55,7 @@ public class ASPTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final ConstraintSet<Pair> cons = compiler.getConstraints();
|
final ConstraintSet<Pair> cons = compiler.getConstraints();
|
||||||
String asp = ASPFactory.generateASP(cons, allClasses);
|
String asp = ASPFactory.generateASP(cons, allClasses, ClassLoader.getSystemClassLoader());
|
||||||
System.out.println(asp);
|
System.out.println(asp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user