forked from JavaTX/JavaCompilerCore
Merge branch 'unifyOptimierung' into plugin
This commit is contained in:
commit
a5ed5a2a46
3
.gitignore
vendored
3
.gitignore
vendored
@ -20,3 +20,6 @@ bin
|
|||||||
.project
|
.project
|
||||||
.settings/
|
.settings/
|
||||||
/target/
|
/target/
|
||||||
|
|
||||||
|
#
|
||||||
|
manually/
|
||||||
|
4
pom.xml
4
pom.xml
@ -148,8 +148,8 @@
|
|||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>8</source>
|
<source>9</source>
|
||||||
<target>8</target>
|
<target>9</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package de.dhbwstuttgart.bytecode;
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.*;
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
@ -9,6 +11,7 @@ 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;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString;
|
import de.dhbwstuttgart.bytecode.descriptor.DescriptorToString;
|
||||||
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
import de.dhbwstuttgart.bytecode.descriptor.TypeToDescriptor;
|
||||||
@ -23,6 +26,7 @@ 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.ResultPair;
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
public class BytecodeGen implements ASTVisitor {
|
public class BytecodeGen implements ASTVisitor {
|
||||||
@ -30,9 +34,10 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
ClassWriter cw =new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
ClassWriter cw =new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
||||||
|
|
||||||
String type;
|
String type;
|
||||||
|
|
||||||
String className;
|
String className;
|
||||||
private boolean isInterface;
|
private boolean isInterface;
|
||||||
|
private List<ResultSet> listOfResultSets;
|
||||||
private ResultSet resultSet;
|
private ResultSet resultSet;
|
||||||
private int indexOfFirstParam = 0;
|
private int indexOfFirstParam = 0;
|
||||||
|
|
||||||
@ -47,16 +52,18 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
byte[] bytecode;
|
byte[] bytecode;
|
||||||
HashMap<String,byte[]> classFiles;
|
HashMap<String,byte[]> classFiles;
|
||||||
|
|
||||||
public BytecodeGen(HashMap<String,byte[]> classFiles, ResultSet resultSet) {
|
ArrayList<String> methodNameAndParamsT = new ArrayList<>();
|
||||||
|
|
||||||
|
public BytecodeGen(HashMap<String,byte[]> classFiles, List<ResultSet> listOfResultSets) {
|
||||||
this.classFiles = classFiles;
|
this.classFiles = classFiles;
|
||||||
this.resultSet = resultSet;
|
this.listOfResultSets = listOfResultSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@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, resultSet);
|
BytecodeGen classGen = new BytecodeGen(classFiles, listOfResultSets);
|
||||||
cl.accept(classGen);
|
cl.accept(classGen);
|
||||||
classGen.writeClass(cl.getClassName().toString());
|
classGen.writeClass(cl.getClassName().toString());
|
||||||
}
|
}
|
||||||
@ -101,18 +108,27 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
cw.visit(Opcodes.V1_8, acc, classOrInterface.getClassName().toString()
|
cw.visit(Opcodes.V1_8, acc, classOrInterface.getClassName().toString()
|
||||||
, sig, classOrInterface.getSuperClass().acceptTV(new TypeToDescriptor()), null);
|
, sig, classOrInterface.getSuperClass().acceptTV(new TypeToDescriptor()), null);
|
||||||
|
|
||||||
// for each field in the class
|
|
||||||
for(Field f : classOrInterface.getFieldDecl()) {
|
for(Field f : classOrInterface.getFieldDecl()) {
|
||||||
f.accept(this);
|
f.accept(this);
|
||||||
}
|
}
|
||||||
|
// resultSet = listOfResultSets.get(0);
|
||||||
|
boolean isConsWithNoParamsVisited = false;
|
||||||
|
for(ResultSet rs : listOfResultSets) {
|
||||||
|
resultSet = rs;
|
||||||
|
|
||||||
|
for(Constructor c : classOrInterface.getConstructors()) {
|
||||||
|
if(!isConsWithNoParamsVisited)
|
||||||
|
c.accept(this);
|
||||||
|
if(!c.getParameterList().iterator().hasNext())
|
||||||
|
isConsWithNoParamsVisited = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Method m : classOrInterface.getMethods()) {
|
||||||
|
m.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
for(Constructor c : classOrInterface.getConstructors()) {
|
|
||||||
c.accept(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Method m : classOrInterface.getMethods()) {
|
|
||||||
m.accept(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -146,19 +162,36 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
mv.visitMaxs(0, 0);
|
mv.visitMaxs(0, 0);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Method method) {
|
public void visit(Method method) {
|
||||||
// TODO: check if the method is static => if static then the first param will be stored in pos 0
|
// TODO: check if the method is static => if static then the first param will be 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 methParamTypes = retType+method.name+"%%";
|
||||||
method.getParameterList().accept(this);
|
method.getParameterList().accept(this);
|
||||||
|
|
||||||
|
Iterator<FormalParameter> itr = method.getParameterList().iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
methParamTypes += resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+";";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(methodNameAndParamsT.contains(methParamTypes)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
methodNameAndParamsT.add(methParamTypes);
|
||||||
|
System.out.println("Method: "+method.name +" , paramsType: "+methParamTypes);
|
||||||
String methDesc = null;
|
String methDesc = null;
|
||||||
|
|
||||||
// Method getModifiers() ?
|
// Method getModifiers() ?
|
||||||
int acc = isInterface?Opcodes.ACC_ABSTRACT:method.modifier;
|
int acc = isInterface?Opcodes.ACC_ABSTRACT:method.modifier;
|
||||||
|
System.out.println(acc);
|
||||||
|
|
||||||
|
/*Prüfe, ob die Rückgabe-Type der Methode eine Type-Variable ist*/
|
||||||
boolean hasGenInParameterList = genericsAndBounds.containsKey(resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor()));
|
boolean hasGenInParameterList = genericsAndBounds.containsKey(resultSet.resolveType(method.getReturnType()).resolvedType.acceptTV(new TypeToDescriptor()));
|
||||||
|
/*Wenn die Rückgabe-Type eine Typ-variable ist, erzeuge direkt die Signature, wenn nicht,
|
||||||
|
* prüfe, ob einer der Parameter Typ-Variable als Typ hat*/
|
||||||
if(!hasGenInParameterList) {
|
if(!hasGenInParameterList) {
|
||||||
for(String paramName : methodParamsAndTypes.keySet()) {
|
for(String paramName : methodParamsAndTypes.keySet()) {
|
||||||
String typeOfParam = methodParamsAndTypes.get(paramName).acceptTV(new TypeToDescriptor());
|
String typeOfParam = methodParamsAndTypes.get(paramName).acceptTV(new TypeToDescriptor());
|
||||||
@ -170,9 +203,11 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Test if the return-type or any of the parameter is a parameterized type. (VP)
|
//TODO: Test if the return-type or any of the parameter is a parameterized type. (VP)
|
||||||
//than create the descriptor with the new syntax.
|
//then create the descriptor with the new syntax.
|
||||||
|
|
||||||
String sig = null;
|
String sig = null;
|
||||||
|
/* method.getGenerics: <....> RT method(..)
|
||||||
|
* */
|
||||||
boolean hasGen = method.getGenerics().iterator().hasNext() || hasGenInParameterList;
|
boolean hasGen = method.getGenerics().iterator().hasNext() || hasGenInParameterList;
|
||||||
|
|
||||||
/* if method has generics or return type is TPH, create signature */
|
/* if method has generics or return type is TPH, create signature */
|
||||||
@ -181,16 +216,17 @@ public class BytecodeGen implements ASTVisitor {
|
|||||||
Signature signature = new Signature(method, genericsAndBoundsMethod, methodParamsAndTypes,resultSet);
|
Signature signature = new Signature(method, genericsAndBoundsMethod, methodParamsAndTypes,resultSet);
|
||||||
sig = signature.toString();
|
sig = signature.toString();
|
||||||
}
|
}
|
||||||
System.out.println(sig);
|
// System.out.println(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);
|
|
||||||
|
// 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,resultSet,method, mv,paramsAndLocals,cw,
|
BytecodeGenMethod gen = new BytecodeGenMethod(className,resultSet,method, mv,paramsAndLocals,cw,
|
||||||
genericsAndBounds,genericsAndBounds,isInterface,classFiles);
|
genericsAndBoundsMethod,genericsAndBounds,isInterface,classFiles);
|
||||||
|
|
||||||
mv.visitMaxs(0, 0);
|
mv.visitMaxs(0, 0);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -49,9 +49,10 @@ public class DescriptorToString implements DescriptorVisitor{
|
|||||||
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// else if(((RefType) fp.getType()).getParaList().size() > 0){
|
//TODO: generate a class java%% ... %%
|
||||||
// desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "%").replace("<", "%%").replace(">", "%%")+ ";";
|
else if(resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor()).contains("<")){
|
||||||
// }
|
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "%").replace("<", "%%").replace(">", "%%")+ ";";
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
desc += "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,41 @@
|
|||||||
package de.dhbwstuttgart.core;
|
package de.dhbwstuttgart.core;
|
||||||
|
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.bytecode.BytecodeGen;
|
||||||
import de.dhbwstuttgart.environment.CompilationEnvironment;
|
import de.dhbwstuttgart.environment.CompilationEnvironment;
|
||||||
import de.dhbwstuttgart.parser.JavaTXParser;
|
import de.dhbwstuttgart.parser.JavaTXParser;
|
||||||
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator;
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator;
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8Parser.CompilationUnitContext;
|
import de.dhbwstuttgart.parser.antlr.Java8Parser.CompilationUnitContext;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ParameterList;
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory;
|
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.visual.ASTTypePrinter;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
import de.dhbwstuttgart.typeinference.typeAlgo.TYPE;
|
import de.dhbwstuttgart.typeinference.typeAlgo.TYPE;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.RuleSet;
|
||||||
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
|
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.distributeVariance;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class JavaTXCompiler {
|
public class JavaTXCompiler {
|
||||||
|
|
||||||
@ -94,20 +104,114 @@ public class JavaTXCompiler {
|
|||||||
|
|
||||||
TypeUnify unify = new TypeUnify();
|
TypeUnify unify = new TypeUnify();
|
||||||
Set<Set<UnifyPair>> results = new HashSet<>();
|
Set<Set<UnifyPair>> results = new HashSet<>();
|
||||||
for (List<Constraint<UnifyPair>> xCons : unifyCons.cartesianProduct()) {
|
try {
|
||||||
Set<UnifyPair> xConsSet = new HashSet<>();
|
FileWriter logFile = new FileWriter(new File(System.getProperty("user.dir")+"/test/logFiles/"+"log"));
|
||||||
for (Constraint<UnifyPair> constraint : xCons) {
|
logFile.write("FC:\\" + finiteClosure.toString()+"\n");
|
||||||
xConsSet.addAll(constraint);
|
for(SourceFile sf : this.sourceFiles.values()) {
|
||||||
}
|
logFile.write(ASTTypePrinter.print(sf));
|
||||||
|
}
|
||||||
System.out.println(xConsSet);
|
logFile.flush();
|
||||||
Set<Set<UnifyPair>> result = unify.unify(xConsSet, finiteClosure);
|
Set<List<Constraint<UnifyPair>>> cardProd = unifyCons.cartesianProduct();
|
||||||
System.out.println("RESULT: " + result.size());
|
for (List<Constraint<UnifyPair>> xCons : cardProd ){
|
||||||
results.addAll(result);
|
Set<UnifyPair> xConsSet = new HashSet<>();
|
||||||
|
for (Constraint<UnifyPair> constraint : xCons) {
|
||||||
|
xConsSet.addAll(constraint);
|
||||||
|
}
|
||||||
|
//.collect(Collectors.toCollection(ArrayList::new))))
|
||||||
|
System.out.println(xConsSet);
|
||||||
|
Set<String> paraTypeVarNames = allClasses.stream().map(x -> x.getMethods().stream().map(y -> y.getParameterList().getFormalparalist()
|
||||||
|
.stream().filter(z -> z.getType() instanceof TypePlaceholder)
|
||||||
|
.map(z -> ((TypePlaceholder)z.getType()).getName()).collect(Collectors.toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} ).get())
|
||||||
|
.reduce((a,b) -> { a.addAll(b); return a;} ).get();
|
||||||
|
|
||||||
|
Set<String> returnTypeVarNames = allClasses.stream().map(x -> x.getMethods().stream().filter(y -> y.getReturnType() instanceof TypePlaceholder)
|
||||||
|
.map(z -> ((TypePlaceholder)z.getReturnType()).getName()).collect(Collectors.toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} ).get();
|
||||||
|
|
||||||
|
|
||||||
|
xConsSet = xConsSet.stream().map(x -> {
|
||||||
|
//Hier muss ueberlegt werden, ob
|
||||||
|
//1. alle Argument- und Retuntyp-Variablen in allen UnifyPairs
|
||||||
|
// mit disableWildcardtable() werden.
|
||||||
|
//2. alle Typvariablen mit Argument- oder Retuntyp-Variablen
|
||||||
|
//in Beziehung auch auf disableWildcardtable() gesetzt werden muessen
|
||||||
|
//PL 2018-04-23
|
||||||
|
if ((x.getLhsType() instanceof PlaceholderType)) {
|
||||||
|
if (paraTypeVarNames.contains(x.getLhsType().getName())) {
|
||||||
|
((PlaceholderType)x.getLhsType()).setVariance((byte)1);
|
||||||
|
((PlaceholderType)x.getLhsType()).disableWildcardtable();
|
||||||
|
}
|
||||||
|
if (returnTypeVarNames.contains(x.getLhsType().getName())) {
|
||||||
|
((PlaceholderType)x.getLhsType()).setVariance((byte)-1);
|
||||||
|
((PlaceholderType)x.getLhsType()).disableWildcardtable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((x.getRhsType() instanceof PlaceholderType)) {
|
||||||
|
if (paraTypeVarNames.contains(x.getRhsType().getName())) {
|
||||||
|
((PlaceholderType)x.getRhsType()).setVariance((byte)1);
|
||||||
|
((PlaceholderType)x.getRhsType()).disableWildcardtable();
|
||||||
|
}
|
||||||
|
if (returnTypeVarNames.contains(x.getRhsType().getName())) {
|
||||||
|
((PlaceholderType)x.getRhsType()).setVariance((byte)-1);
|
||||||
|
((PlaceholderType)x.getRhsType()).disableWildcardtable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return x;//HIER DIE JEWEILS RECHT BZW. LINKE SEITE AUF GLEICHE VARIANZ SETZEN WIE DIE JEWEILS ANDERE SEITE
|
||||||
|
}).map( y -> {
|
||||||
|
if ((y.getLhsType() instanceof PlaceholderType) && (y.getRhsType() instanceof PlaceholderType)) {
|
||||||
|
if (((PlaceholderType)y.getLhsType()).getVariance() != 0 && ((PlaceholderType)y.getRhsType()).getVariance() == 0) {
|
||||||
|
((PlaceholderType)y.getRhsType()).setVariance(((PlaceholderType)y.getLhsType()).getVariance());
|
||||||
|
}
|
||||||
|
if (((PlaceholderType)y.getLhsType()).getVariance() == 0 && ((PlaceholderType)y.getRhsType()).getVariance() != 0) {
|
||||||
|
((PlaceholderType)y.getLhsType()).setVariance(((PlaceholderType)y.getRhsType()).getVariance());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return y; } )
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
varianceInheritance(xConsSet);
|
||||||
|
Set<Set<UnifyPair>> result = unify.unifySequential(xConsSet, finiteClosure, logFile);
|
||||||
|
//Set<Set<UnifyPair>> result = unify.unify(xConsSet, finiteClosure);
|
||||||
|
System.out.println("RESULT: " + result);
|
||||||
|
logFile.write("RES: " + result.toString()+"\n");
|
||||||
|
logFile.flush();
|
||||||
|
results.addAll(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException e) { }
|
||||||
|
|
||||||
|
return results.stream().map((unifyPairs ->
|
||||||
|
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
return results.stream().map((unifyPairs ->
|
|
||||||
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
|
/**
|
||||||
}
|
* Vererbt alle Variancen
|
||||||
|
* @param eq The set of constraints
|
||||||
|
*/
|
||||||
|
private void varianceInheritance(Set<UnifyPair> eq) {
|
||||||
|
Set<PlaceholderType> usedTPH = new HashSet<>();
|
||||||
|
Set<PlaceholderType> phSet = eq.stream().map(x -> {
|
||||||
|
Set<PlaceholderType> pair = new HashSet<>();
|
||||||
|
if (x.getLhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getLhsType());
|
||||||
|
if (x.getRhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getRhsType());
|
||||||
|
return pair;
|
||||||
|
}).reduce(new HashSet<>(), (a,b) -> { a.addAll(b); return a;} , (c,d) -> { c.addAll(d); return c;});
|
||||||
|
|
||||||
|
ArrayList<PlaceholderType> phSetVariance = new ArrayList<>(phSet);
|
||||||
|
phSetVariance.removeIf(x -> (x.getVariance() == 0));
|
||||||
|
while(!phSetVariance.isEmpty()) {
|
||||||
|
PlaceholderType a = phSetVariance.remove(0);
|
||||||
|
usedTPH.add(a);
|
||||||
|
//HashMap<PlaceholderType,Integer> ht = new HashMap<>();
|
||||||
|
//ht.put(a, a.getVariance());
|
||||||
|
Set<UnifyPair> eq1 = new HashSet<>(eq);
|
||||||
|
eq1.removeIf(x -> !(x.getLhsType() instanceof PlaceholderType && ((PlaceholderType)x.getLhsType()).equals(a)));
|
||||||
|
eq1.stream().forEach(x -> { x.getRhsType().accept(new distributeVariance(), a.getVariance());});
|
||||||
|
eq1 = new HashSet<>(eq);
|
||||||
|
eq1.removeIf(x -> !(x.getRhsType() instanceof PlaceholderType && ((PlaceholderType)x.getRhsType()).equals(a)));
|
||||||
|
eq1.stream().forEach(x -> { x.getLhsType().accept(new distributeVariance(), a.getVariance());});
|
||||||
|
phSetVariance = new ArrayList<>(phSet);
|
||||||
|
phSetVariance.removeIf(x -> (x.getVariance() == 0 || usedTPH.contains(x)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Map<String, TypePlaceholder> generateTPHMap(ConstraintSet<Pair> constraints) {
|
private Map<String, TypePlaceholder> generateTPHMap(ConstraintSet<Pair> constraints) {
|
||||||
HashMap<String, TypePlaceholder> ret = new HashMap<>();
|
HashMap<String, TypePlaceholder> ret = new HashMap<>();
|
||||||
@ -129,5 +233,28 @@ public class JavaTXCompiler {
|
|||||||
SourceFile ret = generator.convert(tree, environment.packageCrawler);
|
SourceFile ret = generator.convert(tree, environment.packageCrawler);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void generateBytecode() throws ClassNotFoundException, IOException {
|
||||||
|
for(File f : sourceFiles.keySet()) {
|
||||||
|
HashMap<String,byte[]> classFiles = new HashMap<>();
|
||||||
|
SourceFile sf = sourceFiles.get(f);
|
||||||
|
List<ResultSet> typeinferenceResult = this.typeInference();
|
||||||
|
BytecodeGen bytecodeGen = new BytecodeGen(classFiles,typeinferenceResult);
|
||||||
|
// BytecodeGen bytecodeGen = new BytecodeGen(classFiles,typeinferenceResult.get(0));
|
||||||
|
bytecodeGen.visit(sf);
|
||||||
|
this.writeClassFile(bytecodeGen.getClassFiles());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
private void writeClassFile(HashMap<String, byte[]> classFiles) throws IOException {
|
||||||
|
FileOutputStream output;
|
||||||
|
for(String name : classFiles.keySet()) {
|
||||||
|
byte[] bytecode = classFiles.get(name);
|
||||||
|
System.out.println("generating "+name+ ".class file ...");
|
||||||
|
output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/" +name+".class"));
|
||||||
|
output.write(bytecode);
|
||||||
|
output.close();
|
||||||
|
System.out.println(name+".class file generated");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -832,7 +832,7 @@ public class StatementGenerator {
|
|||||||
}else if(literal.StringLiteral()!=null){
|
}else if(literal.StringLiteral()!=null){
|
||||||
RefType type = new RefType(reg.getName("java.lang.String"),literal.getStart());
|
RefType type = new RefType(reg.getName("java.lang.String"),literal.getStart());
|
||||||
return new Literal(type,
|
return new Literal(type,
|
||||||
literal.StringLiteral().getText(),
|
literal.StringLiteral().getText().substring(1, literal.StringLiteral().getText().length()-1),
|
||||||
literal.getStart());
|
literal.getStart());
|
||||||
}else if(literal.NullLiteral() != null){
|
}else if(literal.NullLiteral() != null){
|
||||||
return new Literal(TypePlaceholder.fresh(literal.getStart()), null,
|
return new Literal(TypePlaceholder.fresh(literal.getStart()), null,
|
||||||
|
@ -113,9 +113,7 @@ public class TypeGenerator {
|
|||||||
if(referenceTypeContext.classOrInterfaceType() != null){
|
if(referenceTypeContext.classOrInterfaceType() != null){
|
||||||
if(referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType()!= null){
|
if(referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType()!= null){
|
||||||
Java8Parser.ClassType_lfno_classOrInterfaceTypeContext ctx = referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType();
|
Java8Parser.ClassType_lfno_classOrInterfaceTypeContext ctx = referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType();
|
||||||
//return convertTypeName(ctx.Identifier().toString(), ctx.typeArguments(),referenceTypeContext.getStart(), reg, generics);
|
return convertTypeName(ctx.Identifier().toString(), ctx.typeArguments(),referenceTypeContext.getStart(), reg, generics);
|
||||||
if(ctx.typeArguments() != null)throw new NotImplementedException();
|
|
||||||
return convertTypeName(referenceTypeContext.getText(), null,referenceTypeContext.getStart(), reg, generics);
|
|
||||||
}else{
|
}else{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -106,4 +106,8 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
|
|||||||
public Collection<RefType> getSuperInterfaces() {
|
public Collection<RefType> getSuperInterfaces() {
|
||||||
return implementedInterfaces;
|
return implementedInterfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return this.name.toString() + this.genericClassParameters.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,4 +31,8 @@ public class GenericDeclarationList extends SyntaxTreeNode implements Iterable<G
|
|||||||
public void accept(ASTVisitor visitor) {
|
public void accept(ASTVisitor visitor) {
|
||||||
visitor.visit(this);
|
visitor.visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return this.gtvs.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,8 @@ import de.dhbwstuttgart.typeinference.result.ResultPair;
|
|||||||
import de.dhbwstuttgart.typeinference.unify.model.*;
|
import de.dhbwstuttgart.typeinference.unify.model.*;
|
||||||
|
|
||||||
public class UnifyTypeFactory {
|
public class UnifyTypeFactory {
|
||||||
|
|
||||||
|
private static ArrayList<PlaceholderType> PLACEHOLDERS = new ArrayList<>();
|
||||||
|
|
||||||
public static FiniteClosure generateFC(List<ClassOrInterface> fromClasses) throws ClassNotFoundException {
|
public static FiniteClosure generateFC(List<ClassOrInterface> fromClasses) throws ClassNotFoundException {
|
||||||
/*
|
/*
|
||||||
@ -113,7 +115,15 @@ public class UnifyTypeFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static UnifyType convert(TypePlaceholder tph){
|
public static UnifyType convert(TypePlaceholder tph){
|
||||||
return new PlaceholderType(tph.getName());
|
PlaceholderType ntph = new PlaceholderType(tph.getName());
|
||||||
|
int in = PLACEHOLDERS.indexOf(ntph);
|
||||||
|
if (in == -1) {
|
||||||
|
PLACEHOLDERS.add(ntph);
|
||||||
|
return ntph;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return PLACEHOLDERS.get(in);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UnifyType convert(GenericRefType t){
|
public static UnifyType convert(GenericRefType t){
|
||||||
|
@ -11,6 +11,7 @@ public class Pair implements Serializable
|
|||||||
public final RefTypeOrTPHOrWildcardOrGeneric TA2;
|
public final RefTypeOrTPHOrWildcardOrGeneric TA2;
|
||||||
|
|
||||||
private PairOperator eOperator = PairOperator.SMALLER;
|
private PairOperator eOperator = PairOperator.SMALLER;
|
||||||
|
|
||||||
|
|
||||||
public Pair(RefTypeOrTPHOrWildcardOrGeneric TA1, RefTypeOrTPHOrWildcardOrGeneric TA2 )
|
public Pair(RefTypeOrTPHOrWildcardOrGeneric TA1, RefTypeOrTPHOrWildcardOrGeneric TA2 )
|
||||||
{
|
{
|
||||||
|
@ -57,8 +57,8 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
public void visit(LambdaExpression lambdaExpression) {
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
TypePlaceholder tphRetType = TypePlaceholder.fresh(new NullToken());
|
TypePlaceholder tphRetType = TypePlaceholder.fresh(new NullToken());
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> lambdaParams = lambdaExpression.params.getFormalparalist().stream().map((formalParameter -> formalParameter.getType())).collect(Collectors.toList());
|
List<RefTypeOrTPHOrWildcardOrGeneric> lambdaParams = lambdaExpression.params.getFormalparalist().stream().map((formalParameter -> formalParameter.getType())).collect(Collectors.toList());
|
||||||
//lambdaParams.add(tphRetType);
|
lambdaParams.add(tphRetType);
|
||||||
lambdaParams.add(0,tphRetType);
|
//lambdaParams.add(0,tphRetType);
|
||||||
constraintsSet.addUndConstraint(
|
constraintsSet.addUndConstraint(
|
||||||
new Pair(lambdaExpression.getType(),
|
new Pair(lambdaExpression.getType(),
|
||||||
new FunN(lambdaParams),PairOperator.EQUALSDOT));
|
new FunN(lambdaParams),PairOperator.EQUALSDOT));
|
||||||
@ -185,6 +185,12 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final RefType number = new RefType(ASTFactory.createClass(Number.class).getClassName(), new NullToken());
|
private final RefType number = new RefType(ASTFactory.createClass(Number.class).getClassName(), new NullToken());
|
||||||
|
private final RefType longg = new RefType(ASTFactory.createClass(Long.class).getClassName(), new NullToken());
|
||||||
|
private final RefType integer = new RefType(ASTFactory.createClass(Integer.class).getClassName(), new NullToken());
|
||||||
|
private final RefType shortt = new RefType(ASTFactory.createClass(Short.class).getClassName(), new NullToken());
|
||||||
|
private final RefType bytee = new RefType(ASTFactory.createClass(Byte.class).getClassName(), new NullToken());
|
||||||
|
private final RefType floatt = new RefType(ASTFactory.createClass(Float.class).getClassName(), new NullToken());
|
||||||
|
private final RefType doublee = new RefType(ASTFactory.createClass(Double.class).getClassName(), new NullToken());
|
||||||
private final RefType string = new RefType(ASTFactory.createClass(String.class).getClassName(), new NullToken());
|
private final RefType string = new RefType(ASTFactory.createClass(String.class).getClassName(), new NullToken());
|
||||||
private final RefType bool = new RefType(ASTFactory.createClass(Boolean.class).getClassName(), new NullToken());
|
private final RefType bool = new RefType(ASTFactory.createClass(Boolean.class).getClassName(), new NullToken());
|
||||||
@Override
|
@Override
|
||||||
@ -205,18 +211,47 @@ public class TYPEStmt implements StatementVisitor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(BinaryExpr binary) {
|
public void visit(BinaryExpr binary) {
|
||||||
|
binary.lexpr.accept(this);
|
||||||
|
binary.rexpr.accept(this);
|
||||||
if(binary.operation.equals(BinaryExpr.Operator.DIV) ||
|
if(binary.operation.equals(BinaryExpr.Operator.DIV) ||
|
||||||
binary.operation.equals(BinaryExpr.Operator.MUL)||
|
binary.operation.equals(BinaryExpr.Operator.MUL)||
|
||||||
binary.operation.equals(BinaryExpr.Operator.MOD)||
|
binary.operation.equals(BinaryExpr.Operator.MOD)||
|
||||||
binary.operation.equals(BinaryExpr.Operator.ADD)){
|
binary.operation.equals(BinaryExpr.Operator.ADD)){
|
||||||
Set<Constraint> numericAdditionOrStringConcatenation = new HashSet<>();
|
Set<Constraint> numericAdditionOrStringConcatenation = new HashSet<>();
|
||||||
Constraint<Pair> numeric = new Constraint<>();
|
|
||||||
//Zuerst der Fall für Numerische AusdrücPairOpnumericeratorke, das sind Mul, Mod und Div immer:
|
//Zuerst der Fall für Numerische AusdrücPairOpnumericeratorke, das sind Mul, Mod und Div immer:
|
||||||
//see: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17
|
//see: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17
|
||||||
//Expression muss zu Numeric Convertierbar sein. also von Numeric erben
|
//Expression muss zu Numeric Convertierbar sein. also von Numeric erben
|
||||||
numeric.add(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERDOT));
|
Constraint<Pair> numeric = new Constraint<>();
|
||||||
numeric.add(new Pair(binary.rexpr.getType(), number, 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.getType(), integer, PairOperator.SMALLERDOT));
|
||||||
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
|
numeric = new Constraint<>();
|
||||||
|
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.getType(), integer, PairOperator.SMALLERDOT));
|
||||||
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
|
numeric = new Constraint<>();
|
||||||
|
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.getType(), integer, PairOperator.SMALLERDOT));
|
||||||
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
|
numeric = new Constraint<>();
|
||||||
|
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.getType(), longg, PairOperator.SMALLERDOT));
|
||||||
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
|
numeric = new Constraint<>();
|
||||||
|
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.getType(), floatt, PairOperator.SMALLERDOT));
|
||||||
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
|
numeric = new Constraint<>();
|
||||||
|
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.getType(), doublee, PairOperator.SMALLERDOT));
|
||||||
|
numericAdditionOrStringConcatenation.add(numeric);
|
||||||
/*
|
/*
|
||||||
In Java passiert bei den binären Operatoren eine sogenannte Type Promotion:
|
In Java passiert bei den binären Operatoren eine sogenannte Type Promotion:
|
||||||
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
|
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
|
||||||
|
@ -94,7 +94,8 @@ public class MartelliMontanariUnify implements IUnify {
|
|||||||
// SUBST - Rule
|
// SUBST - Rule
|
||||||
if(lhsType instanceof PlaceholderType) {
|
if(lhsType instanceof PlaceholderType) {
|
||||||
mgu.add((PlaceholderType) lhsType, rhsType);
|
mgu.add((PlaceholderType) lhsType, rhsType);
|
||||||
termsList = termsList.stream().map(mgu::apply).collect(Collectors.toCollection(ArrayList::new));
|
//PL 2018-04-01 nach checken, ob es richtig ist, dass keine Substitutionen uebergeben werden muessen.
|
||||||
|
termsList = termsList.stream().map(x -> mgu.apply(x)).collect(Collectors.toCollection(ArrayList::new));
|
||||||
idx = idx+1 == termsList.size() ? 0 : idx+1;
|
idx = idx+1 == termsList.size() ? 0 : idx+1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -24,13 +24,27 @@ 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.unify.distributeVariance;
|
||||||
|
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of the type inference rules.
|
* Implementation of the type inference rules.
|
||||||
* @author Florian Steurer
|
* @author Florian Steurer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class RuleSet implements IRuleSet{
|
public class RuleSet implements IRuleSet{
|
||||||
|
|
||||||
|
FileWriter logFile;
|
||||||
|
|
||||||
|
RuleSet() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
RuleSet(FileWriter logFile) {
|
||||||
|
this.logFile = logFile;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<UnifyPair> reduceUp(UnifyPair pair) {
|
public Optional<UnifyPair> reduceUp(UnifyPair pair) {
|
||||||
@ -47,7 +61,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
// Rule is applicable, unpack the SuperType
|
// Rule is applicable, unpack the SuperType
|
||||||
return Optional.of(new UnifyPair(lhsType, ((SuperType) rhsType).getSuperedType(), PairOperator.SMALLERDOT));
|
return Optional.of(new UnifyPair(lhsType, ((SuperType) rhsType).getSuperedType(), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -65,7 +79,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
// Rule is applicable, unpack the ExtendsType
|
// Rule is applicable, unpack the ExtendsType
|
||||||
return Optional.of(new UnifyPair(((ExtendsType) lhsType).getExtendedType(), rhsType, PairOperator.SMALLERDOT));
|
return Optional.of(new UnifyPair(((ExtendsType) lhsType).getExtendedType(), rhsType, PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -83,7 +97,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
// Rule is applicable, unpack both sides
|
// Rule is applicable, unpack both sides
|
||||||
return Optional.of(new UnifyPair(((ExtendsType) lhsType).getExtendedType(),((SuperType) rhsType).getSuperedType(), PairOperator.SMALLERDOT));
|
return Optional.of(new UnifyPair(((ExtendsType) lhsType).getExtendedType(),((SuperType) rhsType).getSuperedType(), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -133,7 +147,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
Set<UnifyPair> result = new HashSet<>();
|
Set<UnifyPair> result = new HashSet<>();
|
||||||
|
|
||||||
for(int rhsIdx = 0; rhsIdx < extYParams.size(); rhsIdx++)
|
for(int rhsIdx = 0; rhsIdx < extYParams.size(); rhsIdx++)
|
||||||
result.add(new UnifyPair(xParams.get(pi[rhsIdx]), extYParams.get(rhsIdx), PairOperator.SMALLERDOTWC));
|
result.add(new UnifyPair(xParams.get(pi[rhsIdx]), extYParams.get(rhsIdx), PairOperator.SMALLERDOTWC, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
@ -184,7 +198,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
for(int rhsIdx = 0; rhsIdx < supYParams.size(); rhsIdx++)
|
for(int rhsIdx = 0; rhsIdx < supYParams.size(); rhsIdx++)
|
||||||
result.add(new UnifyPair(supYParams.get(rhsIdx), xParams.get(pi[rhsIdx]), PairOperator.SMALLERDOTWC));
|
result.add(new UnifyPair(supYParams.get(rhsIdx), xParams.get(pi[rhsIdx]), PairOperator.SMALLERDOTWC, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
@ -215,7 +229,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
TypeParams rhsTypeParams = rhsType.getTypeParams();
|
TypeParams rhsTypeParams = rhsType.getTypeParams();
|
||||||
|
|
||||||
for(int i = 0; i < lhsTypeParams.size(); i++)
|
for(int i = 0; i < lhsTypeParams.size(); i++)
|
||||||
result.add(new UnifyPair(lhsTypeParams.get(i), rhsTypeParams.get(i), PairOperator.EQUALSDOT));
|
result.add(new UnifyPair(lhsTypeParams.get(i), rhsTypeParams.get(i), PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
@ -236,19 +250,53 @@ public class RuleSet implements IRuleSet{
|
|||||||
ReferenceType lhsSType = (ReferenceType) c;
|
ReferenceType lhsSType = (ReferenceType) c;
|
||||||
ReferenceType rhsSType = (ReferenceType) d;
|
ReferenceType rhsSType = (ReferenceType) d;
|
||||||
|
|
||||||
|
//try {
|
||||||
|
// logFile.write("PAIR Rules: " + pair + "\n");
|
||||||
|
// logFile.flush();
|
||||||
|
//}
|
||||||
|
//catch (IOException e) { }
|
||||||
|
|
||||||
if(lhsSType.getTypeParams().empty() || lhsSType.getTypeParams().size() != rhsSType.getTypeParams().size())
|
if(lhsSType.getTypeParams().empty() || lhsSType.getTypeParams().size() != rhsSType.getTypeParams().size())
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
UnifyType cFromFc = fc.getLeftHandedType(c.getName()).orElse(null);
|
UnifyType cFromFc = fc.getLeftHandedType(c.getName()).orElse(null);
|
||||||
|
//2018-02-23: liefert Vector<Vector<Integer>>: Das kann nicht sein.
|
||||||
|
|
||||||
|
//NOCHMAL UEBERPRUEFEN
|
||||||
|
//PL 18-02-09 Eingfuegt Anfang
|
||||||
|
//C und D koennen auch gleich sein.
|
||||||
|
if (c.getName().equals(d.getName())) {
|
||||||
|
Set<UnifyPair> result = new HashSet<>();
|
||||||
|
TypeParams rhsTypeParams = d.getTypeParams();
|
||||||
|
TypeParams lhsTypeParams = c.getTypeParams();
|
||||||
|
for(int rhsIdx = 0; rhsIdx < c.getTypeParams().size(); rhsIdx++)
|
||||||
|
result.add(new UnifyPair(lhsTypeParams.get(rhsIdx), rhsTypeParams.get(rhsIdx), PairOperator.SMALLERDOTWC, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
|
return Optional.of(result);
|
||||||
|
}
|
||||||
|
//PL 18-02-09 Eingfuegt ENDE
|
||||||
|
|
||||||
|
//try {
|
||||||
|
// logFile.write("cFromFc: " + cFromFc);
|
||||||
|
// logFile.flush();
|
||||||
|
//}
|
||||||
|
//catch (IOException e) { }
|
||||||
|
|
||||||
if(cFromFc == null || !cFromFc.getTypeParams().arePlaceholders())
|
if(cFromFc == null || !cFromFc.getTypeParams().arePlaceholders())
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
UnifyType dFromFc = fc.getAncestors(cFromFc).stream().filter(x -> x.getName().equals(d.getName())).findAny().orElse(null);
|
UnifyType dFromFc = fc.getAncestors(cFromFc).stream().filter(x -> x.getName().equals(d.getName())).findAny().orElse(null);
|
||||||
|
|
||||||
|
//try {
|
||||||
|
// logFile.write("cFromFc: " + cFromFc);
|
||||||
|
// logFile.flush();
|
||||||
|
//}
|
||||||
|
//catch (IOException e) { }
|
||||||
|
|
||||||
if(dFromFc == null || !dFromFc.getTypeParams().arePlaceholders() || dFromFc.getTypeParams().size() != cFromFc.getTypeParams().size())
|
if(dFromFc == null || !dFromFc.getTypeParams().arePlaceholders() || dFromFc.getTypeParams().size() != cFromFc.getTypeParams().size())
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
//System.out.println("cFromFc: " + cFromFc);
|
||||||
|
//System.out.println("dFromFc: " + dFromFc);
|
||||||
int[] pi = pi(cFromFc.getTypeParams(), dFromFc.getTypeParams());
|
int[] pi = pi(cFromFc.getTypeParams(), dFromFc.getTypeParams());
|
||||||
|
|
||||||
if(pi.length == 0)
|
if(pi.length == 0)
|
||||||
@ -259,7 +307,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
Set<UnifyPair> result = new HashSet<>();
|
Set<UnifyPair> result = new HashSet<>();
|
||||||
|
|
||||||
for(int rhsIdx = 0; rhsIdx < rhsTypeParams.size(); rhsIdx++)
|
for(int rhsIdx = 0; rhsIdx < rhsTypeParams.size(); rhsIdx++)
|
||||||
result.add(new UnifyPair(lhsTypeParams.get(pi[rhsIdx]), rhsTypeParams.get(rhsIdx), PairOperator.SMALLERDOTWC));
|
result.add(new UnifyPair(lhsTypeParams.get(pi[rhsIdx]), rhsTypeParams.get(rhsIdx), PairOperator.SMALLERDOTWC, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
@ -314,7 +362,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
TypeParams rhsTypeParams = rhsSType.getTypeParams();
|
TypeParams rhsTypeParams = rhsSType.getTypeParams();
|
||||||
TypeParams lhsTypeParams = lhsSType.getTypeParams();
|
TypeParams lhsTypeParams = lhsSType.getTypeParams();
|
||||||
for(int i = 0; i < rhsTypeParams.size(); i++)
|
for(int i = 0; i < rhsTypeParams.size(); i++)
|
||||||
result.add(new UnifyPair(lhsTypeParams.get(i), rhsTypeParams.get(i), PairOperator.EQUALSDOT));
|
result.add(new UnifyPair(lhsTypeParams.get(i), rhsTypeParams.get(i), PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
@ -365,7 +413,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
if(!(pair.getRhsType() instanceof PlaceholderType))
|
if(!(pair.getRhsType() instanceof PlaceholderType))
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(pair.getRhsType(), pair.getLhsType(), PairOperator.EQUALSDOT));
|
return Optional.of(new UnifyPair(pair.getRhsType(), pair.getLhsType(), PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -407,11 +455,19 @@ public class RuleSet implements IRuleSet{
|
|||||||
TypeParams typeDParams = typeD.getTypeParams();
|
TypeParams typeDParams = typeD.getTypeParams();
|
||||||
TypeParams typeDgenParams = typeDgen.getTypeParams();
|
TypeParams typeDgenParams = typeDgen.getTypeParams();
|
||||||
|
|
||||||
|
//System.out.println("Pair: " +pair);
|
||||||
|
//System.out.println("typeD: " +typeD);
|
||||||
|
//System.out.println("typeDParams: " +typeDParams);
|
||||||
|
//System.out.println("typeDgen: " +typeD);
|
||||||
|
//System.out.println("typeDgenParams: " +typeDgenParams);
|
||||||
Unifier unif = Unifier.identity();
|
Unifier unif = Unifier.identity();
|
||||||
for(int i = 0; i < typeDParams.size(); i++)
|
for(int i = 0; i < typeDParams.size(); i++) {
|
||||||
|
//System.out.println("ADAPT" +typeDgenParams);
|
||||||
|
if (typeDgenParams.get(i) instanceof PlaceholderType)
|
||||||
unif.add((PlaceholderType) typeDgenParams.get(i), typeDParams.get(i));
|
unif.add((PlaceholderType) typeDgenParams.get(i), typeDParams.get(i));
|
||||||
|
else System.out.println("ERROR");
|
||||||
return Optional.of(new UnifyPair(unif.apply(newLhs), typeDs, PairOperator.SMALLERDOT));
|
}
|
||||||
|
return Optional.of(new UnifyPair(unif.apply(newLhs), typeDs, PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -457,7 +513,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
for(int i = 1; i < typeDParams.size(); i++)
|
for(int i = 1; i < typeDParams.size(); i++)
|
||||||
unif.add((PlaceholderType) typeDgenParams.get(i), typeDParams.get(i));
|
unif.add((PlaceholderType) typeDgenParams.get(i), typeDParams.get(i));
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(unif.apply(newLhs), typeExtDs, PairOperator.SMALLERDOTWC));
|
return Optional.of(new UnifyPair(unif.apply(newLhs), typeExtDs, PairOperator.SMALLERDOTWC, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -509,7 +565,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
for(int i = 1; i < typeDParams.size(); i++)
|
for(int i = 1; i < typeDParams.size(); i++)
|
||||||
unif.add((PlaceholderType) typeSupDsgenParams.get(i), typeDParams.get(i));
|
unif.add((PlaceholderType) typeSupDsgenParams.get(i), typeDParams.get(i));
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(unif.apply(newLhs), newRhs, PairOperator.SMALLERDOTWC));
|
return Optional.of(new UnifyPair(unif.apply(newLhs), newRhs, PairOperator.SMALLERDOTWC, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -581,8 +637,8 @@ public class RuleSet implements IRuleSet{
|
|||||||
&& typeMap.get(lhsType) > 1 // The type occurs in more pairs in the set than just the recent pair.
|
&& typeMap.get(lhsType) > 1 // The type occurs in more pairs in the set than just the recent pair.
|
||||||
&& !rhsType.getTypeParams().occurs(lhsType)) {
|
&& !rhsType.getTypeParams().occurs(lhsType)) {
|
||||||
Unifier uni = new Unifier(lhsType, rhsType);
|
Unifier uni = new Unifier(lhsType, rhsType);
|
||||||
result = result.stream().map(uni::apply).collect(Collectors.toCollection(ArrayList::new));
|
result = result.stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(ArrayList::new));
|
||||||
result1 = result1.stream().map(uni::apply).collect(Collectors.toCollection(LinkedList::new));
|
result1 = result1.stream().map(x -> uni.apply(pair,x)).collect(Collectors.toCollection(LinkedList::new));
|
||||||
applied = true;
|
applied = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -602,7 +658,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
if(!(lhsType instanceof ExtendsType) || !(rhsType instanceof ExtendsType))
|
if(!(lhsType instanceof ExtendsType) || !(rhsType instanceof ExtendsType))
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(((ExtendsType) lhsType).getExtendedType(), ((ExtendsType) rhsType).getExtendedType(), PairOperator.SMALLERDOT));
|
return Optional.of(new UnifyPair(((ExtendsType) lhsType).getExtendedType(), ((ExtendsType) rhsType).getExtendedType(), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -615,7 +671,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
if(!(lhsType instanceof ReferenceType) || !(rhsType instanceof ExtendsType))
|
if(!(lhsType instanceof ReferenceType) || !(rhsType instanceof ExtendsType))
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(lhsType, ((ExtendsType) rhsType).getExtendedType(), PairOperator.SMALLERDOT));
|
return Optional.of(new UnifyPair(lhsType, ((ExtendsType) rhsType).getExtendedType(), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -628,7 +684,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
if(!(lhsType instanceof SuperType) || !(rhsType instanceof SuperType))
|
if(!(lhsType instanceof SuperType) || !(rhsType instanceof SuperType))
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(((SuperType) rhsType).getSuperedType(), ((SuperType) lhsType).getSuperedType(), PairOperator.SMALLERDOT));
|
return Optional.of(new UnifyPair(((SuperType) rhsType).getSuperedType(), ((SuperType) lhsType).getSuperedType(), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -641,9 +697,11 @@ public class RuleSet implements IRuleSet{
|
|||||||
if(!(lhsType instanceof ReferenceType) || !(rhsType instanceof SuperType))
|
if(!(lhsType instanceof ReferenceType) || !(rhsType instanceof SuperType))
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(((SuperType) rhsType).getSuperedType(), lhsType, PairOperator.SMALLERDOTWC));
|
return Optional.of(new UnifyPair(((SuperType) rhsType).getSuperedType(), lhsType, PairOperator.SMALLERDOTWC, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* PL 2018-03-06 auskommentiert sind mutmaßlich falsch
|
||||||
|
* vgl. JAVA_BSP/Wildcard6.java
|
||||||
@Override
|
@Override
|
||||||
public Optional<UnifyPair> reduceWildcardLowUp(UnifyPair pair) {
|
public Optional<UnifyPair> reduceWildcardLowUp(UnifyPair pair) {
|
||||||
if(pair.getPairOp() != PairOperator.SMALLERDOTWC)
|
if(pair.getPairOp() != PairOperator.SMALLERDOTWC)
|
||||||
@ -670,6 +728,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
return Optional.of(new UnifyPair(((SuperType) lhsType).getSuperedType(), ((ExtendsType) rhsType).getExtendedType(), PairOperator.EQUALSDOT));
|
return Optional.of(new UnifyPair(((SuperType) lhsType).getSuperedType(), ((ExtendsType) rhsType).getExtendedType(), PairOperator.EQUALSDOT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<UnifyPair> reduceWildcardLeft(UnifyPair pair) {
|
public Optional<UnifyPair> reduceWildcardLeft(UnifyPair pair) {
|
||||||
if(pair.getPairOp() != PairOperator.SMALLERDOTWC)
|
if(pair.getPairOp() != PairOperator.SMALLERDOTWC)
|
||||||
@ -686,7 +745,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Optional<Set<UnifyPair>> reduceFunN(UnifyPair pair) {
|
public Optional<Set<UnifyPair>> reduceFunN(UnifyPair pair) {
|
||||||
if((pair.getPairOp() != PairOperator.SMALLERDOT)
|
if((pair.getPairOp() != PairOperator.SMALLERDOT)
|
||||||
@ -709,13 +768,19 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
Set<UnifyPair> result = new HashSet<UnifyPair>();
|
Set<UnifyPair> result = new HashSet<UnifyPair>();
|
||||||
|
|
||||||
result.add(new UnifyPair(funNLhsType.getTypeParams().get(0), funNRhsType.getTypeParams().get(0), PairOperator.SMALLERDOT));
|
result.add(new UnifyPair(funNLhsType.getTypeParams().get(funNLhsType.getTypeParams().size()-1), funNRhsType.getTypeParams().get(funNRhsType.getTypeParams().size()-1), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
for(int i = 1; i < funNLhsType.getTypeParams().size(); i++)
|
for(int i = 0; i < funNLhsType.getTypeParams().size()-1; i++) {
|
||||||
result.add(new UnifyPair(funNRhsType.getTypeParams().get(i), funNLhsType.getTypeParams().get(i), PairOperator.SMALLERDOT));
|
result.add(new UnifyPair(funNRhsType.getTypeParams().get(i), funNLhsType.getTypeParams().get(i), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
}
|
||||||
|
result.stream().forEach(x -> { UnifyType l = x.getLhsType();
|
||||||
|
if (l instanceof PlaceholderType) { ((PlaceholderType)l).disableWildcardtable(); }
|
||||||
|
UnifyType r = x.getRhsType();
|
||||||
|
if (r instanceof PlaceholderType) { ((PlaceholderType)r).disableWildcardtable(); }
|
||||||
|
} );
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<Set<UnifyPair>> greaterFunN(UnifyPair pair) {
|
public Optional<Set<UnifyPair>> greaterFunN(UnifyPair pair) {
|
||||||
if(pair.getPairOp() != PairOperator.SMALLERDOT)
|
if(pair.getPairOp() != PairOperator.SMALLERDOT)
|
||||||
@ -731,15 +796,29 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
Set<UnifyPair> result = new HashSet<UnifyPair>();
|
Set<UnifyPair> result = new HashSet<UnifyPair>();
|
||||||
|
|
||||||
|
Integer variance = ((PlaceholderType)rhsType).getVariance();
|
||||||
|
Integer inversVariance = distributeVariance.inverseVariance(variance);
|
||||||
|
|
||||||
UnifyType[] freshPlaceholders = new UnifyType[funNLhsType.getTypeParams().size()];
|
UnifyType[] freshPlaceholders = new UnifyType[funNLhsType.getTypeParams().size()];
|
||||||
for(int i = 0; i < freshPlaceholders.length; i++)
|
for(int i = 0; i < freshPlaceholders.length-1; i++) {
|
||||||
freshPlaceholders[i] = PlaceholderType.freshPlaceholder();
|
freshPlaceholders[i] = PlaceholderType.freshPlaceholder();
|
||||||
|
((PlaceholderType)freshPlaceholders[i]).setVariance(inversVariance);
|
||||||
|
}
|
||||||
|
freshPlaceholders[freshPlaceholders.length-1] = PlaceholderType.freshPlaceholder();
|
||||||
|
((PlaceholderType)freshPlaceholders[freshPlaceholders.length-1]).setVariance(variance);
|
||||||
|
result.add(new UnifyPair(funNLhsType.getTypeParams().get(funNLhsType.getTypeParams().size()-1), freshPlaceholders[funNLhsType.getTypeParams().size()-1], PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
result.add(new UnifyPair(funNLhsType.getTypeParams().get(0), freshPlaceholders[0], PairOperator.SMALLERDOT));
|
for(int i = 0; i < funNLhsType.getTypeParams().size()-1; i++) {
|
||||||
for(int i = 1; i < funNLhsType.getTypeParams().size(); i++)
|
result.add(new UnifyPair(freshPlaceholders[i], funNLhsType.getTypeParams().get(i), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
result.add(new UnifyPair(freshPlaceholders[i], funNLhsType.getTypeParams().get(i), PairOperator.SMALLERDOT));
|
}
|
||||||
result.add(new UnifyPair(rhsType, funNLhsType.setTypeParams(new TypeParams(freshPlaceholders)), PairOperator.EQUALSDOT));
|
|
||||||
|
|
||||||
|
result.add(new UnifyPair(rhsType, funNLhsType.setTypeParams(new TypeParams(freshPlaceholders)), PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
|
result.stream().forEach(x -> { UnifyType l = x.getLhsType();
|
||||||
|
if (l instanceof PlaceholderType) { ((PlaceholderType)l).disableWildcardtable(); }
|
||||||
|
UnifyType r = x.getRhsType();
|
||||||
|
if (r instanceof PlaceholderType) { ((PlaceholderType)r).disableWildcardtable(); }
|
||||||
|
} );
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -758,15 +837,30 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
Set<UnifyPair> result = new HashSet<UnifyPair>();
|
Set<UnifyPair> result = new HashSet<UnifyPair>();
|
||||||
|
|
||||||
|
Integer variance = ((PlaceholderType)lhsType).getVariance();
|
||||||
|
Integer inversVariance = distributeVariance.inverseVariance(variance);
|
||||||
|
|
||||||
UnifyType[] freshPlaceholders = new UnifyType[funNRhsType.getTypeParams().size()];
|
UnifyType[] freshPlaceholders = new UnifyType[funNRhsType.getTypeParams().size()];
|
||||||
for(int i = 0; i < freshPlaceholders.length; i++)
|
for(int i = 0; i < freshPlaceholders.length-1; i++) {
|
||||||
freshPlaceholders[i] = PlaceholderType.freshPlaceholder();
|
freshPlaceholders[i] = PlaceholderType.freshPlaceholder();
|
||||||
|
((PlaceholderType)freshPlaceholders[i]).setVariance(inversVariance);
|
||||||
|
}
|
||||||
|
freshPlaceholders[freshPlaceholders.length-1] = PlaceholderType.freshPlaceholder();
|
||||||
|
((PlaceholderType)freshPlaceholders[freshPlaceholders.length-1]).setVariance(variance);
|
||||||
|
|
||||||
result.add(new UnifyPair(freshPlaceholders[0], funNRhsType.getTypeParams().get(0), PairOperator.SMALLERDOT));
|
result.add(new UnifyPair(freshPlaceholders[funNRhsType.getTypeParams().size()-1], funNRhsType.getTypeParams().get(funNRhsType.getTypeParams().size()-1), PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
for(int i = 1; i < funNRhsType.getTypeParams().size(); i++)
|
|
||||||
result.add(new UnifyPair(funNRhsType.getTypeParams().get(i), freshPlaceholders[i], PairOperator.SMALLERDOT));
|
|
||||||
result.add(new UnifyPair(lhsType, funNRhsType.setTypeParams(new TypeParams(freshPlaceholders)), PairOperator.EQUALSDOT));
|
|
||||||
|
|
||||||
|
for(int i = 0; i < funNRhsType.getTypeParams().size()-1; i++) {
|
||||||
|
result.add(new UnifyPair(funNRhsType.getTypeParams().get(i), freshPlaceholders[i], PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
}
|
||||||
|
|
||||||
|
result.add(new UnifyPair(lhsType, funNRhsType.setTypeParams(new TypeParams(freshPlaceholders)), PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
|
|
||||||
|
result.stream().forEach(x -> { UnifyType l = x.getLhsType();
|
||||||
|
if (l instanceof PlaceholderType) { ((PlaceholderType)l).disableWildcardtable(); }
|
||||||
|
UnifyType r = x.getRhsType();
|
||||||
|
if (r instanceof PlaceholderType) { ((PlaceholderType)r).disableWildcardtable(); }
|
||||||
|
} );
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -780,7 +874,7 @@ public class RuleSet implements IRuleSet{
|
|||||||
if(!(lhsType instanceof PlaceholderType) || !(rhsType instanceof ReferenceType))
|
if(!(lhsType instanceof PlaceholderType) || !(rhsType instanceof ReferenceType))
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
return Optional.of(new UnifyPair(lhsType, rhsType, PairOperator.EQUALSDOT));
|
return Optional.of(new UnifyPair(lhsType, rhsType, PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -799,11 +893,11 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
Set<UnifyPair> result = new HashSet<>();
|
Set<UnifyPair> result = new HashSet<>();
|
||||||
if(isGen)
|
if(isGen)
|
||||||
result.add(new UnifyPair(rhsType, lhsType, PairOperator.EQUALSDOT));
|
result.add(new UnifyPair(rhsType, lhsType, PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
else {
|
else {
|
||||||
UnifyType freshTph = PlaceholderType.freshPlaceholder();
|
UnifyType freshTph = PlaceholderType.freshPlaceholder();
|
||||||
result.add(new UnifyPair(rhsType, new ExtendsType(freshTph), PairOperator.EQUALSDOT));
|
result.add(new UnifyPair(rhsType, new ExtendsType(freshTph), PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
result.add(new UnifyPair(extendedType, freshTph, PairOperator.SMALLERDOT));
|
result.add(new UnifyPair(extendedType, freshTph, PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
@ -825,11 +919,11 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
Set<UnifyPair> result = new HashSet<>();
|
Set<UnifyPair> result = new HashSet<>();
|
||||||
if(isGen)
|
if(isGen)
|
||||||
result.add(new UnifyPair(rhsType, lhsType, PairOperator.EQUALSDOT));
|
result.add(new UnifyPair(rhsType, lhsType, PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
else {
|
else {
|
||||||
UnifyType freshTph = PlaceholderType.freshPlaceholder();
|
UnifyType freshTph = PlaceholderType.freshPlaceholder();
|
||||||
result.add(new UnifyPair(rhsType, new SuperType(freshTph), PairOperator.EQUALSDOT));
|
result.add(new UnifyPair(rhsType, new SuperType(freshTph), PairOperator.EQUALSDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
result.add(new UnifyPair(freshTph, superedType, PairOperator.SMALLERDOT));
|
result.add(new UnifyPair(freshTph, superedType, PairOperator.SMALLERDOT, pair.getSubstitution(), pair.getBasePair()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Optional.of(result);
|
return Optional.of(result);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unify;
|
package de.dhbwstuttgart.typeinference.unify;
|
||||||
|
|
||||||
|
import java.io.FileWriter;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ForkJoinPool;
|
import java.util.concurrent.ForkJoinPool;
|
||||||
|
|
||||||
@ -7,16 +8,16 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
|||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
||||||
|
|
||||||
public class TypeUnify {
|
public class TypeUnify {
|
||||||
public Set<Set<UnifyPair>> unify(Set<UnifyPair> eq, IFiniteClosure fc) {
|
public Set<Set<UnifyPair>> unify(Set<UnifyPair> eq, IFiniteClosure fc, FileWriter logFile) {
|
||||||
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, true);
|
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, true, logFile);
|
||||||
ForkJoinPool pool = new ForkJoinPool();
|
ForkJoinPool pool = new ForkJoinPool();
|
||||||
pool.invoke(unifyTask);
|
pool.invoke(unifyTask);
|
||||||
Set<Set<UnifyPair>> res = unifyTask.join();
|
Set<Set<UnifyPair>> res = unifyTask.join();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Set<UnifyPair>> unifySequential(Set<UnifyPair> eq, IFiniteClosure fc) {
|
public Set<Set<UnifyPair>> unifySequential(Set<UnifyPair> eq, IFiniteClosure fc, FileWriter logFile) {
|
||||||
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, false);
|
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, false, logFile);
|
||||||
Set<Set<UnifyPair>> res = unifyTask.compute();
|
Set<Set<UnifyPair>> res = unifyTask.compute();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,54 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
|
||||||
|
|
||||||
|
public class distributeVariance extends visitUnifyTypeVisitor<Integer> {
|
||||||
|
|
||||||
|
public static int inverseVariance(int variance) {
|
||||||
|
Integer ret = 0;
|
||||||
|
if (variance == 1) {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
if (variance == -1) {
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlaceholderType visit(PlaceholderType phty, Integer ht) {
|
||||||
|
if (ht != 0) {
|
||||||
|
if (phty.getVariance() == 0) {
|
||||||
|
phty.setVariance(ht);
|
||||||
|
}
|
||||||
|
//PL 2018-05-17 urspruengliche Variance nicht veraendern
|
||||||
|
//else if (phty.getVariance() != ht) {
|
||||||
|
// phty.setVariance(0);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
return phty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FunNType visit(FunNType funnty, Integer ht) {
|
||||||
|
List<UnifyType> param = new ArrayList<>(funnty.getTypeParams().get().length);
|
||||||
|
param.addAll(Arrays.asList(funnty.getTypeParams().get()));
|
||||||
|
UnifyType resultType = param.remove(param.size()-1);
|
||||||
|
Integer htInverse = inverseVariance(ht);
|
||||||
|
param = param.stream()
|
||||||
|
.map(x -> x.accept(this, htInverse))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
param.add(resultType.accept(this, ht));
|
||||||
|
return FunNType.getFunNType(new TypeParams(param));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
|
|
||||||
|
|
||||||
|
public class freshPlaceholder extends visitUnifyTypeVisitor<HashMap<PlaceholderType,PlaceholderType>> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlaceholderType visit(PlaceholderType phty, HashMap<PlaceholderType,PlaceholderType> ht) {
|
||||||
|
return ht.get(phty);
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
|
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
|
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
|
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
|
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
|
||||||
@ -60,5 +61,7 @@ public interface IFiniteClosure {
|
|||||||
public Optional<UnifyType> getLeftHandedType(String typeName);
|
public Optional<UnifyType> getLeftHandedType(String typeName);
|
||||||
public Set<UnifyType> getAncestors(UnifyType t);
|
public Set<UnifyType> getAncestors(UnifyType t);
|
||||||
public Set<UnifyType> getChildren(UnifyType t);
|
public Set<UnifyType> getChildren(UnifyType t);
|
||||||
public Set<UnifyType> getAllTypesByName(String typeName);
|
public Set<UnifyType> getAllTypesByName(String typeName);
|
||||||
|
|
||||||
|
public int compare(UnifyType rhsType, UnifyType rhsType2, PairOperator pairop);
|
||||||
}
|
}
|
||||||
|
@ -13,23 +13,17 @@ import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
|||||||
/**
|
/**
|
||||||
* Match
|
* Match
|
||||||
* @author Martin Pluemicke
|
* @author Martin Pluemicke
|
||||||
|
* abgeleitet aus IUnify.java
|
||||||
*/
|
*/
|
||||||
public interface IMatch {
|
public interface IMatch {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds the most general unifier sigma of the set {t1,...,tn} so that
|
* Finds the most general matcher sigma of the set {t1 =. t1',...,tn =. tn'} so that
|
||||||
* sigma(t1) = sigma(t2) = ... = sigma(tn).
|
* sigma(t1) = t1' , ... sigma(tn) = tn'.
|
||||||
* @param terms The set of terms to be unified
|
* @param terms The set of terms to be matched
|
||||||
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
|
* @return An optional of the most general matcher if it exists or an empty optional if there is no matcher.
|
||||||
*/
|
*/
|
||||||
public Optional<Unifier> match(ArrayList<UnifyPair> termsList);
|
public Optional<Unifier> match(ArrayList<UnifyPair> termsList);
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the most general unifier sigma of the set {t1,...,tn} so that
|
|
||||||
* sigma(t1) = sigma(t2) = ... = sigma(tn).
|
|
||||||
* @param terms The set of terms to be unified
|
|
||||||
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,9 +27,13 @@ public interface IRuleSet {
|
|||||||
public Optional<UnifyPair> reduceWildcardLowRight(UnifyPair pair);
|
public Optional<UnifyPair> reduceWildcardLowRight(UnifyPair pair);
|
||||||
public Optional<UnifyPair> reduceWildcardUp(UnifyPair pair);
|
public Optional<UnifyPair> reduceWildcardUp(UnifyPair pair);
|
||||||
public Optional<UnifyPair> reduceWildcardUpRight(UnifyPair pair);
|
public Optional<UnifyPair> reduceWildcardUpRight(UnifyPair pair);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* vgl. JAVA_BSP/Wildcard6.java
|
||||||
public Optional<UnifyPair> reduceWildcardLowUp(UnifyPair pair);
|
public Optional<UnifyPair> reduceWildcardLowUp(UnifyPair pair);
|
||||||
public Optional<UnifyPair> reduceWildcardUpLow(UnifyPair pair);
|
public Optional<UnifyPair> reduceWildcardUpLow(UnifyPair pair);
|
||||||
public Optional<UnifyPair> reduceWildcardLeft(UnifyPair pair);
|
public Optional<UnifyPair> reduceWildcardLeft(UnifyPair pair);
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Additional Rules which replace cases of the cartesian product
|
* Additional Rules which replace cases of the cartesian product
|
||||||
|
@ -15,16 +15,16 @@ import de.dhbwstuttgart.typeinference.unify.model.Unifier;
|
|||||||
public interface IUnify {
|
public interface IUnify {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds the most general unifier sigma of the set {t1,...,tn} so that
|
* Finds the most general unifier sigma of the set {t1 =. t1',...,tn =. tn'} so that
|
||||||
* sigma(t1) = sigma(t2) = ... = sigma(tn).
|
* sigma(t1) = sigma(t1') , ... sigma(tn) = sigma(tn').
|
||||||
* @param terms The set of terms to be unified
|
* @param terms The set of terms to be unified
|
||||||
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
|
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
|
||||||
*/
|
*/
|
||||||
public Optional<Unifier> unify(Set<UnifyType> terms);
|
public Optional<Unifier> unify(Set<UnifyType> terms);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds the most general unifier sigma of the set {t1,...,tn} so that
|
* Finds the most general unifier sigma of the set {t1 =. t1',...,tn =. tn'} so that
|
||||||
* sigma(t1) = sigma(t2) = ... = sigma(tn).
|
* sigma(t1) = sigma(t1') , ... sigma(tn) = sigma(tn').
|
||||||
* @param terms The set of terms to be unified
|
* @param terms The set of terms to be unified
|
||||||
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
|
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
|
||||||
|
|
||||||
|
public interface UnifyTypeVisitor<T> {
|
||||||
|
|
||||||
|
public ReferenceType visit(ReferenceType refty, T ht);
|
||||||
|
|
||||||
|
public PlaceholderType visit(PlaceholderType phty, T ht);
|
||||||
|
|
||||||
|
public FunNType visit(FunNType funnty, T ht);
|
||||||
|
|
||||||
|
public SuperType visit(SuperType suty, T ht);
|
||||||
|
|
||||||
|
public ExtendsType visit(ExtendsType extty, T ht);
|
||||||
|
|
||||||
|
}
|
@ -2,21 +2,30 @@ package de.dhbwstuttgart.typeinference.unify.model;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An extends wildcard type "? extends T".
|
* An extends wildcard type "? extends T".
|
||||||
*/
|
*/
|
||||||
public final class ExtendsType extends WildcardType {
|
public final class ExtendsType extends WildcardType {
|
||||||
|
|
||||||
|
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
|
||||||
|
return visitor.visit(this, ht);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new extends wildcard type.
|
* Creates a new extends wildcard type.
|
||||||
* @param extendedType The extended type e.g. Integer in "? extends Integer"
|
* @param extendedType The extended type e.g. Integer in "? extends Integer"
|
||||||
*/
|
*/
|
||||||
public ExtendsType(UnifyType extendedType) {
|
public ExtendsType(UnifyType extendedType) {
|
||||||
super("? extends " + extendedType.getName(), extendedType);
|
super("? extends " + extendedType.getName(), extendedType);
|
||||||
|
if (extendedType instanceof ExtendsType) {
|
||||||
|
System.out.print("");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,11 +8,14 @@ import java.util.Optional;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
//PL 18-02-05 Unifier durch Matcher ersetzt
|
import com.google.common.collect.Ordering;
|
||||||
//mus greater noch erstezt werden
|
|
||||||
|
//PL 18-02-05/18-04-05 Unifier durch Matcher ersetzt
|
||||||
|
//muss greater noch ersetzt werden ja erledigt 18--04-05
|
||||||
import de.dhbwstuttgart.typeinference.unify.MartelliMontanariUnify;
|
import de.dhbwstuttgart.typeinference.unify.MartelliMontanariUnify;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.Match;
|
import de.dhbwstuttgart.typeinference.unify.Match;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
|
||||||
|
|
||||||
@ -20,7 +23,7 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
|
|||||||
* The finite closure for the type unification
|
* The finite closure for the type unification
|
||||||
* @author Florian Steurer
|
* @author Florian Steurer
|
||||||
*/
|
*/
|
||||||
public class FiniteClosure implements IFiniteClosure {
|
public class FiniteClosure extends Ordering<UnifyType> implements IFiniteClosure {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A map that maps every type to the node in the inheritance graph that contains that type.
|
* A map that maps every type to the node in the inheritance graph that contains that type.
|
||||||
@ -193,7 +196,9 @@ public class FiniteClosure implements IFiniteClosure {
|
|||||||
protected Set<UnifyType> computeGreater(Set<UnifyType> types) {
|
protected Set<UnifyType> computeGreater(Set<UnifyType> types) {
|
||||||
HashSet<UnifyType> result = new HashSet<>();
|
HashSet<UnifyType> result = new HashSet<>();
|
||||||
|
|
||||||
IUnify unify = new MartelliMontanariUnify();
|
//PL 18-04-05 Unifier durch Matcher ersetzt
|
||||||
|
//IUnify unify = new MartelliMontanariUnify();
|
||||||
|
Match match = new Match();
|
||||||
|
|
||||||
for(UnifyType t : types) {
|
for(UnifyType t : types) {
|
||||||
|
|
||||||
@ -215,7 +220,11 @@ public class FiniteClosure implements IFiniteClosure {
|
|||||||
Set<Node<UnifyType>> candidates = strInheritanceGraph.get(t.getName());
|
Set<Node<UnifyType>> candidates = strInheritanceGraph.get(t.getName());
|
||||||
for(Node<UnifyType> candidate : candidates) {
|
for(Node<UnifyType> candidate : candidates) {
|
||||||
UnifyType theta1 = candidate.getContent();
|
UnifyType theta1 = candidate.getContent();
|
||||||
Optional<Unifier> optSigma = unify.unify(theta1, t);
|
//PL 18-04-05 Unifier durch Matcher ersetzt ANFANG
|
||||||
|
ArrayList<UnifyPair> termList= new ArrayList<UnifyPair>();
|
||||||
|
termList.add(new UnifyPair(theta1,t, PairOperator.EQUALSDOT));
|
||||||
|
Optional<Unifier> optSigma = match.match(termList);
|
||||||
|
//PL 18-04-05 Unifier durch Matcher ersetzt ENDE
|
||||||
if(!optSigma.isPresent())
|
if(!optSigma.isPresent())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -369,7 +378,7 @@ public class FiniteClosure implements IFiniteClosure {
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
|
||||||
for(UnifyPair pair : pairs)
|
for(UnifyPair pair : pairs)
|
||||||
if(pair.getLhsType().getName().equals(typeName))
|
if(pair.getLhsType().getName().equals(typeName) && pair.getLhsType().typeParams.arePlaceholders())
|
||||||
return Optional.of(pair.getLhsType());
|
return Optional.of(pair.getLhsType());
|
||||||
|
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
@ -430,4 +439,33 @@ public class FiniteClosure implements IFiniteClosure {
|
|||||||
public String toString(){
|
public String toString(){
|
||||||
return this.inheritanceGraph.toString();
|
return this.inheritanceGraph.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int compare (UnifyType left, UnifyType right) {
|
||||||
|
return compare(left, right, PairOperator.SMALLERDOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compare (UnifyType left, UnifyType right, PairOperator pairop) {
|
||||||
|
if ((left instanceof ExtendsType && right instanceof ReferenceType)
|
||||||
|
|| (right instanceof ExtendsType && left instanceof ReferenceType))
|
||||||
|
System.out.println("");
|
||||||
|
UnifyPair up = new UnifyPair(left, right, pairop);
|
||||||
|
TypeUnifyTask unifyTask = new TypeUnifyTask();
|
||||||
|
HashSet<UnifyPair> hs = new HashSet<>();
|
||||||
|
hs.add(up);
|
||||||
|
Set<UnifyPair> smallerRes = unifyTask.applyTypeUnificationRules(hs, this);
|
||||||
|
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
|
||||||
|
long smallerLen = smallerRes.stream().filter(x -> !(x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)).count();
|
||||||
|
if (smallerLen == 0) return -1;
|
||||||
|
else {
|
||||||
|
up = new UnifyPair(right, left, pairop);
|
||||||
|
//TypeUnifyTask unifyTask = new TypeUnifyTask();
|
||||||
|
hs = new HashSet<>();
|
||||||
|
hs.add(up);
|
||||||
|
Set<UnifyPair> greaterRes = unifyTask.applyTypeUnificationRules(hs, this);
|
||||||
|
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
|
||||||
|
long greaterLen = greaterRes.stream().filter(x -> !(x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)).count();
|
||||||
|
if (greaterLen == 0) return 1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unify.model;
|
package de.dhbwstuttgart.typeinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A real function type in java.
|
* A real function type in java.
|
||||||
@ -10,6 +14,10 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
|||||||
*/
|
*/
|
||||||
public class FunNType extends UnifyType {
|
public class FunNType extends UnifyType {
|
||||||
|
|
||||||
|
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
|
||||||
|
return visitor.visit(this, ht);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a FunN-Type with the specified TypeParameters.
|
* Creates a FunN-Type with the specified TypeParameters.
|
||||||
*/
|
*/
|
||||||
@ -67,11 +75,18 @@ public class FunNType extends UnifyType {
|
|||||||
return new FunNType(newParams);
|
return new FunNType(newParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean wrongWildcard() {
|
||||||
|
return (new ArrayList<UnifyType>(Arrays.asList(getTypeParams()
|
||||||
|
.get())).stream().filter(x -> (x instanceof WildcardType)).findFirst().isPresent());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return 181 + typeParams.hashCode();
|
return 181 + typeParams.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if(!(obj instanceof FunNType))
|
if(!(obj instanceof FunNType))
|
||||||
|
@ -0,0 +1,228 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import com.google.common.collect.Ordering;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
|
||||||
|
|
||||||
|
protected IFiniteClosure fc;
|
||||||
|
|
||||||
|
public OrderingUnifyPair(IFiniteClosure fc) {
|
||||||
|
this.fc = fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* vergleicht Paare (a =. Theta) und (a =. Theta')
|
||||||
|
* in dem compare(Theta, Theta') aufgerufen wird.
|
||||||
|
*/
|
||||||
|
public int compareEq (UnifyPair left, UnifyPair right) {
|
||||||
|
if (left.getRhsType() instanceof WildcardType || right.getRhsType() instanceof WildcardType) {
|
||||||
|
return fc.compare(left.getRhsType(), right.getRhsType(), PairOperator.SMALLERDOTWC);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return fc.compare(left.getRhsType(), right.getRhsType(), PairOperator.SMALLERDOT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
public int compareEq (UnifyPair left, UnifyPair right) {
|
||||||
|
if (left == null || right == null)
|
||||||
|
System.out.println("Fehler");
|
||||||
|
if (left.getLhsType() instanceof PlaceholderType) {
|
||||||
|
return fc.compare(left.getRhsType(), right.getRhsType(), left.getPairOp());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return fc.compare(left.getLhsType(), right.getLhsType(), left.getPairOp());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Pair<Integer,Set<UnifyPair>> compare (UnifyType left, UnifyType right) {
|
||||||
|
UnifyPair up;
|
||||||
|
if (left instanceof WildcardType || right instanceof WildcardType) {
|
||||||
|
up = new UnifyPair(left, right, PairOperator.SMALLERDOTWC);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
up = new UnifyPair(left, right, PairOperator.SMALLERDOT);
|
||||||
|
}
|
||||||
|
TypeUnifyTask unifyTask = new TypeUnifyTask();
|
||||||
|
HashSet<UnifyPair> hs = new HashSet<>();
|
||||||
|
hs.add(up);
|
||||||
|
Set<UnifyPair> smallerRes = unifyTask.applyTypeUnificationRules(hs, fc);
|
||||||
|
long smallerLen = smallerRes.stream().filter(x -> !(x.getLhsType() instanceof PlaceholderType && x.getRhsType() instanceof PlaceholderType)).count();
|
||||||
|
if (smallerLen == 0) return new Pair<>(-1, smallerRes);
|
||||||
|
else {
|
||||||
|
if (left instanceof WildcardType || right instanceof WildcardType) {
|
||||||
|
up = new UnifyPair(right, left, PairOperator.SMALLERDOTWC);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
up = new UnifyPair(right, left, PairOperator.SMALLERDOT);
|
||||||
|
}
|
||||||
|
//TypeUnifyTask unifyTask = new TypeUnifyTask();
|
||||||
|
hs = new HashSet<>();
|
||||||
|
hs.add(up);
|
||||||
|
Set<UnifyPair> greaterRes = unifyTask.applyTypeUnificationRules(hs, fc);
|
||||||
|
long greaterLen = greaterRes.stream().filter(x -> !(x.getLhsType() instanceof PlaceholderType && x.getRhsType() instanceof PlaceholderType)).count();
|
||||||
|
if (greaterLen == 0) return new Pair<>(1, greaterRes);
|
||||||
|
else return new Pair<>(0, new HashSet<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO muss noch verifiziert werden PL 2018-03-21
|
||||||
|
* (non-Javadoc)
|
||||||
|
* fuehrt zu Fehlern bei Arrays.sort (contract nicht erfuellt)
|
||||||
|
* @see com.google.common.collect.Ordering#compare(java.lang.Object, java.lang.Object)
|
||||||
|
*/
|
||||||
|
public int compare (Set<UnifyPair> left, Set<UnifyPair> right) {
|
||||||
|
Set<UnifyPair> lefteq = left.stream()
|
||||||
|
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> righteq = right.stream()
|
||||||
|
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> leftle = left.stream()
|
||||||
|
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
|
||||||
|
&& x.getPairOp() == PairOperator.SMALLERDOT))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> rightle = right.stream()
|
||||||
|
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
|
||||||
|
&& x.getPairOp() == PairOperator.SMALLERDOT))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> leftlewc = left.stream()
|
||||||
|
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
|
||||||
|
&& x.getPairOp() == PairOperator.SMALLERDOTWC))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set<UnifyPair> rightlewc = right.stream()
|
||||||
|
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
|
||||||
|
&& x.getPairOp() == PairOperator.SMALLERDOTWC))
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
//System.out.println(left.toString());
|
||||||
|
//Fall 2 und 3
|
||||||
|
//if (lefteq.iterator().next().getLhsType().getName().equals("AJO")) {
|
||||||
|
// System.out.print("");
|
||||||
|
//}
|
||||||
|
if (lefteq.size() == 1 && leftle.size() == 1 && righteq.size() == 0 && rightle.size() == 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//Fall 2 und 3
|
||||||
|
if (lefteq.size() == 0 && leftle.size() == 1 && righteq.size() == 1 && rightle.size() == 1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//Fall 5
|
||||||
|
if (lefteq.size() == 1 && leftle.size() == 0 && righteq.size() == 1 && rightle.size() == 1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//Fall 5
|
||||||
|
if (lefteq.size() == 1 && leftle.size() == 1 && righteq.size() == 1 && rightle.size() == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//Fall 5
|
||||||
|
if (lefteq.size() == 1 && leftle.size() == 1 && righteq.size() == 1 && rightle.size() == 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// Nur Paare a =. Theta
|
||||||
|
if (leftle.size() == 0 && rightle.size() == 0 && leftlewc.size() == 0 && rightlewc.size() ==0) {
|
||||||
|
Stream<UnifyPair> lseq = lefteq.stream(); //left.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT));
|
||||||
|
Stream<UnifyPair> rseq = righteq.stream(); //right.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT));
|
||||||
|
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
|
||||||
|
HashMap<UnifyType,UnifyPair> hm = rseq.reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
|
||||||
|
lseq = lseq.filter(x -> !(hm.get(x.getLhsType()) == null));//NOCHMALS UEBERPRUEFEN!!!!
|
||||||
|
lseq = lseq.filter(x -> !x.equals(hm.get(x.getLhsType()))); //Elemente die gleich sind muessen nicht verglichen werden
|
||||||
|
Optional<Integer> si = lseq.map(x -> compareEq(x, hm.get(x.getLhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } );
|
||||||
|
if (!si.isPresent()) return 0;
|
||||||
|
else return si.get();
|
||||||
|
}
|
||||||
|
//Fall 1 und 4
|
||||||
|
if (lefteq.size() >= 1 && righteq.size() >= 1 && (leftlewc.size() > 0 || rightlewc.size() > 0)) {
|
||||||
|
if (lefteq.iterator().next().getLhsType().getName().equals("D"))
|
||||||
|
System.out.print("");
|
||||||
|
//Set<PlaceholderType> varsleft = lefteq.stream().map(x -> (PlaceholderType)x.getLhsType()).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
//Set<PlaceholderType> varsright = righteq.stream().map(x -> (PlaceholderType)x.getLhsType()).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
//filtern des Paares a = Theta, das durch a <. Thata' generiert wurde (nur im Fall 1 relevant)
|
||||||
|
lefteq.removeIf(x -> !(x.getLhsType().getName().equals(x.getBasePair().getLhsType().getName())
|
||||||
|
||x.getLhsType().getName().equals(x.getBasePair().getRhsType().getName())));//removeIf(x -> !varsright.contains(x.getLhsType()));
|
||||||
|
righteq.removeIf(x -> !(x.getLhsType().getName().equals(x.getBasePair().getLhsType().getName())
|
||||||
|
||x.getLhsType().getName().equals(x.getBasePair().getRhsType().getName())));//.removeIf(x -> !varsleft.contains(x.getLhsType()));
|
||||||
|
UnifyPair lseq = lefteq.iterator().next();
|
||||||
|
UnifyPair rseq = righteq.iterator().next();
|
||||||
|
if (lseq.getRhsType().getName().equals("Object")) {
|
||||||
|
if (rseq.getRhsType().getName().equals("Object")) return 0;
|
||||||
|
else return 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (rseq.getRhsType().getName().equals("Object")) return -1;
|
||||||
|
}
|
||||||
|
if (leftlewc.size() == rightlewc.size()) {
|
||||||
|
//TODO: Hier wird bei Wildcards nicht das richtige compare aufgerufen PL 18-04-20
|
||||||
|
Pair<Integer, Set<UnifyPair>> int_Unifier = compare(lseq.getRhsType(), rseq.getRhsType());
|
||||||
|
Unifier uni = new Unifier();
|
||||||
|
int_Unifier.getValue().get().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
||||||
|
if (!lseq.getRhsType().getName().equals(rseq.getRhsType().getName())
|
||||||
|
|| leftlewc.size() == 0 || rightlewc.size() == 0) return int_Unifier.getKey();
|
||||||
|
else {
|
||||||
|
Set <UnifyPair> lsleuni = leftlewc.stream().map(x -> uni.apply(x)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set <UnifyPair> rsleuni = rightlewc.stream().map(x -> uni.apply(x)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
|
||||||
|
|
||||||
|
HashMap<UnifyType,UnifyPair> hm;
|
||||||
|
Optional<Integer> si;
|
||||||
|
//1. Fall
|
||||||
|
if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
||||||
|
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
|
||||||
|
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getLhsType()) == null));
|
||||||
|
si = lslewcstr.map(x -> fc.compare(x.getRhsType(), hm.get(x.getLhsType()).getRhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
|
||||||
|
}
|
||||||
|
//4. Fall
|
||||||
|
else {
|
||||||
|
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getRhsType(),y); return x; }, combiner);
|
||||||
|
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getRhsType()) == null));
|
||||||
|
si = lslewcstr.map(x -> fc.compare(x.getLhsType(), hm.get(x.getRhsType()).getLhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
|
||||||
|
}
|
||||||
|
if (!si.isPresent()) return 0;
|
||||||
|
else return si.get();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (leftlewc.size() > 0) {
|
||||||
|
Set<UnifyPair> subst;
|
||||||
|
if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
||||||
|
subst = leftlewc.stream().map(x -> new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
subst = leftlewc.stream().map(x -> new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
Unifier uni = new Unifier();
|
||||||
|
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
||||||
|
lseq = uni.apply(lseq);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Set<UnifyPair> subst;
|
||||||
|
if (rightlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
||||||
|
subst = rightlewc.stream().map(x -> new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
subst = rightlewc.stream().map(x -> new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
Unifier uni = new Unifier();
|
||||||
|
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
||||||
|
rseq = uni.apply(rseq);
|
||||||
|
}
|
||||||
|
return compareEq(lseq, rseq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
21
src/de/dhbwstuttgart/typeinference/unify/model/Pair.java
Normal file
21
src/de/dhbwstuttgart/typeinference/unify/model/Pair.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class Pair<T, T1> {
|
||||||
|
private final T key;
|
||||||
|
private final T1 value;
|
||||||
|
|
||||||
|
public Pair(T a, T1 b) {
|
||||||
|
this.value = b;
|
||||||
|
this.key = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<T1> getValue() {
|
||||||
|
return Optional.of(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
@ -2,11 +2,14 @@ package de.dhbwstuttgart.typeinference.unify.model;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.distributeVariance;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An unbounded placeholder type.
|
* An unbounded placeholder type.
|
||||||
@ -35,6 +38,21 @@ public final class PlaceholderType extends UnifyType{
|
|||||||
*/
|
*/
|
||||||
private final boolean IsGenerated;
|
private final boolean IsGenerated;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* isWildcardable gibt an, ob ein Wildcardtyp dem PlaceholderType zugeordnet werden darf
|
||||||
|
*/
|
||||||
|
private boolean wildcardable = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* variance shows the variance of the pair
|
||||||
|
* -1: contravariant
|
||||||
|
* 1 covariant
|
||||||
|
* 0 invariant
|
||||||
|
* PL 2018-03-21
|
||||||
|
*/
|
||||||
|
private int variance = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new placeholder type with the specified name.
|
* Creates a new placeholder type with the specified name.
|
||||||
*/
|
*/
|
||||||
@ -54,6 +72,10 @@ public final class PlaceholderType extends UnifyType{
|
|||||||
IsGenerated = isGenerated;
|
IsGenerated = isGenerated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
|
||||||
|
return visitor.visit(this, ht);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a fresh placeholder type with a name that does so far not exist.
|
* Creates a fresh placeholder type with a name that does so far not exist.
|
||||||
* A user could later instantiate a type using the same name that is equivalent to this type.
|
* A user could later instantiate a type using the same name that is equivalent to this type.
|
||||||
@ -67,6 +89,7 @@ public final class PlaceholderType extends UnifyType{
|
|||||||
return new PlaceholderType(name, true);
|
return new PlaceholderType(name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if this placeholder is auto-generated, false if it is user-generated.
|
* True if this placeholder is auto-generated, false if it is user-generated.
|
||||||
*/
|
*/
|
||||||
@ -74,6 +97,21 @@ public final class PlaceholderType extends UnifyType{
|
|||||||
return IsGenerated;
|
return IsGenerated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setVariance(int v) {
|
||||||
|
variance = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVariance() {
|
||||||
|
return variance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isWildcardable() {
|
||||||
|
return wildcardable;
|
||||||
|
}
|
||||||
|
public void disableWildcardtable() {
|
||||||
|
wildcardable = false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
Set<UnifyType> smArg(IFiniteClosure fc) {
|
Set<UnifyType> smArg(IFiniteClosure fc) {
|
||||||
return fc.smArg(this);
|
return fc.smArg(this);
|
||||||
@ -96,8 +134,13 @@ public final class PlaceholderType extends UnifyType{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
UnifyType apply(Unifier unif) {
|
UnifyType apply(Unifier unif) {
|
||||||
if(unif.hasSubstitute(this))
|
if(unif.hasSubstitute(this)) {
|
||||||
return unif.getSubstitute(this);
|
UnifyType ret = unif.getSubstitute(this);
|
||||||
|
//PL 2018-05-17 Auskommentierung muesste korrekt sein,
|
||||||
|
//bereits in JavaTXComplier Variancen gesetzt werden.
|
||||||
|
//ret.accept(new distributeVariance(), this.getVariance());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unify.model;
|
package de.dhbwstuttgart.typeinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A reference type e.q. Integer or List<T>.
|
* A reference type e.q. Integer or List<T>.
|
||||||
@ -16,6 +18,11 @@ public final class ReferenceType extends UnifyType {
|
|||||||
*/
|
*/
|
||||||
private final int hashCode;
|
private final int hashCode;
|
||||||
|
|
||||||
|
|
||||||
|
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
|
||||||
|
return visitor.visit(this, ht);
|
||||||
|
}
|
||||||
|
|
||||||
public ReferenceType(String name, UnifyType... params) {
|
public ReferenceType(String name, UnifyType... params) {
|
||||||
super(name, new TypeParams(params));
|
super(name, new TypeParams(params));
|
||||||
hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode();
|
hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode();
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unify.model;
|
package de.dhbwstuttgart.typeinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A super wildcard type e.g. ? super Integer.
|
* A super wildcard type e.g. ? super Integer.
|
||||||
@ -10,6 +12,10 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
|||||||
*/
|
*/
|
||||||
public final class SuperType extends WildcardType {
|
public final class SuperType extends WildcardType {
|
||||||
|
|
||||||
|
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
|
||||||
|
return visitor.visit(this, ht);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance "? extends superedType"
|
* Creates a new instance "? extends superedType"
|
||||||
* @param superedType The type that is supered e.g. Integer in "? super Integer"
|
* @param superedType The type that is supered e.g. Integer in "? super Integer"
|
||||||
|
@ -115,6 +115,14 @@ public final class TypeParams implements Iterable<UnifyType>{
|
|||||||
return typeParams[i];
|
return typeParams[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the parameters of this object.
|
||||||
|
* PL 2018-03-17
|
||||||
|
*/
|
||||||
|
public UnifyType[] get() {
|
||||||
|
return typeParams;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the the type t as the i-th parameter and returns a new object
|
* Sets the the type t as the i-th parameter and returns a new object
|
||||||
* that equals this object, except for the i-th type.
|
* that equals this object, except for the i-th type.
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unify.model;
|
package de.dhbwstuttgart.typeinference.unify.model;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -63,7 +65,44 @@ public class Unifier implements Function<UnifyType, UnifyType>, Iterable<Entry<P
|
|||||||
* @return A new pair where the left and right-hand side are applied
|
* @return A new pair where the left and right-hand side are applied
|
||||||
*/
|
*/
|
||||||
public UnifyPair apply(UnifyPair p) {
|
public UnifyPair apply(UnifyPair p) {
|
||||||
return new UnifyPair(this.apply(p.getLhsType()), this.apply(p.getRhsType()), p.getPairOp());
|
UnifyType newLhs = this.apply(p.getLhsType());
|
||||||
|
UnifyType newRhs = this.apply(p.getRhsType());
|
||||||
|
return new UnifyPair(newLhs, newRhs, p.getPairOp());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the unifier to the two terms of the pair.
|
||||||
|
* works only for single subsitution
|
||||||
|
* @return A new pair where the left and right-hand side are applied
|
||||||
|
*/
|
||||||
|
public UnifyPair apply(UnifyPair thisAsPair, UnifyPair p) {
|
||||||
|
UnifyType newLhs = this.apply(p.getLhsType());
|
||||||
|
UnifyType newRhs = this.apply(p.getRhsType());
|
||||||
|
//Varianceweitergabe wird nicht benoetigt.
|
||||||
|
//PlaceholderType lhsph = (PlaceholderType)thisAsPair.getLhsType();
|
||||||
|
//if (lhsph.getVariance() != 0) {
|
||||||
|
// if (p.getLhsType().equals(lhsph)) {
|
||||||
|
// if (p.getRhsType() instanceof PlaceholderType) {
|
||||||
|
// ((PlaceholderType)p.getRhsType()).setVariance(lhsph.getVariance());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (p.getRhsType().equals(lhsph)) {
|
||||||
|
// if (p.getLhsType() instanceof PlaceholderType) {
|
||||||
|
// ((PlaceholderType)p.getLhsType()).setVariance(lhsph.getVariance());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
if (!(p.getLhsType().equals(newLhs)) || !(p.getRhsType().equals(newRhs))) {//Die Anwendung von this hat was veraendert PL 2018-04-01
|
||||||
|
Set<UnifyPair> suniUnifyPair = new HashSet<>();
|
||||||
|
suniUnifyPair.addAll(thisAsPair.getAllSubstitutions());
|
||||||
|
suniUnifyPair.add(thisAsPair);
|
||||||
|
if (p.getLhsType() instanceof PlaceholderType //&& newLhs instanceof PlaceholderType entfernt PL 2018-04-13
|
||||||
|
&& p.getPairOp() == PairOperator.EQUALSDOT) {
|
||||||
|
suniUnifyPair.add(p); //p koennte auch subsitution sein
|
||||||
|
}
|
||||||
|
return new UnifyPair(newLhs, newRhs, p.getPairOp(), suniUnifyPair, p);
|
||||||
|
}
|
||||||
|
return new UnifyPair(newLhs, newRhs, p.getPairOp(), p.getSubstitution(), p.getBasePair());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,7 +2,10 @@ package de.dhbwstuttgart.typeinference.unify.model;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A pair which contains two types and an operator, e.q. (Integer <. a).
|
* A pair which contains two types and an operator, e.q. (Integer <. a).
|
||||||
@ -25,6 +28,29 @@ 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unifier/substitute that generated this pair
|
||||||
|
* PL 2018-03-15
|
||||||
|
*/
|
||||||
|
private Set<UnifyPair> substitution;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base on which the the unifier is applied
|
||||||
|
* PL 2018-03-15
|
||||||
|
*/
|
||||||
|
private UnifyPair basePair;
|
||||||
|
|
||||||
private final int hashCode;
|
private final int hashCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,6 +63,20 @@ public class UnifyPair {
|
|||||||
this.lhs = lhs;
|
this.lhs = lhs;
|
||||||
this.rhs = rhs;
|
this.rhs = rhs;
|
||||||
pairOp = op;
|
pairOp = op;
|
||||||
|
substitution = new HashSet<>();
|
||||||
|
|
||||||
|
// Caching hashcode
|
||||||
|
hashCode = 17 + 31 * lhs.hashCode() + 31 * rhs.hashCode() + 31 * pairOp.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnifyPair(UnifyType lhs, UnifyType rhs, PairOperator op, Set<UnifyPair> uni, UnifyPair base) {
|
||||||
|
this.lhs = lhs;
|
||||||
|
this.rhs = rhs;
|
||||||
|
pairOp = op;
|
||||||
|
substitution = uni;
|
||||||
|
basePair = base;
|
||||||
|
this.variance = variance;
|
||||||
|
|
||||||
|
|
||||||
// Caching hashcode
|
// Caching hashcode
|
||||||
hashCode = 17 + 31 * lhs.hashCode() + 31 * rhs.hashCode() + 31 * pairOp.hashCode();
|
hashCode = 17 + 31 * lhs.hashCode() + 31 * rhs.hashCode() + 31 * pairOp.hashCode();
|
||||||
@ -63,6 +103,41 @@ public class UnifyPair {
|
|||||||
return pairOp;
|
return pairOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte getVariance() {
|
||||||
|
return variance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVariance(byte v) {
|
||||||
|
variance = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUndefinedPair() {
|
||||||
|
undefinedPair = true;
|
||||||
|
}
|
||||||
|
public Set<UnifyPair> getSubstitution() {
|
||||||
|
return substitution;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnifyPair getBasePair() {
|
||||||
|
return basePair;
|
||||||
|
}
|
||||||
|
public boolean isUndefinedPair() {
|
||||||
|
return undefinedPair;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<UnifyPair> getAllSubstitutions () {
|
||||||
|
Set<UnifyPair> ret = new HashSet<>();
|
||||||
|
ret.addAll(getSubstitution());
|
||||||
|
if (basePair != null) {
|
||||||
|
ret.addAll(basePair.getAllSubstitutions());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean wrongWildcard() {
|
||||||
|
return lhs.wrongWildcard() || rhs.wrongWildcard();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if(!(obj instanceof UnifyPair))
|
if(!(obj instanceof UnifyPair))
|
||||||
@ -73,6 +148,13 @@ public class UnifyPair {
|
|||||||
|
|
||||||
UnifyPair other = (UnifyPair) obj;
|
UnifyPair other = (UnifyPair) obj;
|
||||||
|
|
||||||
|
if (isUndefinedPair()) {
|
||||||
|
if (!other.getBasePair().equals(basePair) ||
|
||||||
|
!other.getAllSubstitutions().equals(getAllSubstitutions())) {
|
||||||
|
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);
|
||||||
@ -85,7 +167,14 @@ public class UnifyPair {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "(" + lhs + " " + pairOp + " " + rhs + ")";
|
String ret = "";
|
||||||
|
if (lhs instanceof PlaceholderType) {
|
||||||
|
ret = new Integer(((PlaceholderType)lhs).getVariance()).toString();
|
||||||
|
}
|
||||||
|
if (rhs instanceof PlaceholderType) {
|
||||||
|
ret = ret + ", " + new Integer(((PlaceholderType)rhs).getVariance()).toString();
|
||||||
|
}
|
||||||
|
return "(" + lhs + " " + pairOp + " " + rhs + ", " + ret + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2,10 +2,13 @@ package de.dhbwstuttgart.typeinference.unify.model;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a java type.
|
* Represents a java type.
|
||||||
@ -33,6 +36,9 @@ public abstract class UnifyType {
|
|||||||
typeParams = p;
|
typeParams = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
abstract public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of the type.
|
* Returns the name of the type.
|
||||||
* @return The name e.q. List for List<T>, Integer or ? extends Integer
|
* @return The name e.q. List for List<T>, Integer or ? extends Integer
|
||||||
@ -96,6 +102,10 @@ public abstract class UnifyType {
|
|||||||
ret.addAll(typeParams.getInvolvedPlaceholderTypes());
|
ret.addAll(typeParams.getInvolvedPlaceholderTypes());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean wrongWildcard() {//default
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
|
@ -40,6 +40,11 @@ public abstract class WildcardType extends UnifyType {
|
|||||||
return wildcardedType.getTypeParams();
|
return wildcardedType.getTypeParams();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean wrongWildcard () {//This is an error
|
||||||
|
return (wildcardedType instanceof WildcardType);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return wildcardedType.hashCode() + getName().hashCode() + 17;
|
return wildcardedType.hashCode() + getName().hashCode() + 17;
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
|
||||||
|
|
||||||
|
public class visitUnifyTypeVisitor<T> implements UnifyTypeVisitor<T> {
|
||||||
|
|
||||||
|
public ReferenceType visit(ReferenceType refty, T ht) {
|
||||||
|
return new ReferenceType(refty.getName(),
|
||||||
|
new TypeParams(
|
||||||
|
Arrays.stream(refty.getTypeParams().get())
|
||||||
|
.map(x -> x.accept(this, ht))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new))));
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlaceholderType visit(PlaceholderType phty, T ht) {
|
||||||
|
return phty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FunNType visit(FunNType funnty, T ht) {
|
||||||
|
return FunNType.getFunNType(
|
||||||
|
new TypeParams(
|
||||||
|
Arrays.stream(funnty.getTypeParams().get())
|
||||||
|
.map(x -> x.accept(this, ht))
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new)))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SuperType visit(SuperType suty, T ht) {
|
||||||
|
return new SuperType(suty.getWildcardedType().accept(this, ht));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExtendsType visit(ExtendsType extty, T ht) {
|
||||||
|
return new ExtendsType(extty.getWildcardedType().accept(this, ht));
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class ATest extends JavaTXCompilerTest {
|
|
||||||
public ATest() {
|
|
||||||
fileName = "Example";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class AssignToLitTest extends JavaTXCompilerTest {
|
|
||||||
public AssignToLitTest() {
|
|
||||||
this.fileName = "AssignToLit";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class DuMethodTest extends JavaTXCompilerTest{
|
|
||||||
public DuMethodTest() {
|
|
||||||
this.fileName = "DuMethod";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
import org.objectweb.asm.Opcodes;
|
|
||||||
|
|
||||||
public class ForTest extends JavaTXCompilerTest {
|
|
||||||
|
|
||||||
public ForTest() {
|
|
||||||
this.fileName = "For";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
public class Gen{
|
|
||||||
Vector<Integer> m(Vector<Integer> v){
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
}
|
|
41
test/bytecode/GenTest.java
Normal file
41
test/bytecode/GenTest.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class GenTest {
|
||||||
|
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/Gen.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("Gen");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
fail("Not yet implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class Generics2Test extends JavaTXCompilerTest{
|
|
||||||
public Generics2Test() {
|
|
||||||
this.fileName = "Generics2";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class GenericsTest extends JavaTXCompilerTest {
|
|
||||||
public GenericsTest() {
|
|
||||||
this.fileName = "Generics";
|
|
||||||
}
|
|
||||||
}
|
|
140
test/bytecode/GreaterEqualTest.java
Normal file
140
test/bytecode/GreaterEqualTest.java
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class GreaterEqualTest {
|
||||||
|
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/GreaterEqual.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("File://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("GreaterEqual");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testName() {
|
||||||
|
assertEquals("GreaterEqual", classToTest.getName());
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void testIntegers() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 7, 5);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntegers2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 5, 7);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEqIntegers() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 5, 5);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLongs() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Long.class, Long.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 10L,7L);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFloats() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Float.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 5F,7F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubles() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Double.class, Double.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 5.0,7.0);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLongInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Long.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 15L,7);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFloatInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Float.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 5F,7);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Double.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 25.0,17);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFloatLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Float.class, Long.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 75F,70L);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Double.class, Long.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 5.0,7L);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEqDoubleFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 7.0,7F);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 15.0,7F);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleFloat3() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gE = classToTest.getDeclaredMethod("gE", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gE.invoke(instanceOfClass, 9.0,17F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
139
test/bytecode/GreaterThanTest.java
Normal file
139
test/bytecode/GreaterThanTest.java
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class GreaterThanTest {
|
||||||
|
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/GreaterThan.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("File://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("GreaterThan");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testName() {
|
||||||
|
assertEquals("GreaterThan", classToTest.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testIntegers() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 7, 5);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntegers2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 5, 7);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEqIntegers() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 5, 5);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLongs() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Long.class, Long.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 10L,7L);
|
||||||
|
assertTrue(result);
|
||||||
|
}@Test
|
||||||
|
|
||||||
|
public void testFloats() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Float.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 5F,7F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubles() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Double.class, Double.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 5.0,7.0);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLongInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Long.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 15L,7);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFloatInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Float.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 5F,7);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Double.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 25.0,17);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFloatLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Float.class, Long.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 75F,70L);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Double.class, Long.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 5.0,7L);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEqDoubleFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 7.0,7F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 15.0,7F);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleFloat3() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method gT = classToTest.getDeclaredMethod("gT", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) gT.invoke(instanceOfClass, 9.0,17F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class ImportTest extends JavaTXCompilerTest{
|
|
||||||
public ImportTest() {
|
|
||||||
this.fileName = "Import";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class InterfaceTest extends JavaTXCompilerTest{
|
|
||||||
public InterfaceTest() {
|
|
||||||
this.fileName = "Interface1";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.BytecodeGen;
|
|
||||||
import de.dhbwstuttgart.core.JavaTXCompiler;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultPair;
|
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
public class JavaTXCompilerTest {
|
|
||||||
|
|
||||||
private static final String rootDirectory = System.getProperty("user.dir")+"/test/bytecode/";
|
|
||||||
private static final List<File> filesToTest = new ArrayList<>();
|
|
||||||
|
|
||||||
protected String fileName = "";
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test() throws IOException, java.lang.ClassNotFoundException {
|
|
||||||
System.out.println(rootDirectory);
|
|
||||||
filesToTest.add(new File(rootDirectory+fileName+".jav"));
|
|
||||||
System.out.println(rootDirectory+fileName+".jav");
|
|
||||||
JavaTXCompiler compiler = new JavaTXCompiler(filesToTest);
|
|
||||||
for(File f : filesToTest){
|
|
||||||
String content = readFile(f.getPath(), StandardCharsets.UTF_8);
|
|
||||||
List<ResultSet> typeinferenceResult = compiler.typeInference();
|
|
||||||
HashMap<String,byte[]> bytecode = this.getBytecode(compiler.sourceFiles.get(f), typeinferenceResult.get(0));
|
|
||||||
|
|
||||||
// for(ResultPair ep : typeinferenceResult.get(0).results) {
|
|
||||||
// System.out.println(ep.getLeft() + " ->" + ep.getRight());
|
|
||||||
// }
|
|
||||||
|
|
||||||
String name;
|
|
||||||
int pos = f.getName().lastIndexOf(".");
|
|
||||||
if(pos != -1) {
|
|
||||||
name = f.getName().substring(0, pos);
|
|
||||||
}
|
|
||||||
this.writeClassFile(bytecode);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public HashMap<String,byte[]> getBytecode(SourceFile sf, ResultSet resultSet) {
|
|
||||||
HashMap<String,byte[]> classFiles = new HashMap<>();
|
|
||||||
BytecodeGen bytecodeGen = new BytecodeGen(classFiles,resultSet);
|
|
||||||
bytecodeGen.visit(sf);
|
|
||||||
return bytecodeGen.getClassFiles();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void writeClassFile(HashMap<String,byte[]> classFiles) {
|
|
||||||
FileOutputStream output;
|
|
||||||
for(String name : classFiles.keySet()) {
|
|
||||||
byte[] bytecode = classFiles.get(name);
|
|
||||||
try {
|
|
||||||
System.out.println("generating "+name+ ".class file ...");
|
|
||||||
output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/generatedBC/" +name+".class"));
|
|
||||||
output.write(bytecode);
|
|
||||||
output.close();
|
|
||||||
System.out.println(name+".class file generated");
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static String readFile(String path, Charset encoding)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
|
||||||
return new String(encoded, encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class LamAssignTest extends JavaTXCompilerTest{
|
|
||||||
public LamAssignTest() {
|
|
||||||
this.fileName = "LamAssign";
|
|
||||||
}
|
|
||||||
}
|
|
23
test/bytecode/LambdaTest.java
Normal file
23
test/bytecode/LambdaTest.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class LambdaTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void generateBC() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/Lambda.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
133
test/bytecode/LessEqualTest.java
Normal file
133
test/bytecode/LessEqualTest.java
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class LessEqualTest {
|
||||||
|
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/LessEqual.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("LessEqual");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testName() {
|
||||||
|
assertEquals("LessEqual", classToTest.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntegers() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5,7);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEqualIntegers() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5,5);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLongs() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Long.class, Long.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5L,7L);
|
||||||
|
assertTrue(result);
|
||||||
|
}@Test
|
||||||
|
|
||||||
|
public void testFloats() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Float.class, Float.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5F,7F);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubles() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Double.class, Double.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5.0,7.0);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLongInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Long.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5L,7);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFloatInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Float.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5F,7);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Double.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5.0,7);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFloatLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Float.class, Long.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5F,7L);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Double.class, Long.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5.0,7L);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEqDoubleFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 7.0,7F);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 5.0,7F);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoubleFloat3() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessEqual = classToTest.getDeclaredMethod("lessEqual", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) lessEqual.invoke(instanceOfClass, 9.0,7F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
141
test/bytecode/LessThanTest.java
Normal file
141
test/bytecode/LessThanTest.java
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class LessThanTest {
|
||||||
|
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/LessThan.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("LessThan");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClassName() {
|
||||||
|
assertEquals("LessThan", classToTest.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Integer.class,Integer.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 5, 7);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanInt2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7, 5);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanInt3() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Integer.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 5, 5);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Long.class,Long.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 5L, 7L);
|
||||||
|
assertTrue(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanLong2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Long.class, Long.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7L, 5L);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanLong3() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Long.class, Long.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 5L, 5L);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Float.class, Float.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7F, 5F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanDouble() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Double.class, Double.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7.0, 5.0);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanLongInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Long.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7L, 5);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanFloatInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Float.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7F, 5);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanDoubleInt() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Double.class, Integer.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7.0, 5);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanFloatLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Float.class, Long.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7F, 5L);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanDoubleLong() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Double.class, Long.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7.0, 5L);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLessThanDoubleFloat() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method lessThan = classToTest.getDeclaredMethod("lessThan", Double.class, Float.class);
|
||||||
|
Boolean result = (Boolean) lessThan.invoke(instanceOfClass, 7.0, 5F);
|
||||||
|
assertFalse(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
40
test/bytecode/MatrixTest.java
Normal file
40
test/bytecode/MatrixTest.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class MatrixTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/Matrix.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("Matrix");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
fail("Not yet implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class MethodsTest extends JavaTXCompilerTest {
|
|
||||||
public MethodsTest() {
|
|
||||||
this.fileName = "Methods";
|
|
||||||
}
|
|
||||||
}
|
|
39
test/bytecode/OLTest.java
Normal file
39
test/bytecode/OLTest.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class OLTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/OL.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("OL");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
fail("Not yet implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,12 +0,0 @@
|
|||||||
import java.lang.Integer;
|
|
||||||
|
|
||||||
class Op {
|
|
||||||
m(Integer a, Integer b) {
|
|
||||||
Integer c = a+b;
|
|
||||||
// d = a-b;
|
|
||||||
// e = a*b;
|
|
||||||
// f = a/b;
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,61 @@
|
|||||||
package bytecode;
|
package bytecode;
|
||||||
|
|
||||||
public class OpTest extends JavaTXCompilerTest {
|
import static org.junit.Assert.*;
|
||||||
public OpTest() {
|
|
||||||
this.fileName = "Op";
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class OpTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/Op.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("Op");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddString() throws NoSuchMethodException, SecurityException, IllegalAccessException,
|
||||||
|
IllegalArgumentException, InvocationTargetException, InstantiationException {
|
||||||
|
|
||||||
|
Method m = classToTest.getDeclaredMethod("m", String.class,String.class);
|
||||||
|
|
||||||
|
String result = (String) m.invoke(instanceOfClass, "Byte","Code");
|
||||||
|
|
||||||
|
assertEquals("ByteCode", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddInt() throws NoSuchMethodException, SecurityException, IllegalAccessException,
|
||||||
|
IllegalArgumentException, InvocationTargetException, InstantiationException {
|
||||||
|
|
||||||
|
Method m = classToTest.getDeclaredMethod("m", Integer.class,Integer.class);
|
||||||
|
|
||||||
|
Integer result = (Integer) m.invoke(instanceOfClass, 7,3);
|
||||||
|
|
||||||
|
assertEquals(10, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class OverlaodGenTest extends JavaTXCompilerTest {
|
|
||||||
public OverlaodGenTest() {
|
|
||||||
this.fileName = "OverlaodGen";
|
|
||||||
}
|
|
||||||
}
|
|
57
test/bytecode/OverloadingTest.java
Normal file
57
test/bytecode/OverloadingTest.java
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class OverloadingTest {
|
||||||
|
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;
|
||||||
|
|
||||||
|
private static Class<?> classOL2;
|
||||||
|
private static Object instanceOfClassOL2;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/Overloading.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("Overloading");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
|
||||||
|
classOL2 = loader.loadClass("Overloading2");
|
||||||
|
instanceOfClassOL2 = classOL2.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method meth = classToTest.getDeclaredMethod("test", classToTest);
|
||||||
|
String res = (String) meth.invoke(instanceOfClass, instanceOfClass);
|
||||||
|
assertEquals("Overloading", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method meth = classToTest.getDeclaredMethod("test", classOL2);
|
||||||
|
String res = (String) meth.invoke(instanceOfClass, instanceOfClassOL2);
|
||||||
|
assertEquals("Overloading2", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
54
test/bytecode/PlusTest.java
Normal file
54
test/bytecode/PlusTest.java
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class PlusTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/Plus.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/examples/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("Plus");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddInt() throws NoSuchMethodException, SecurityException, IllegalAccessException,
|
||||||
|
IllegalArgumentException, InvocationTargetException, InstantiationException {
|
||||||
|
Method addInt = classToTest.getDeclaredMethod("m", Integer.class,Integer.class);
|
||||||
|
Number result = (Number) addInt.invoke(instanceOfClass, 7,3);
|
||||||
|
assertEquals(10, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddString() throws NoSuchMethodException, SecurityException, IllegalAccessException,
|
||||||
|
IllegalArgumentException, InvocationTargetException, InstantiationException {
|
||||||
|
Method addString = classToTest.getDeclaredMethod("m", String.class,String.class);
|
||||||
|
String result = (String) addString.invoke(instanceOfClass, "Byte","Code");
|
||||||
|
assertEquals("ByteCode", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
65
test/bytecode/PostIncTest.java
Normal file
65
test/bytecode/PostIncTest.java
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class PostIncTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/PostIncDec.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("PostIncDec");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testM1() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("m");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(1, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testM2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("m2");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(0, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testD1() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("d");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(-1, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testD2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("d2");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(0, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
65
test/bytecode/PreIncTest.java
Normal file
65
test/bytecode/PreIncTest.java
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class PreIncTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/PreInc.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://" + pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("PreInc");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testM() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("m");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(1, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testM2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("m2");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(1, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testD() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("d");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(-1, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testD2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("d2");
|
||||||
|
Integer res = (Integer) m.invoke(instanceOfClass);
|
||||||
|
assertEquals(-1, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
41
test/bytecode/StaticTest.java
Normal file
41
test/bytecode/StaticTest.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class StaticTest {
|
||||||
|
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/StaticM.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://" + pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("StaticM");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
fail("Not yet implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +0,0 @@
|
|||||||
package bytecode;
|
|
||||||
|
|
||||||
public class TestIfTest extends JavaTXCompilerTest{
|
|
||||||
public TestIfTest() {
|
|
||||||
this.fileName = "IfTest";
|
|
||||||
}
|
|
||||||
}
|
|
44
test/bytecode/WhileTest.java
Normal file
44
test/bytecode/WhileTest.java
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package bytecode;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.core.JavaTXCompiler;
|
||||||
|
|
||||||
|
public class WhileTest {
|
||||||
|
private static String path;
|
||||||
|
private static File fileToTest;
|
||||||
|
private static JavaTXCompiler compiler;
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static String pathToClassFile;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpBeforeClass() throws Exception {
|
||||||
|
path = System.getProperty("user.dir")+"/test/bytecode/javFiles/While.jav";
|
||||||
|
fileToTest = new File(path);
|
||||||
|
compiler = new JavaTXCompiler(fileToTest);
|
||||||
|
compiler.generateBytecode();
|
||||||
|
pathToClassFile = System.getProperty("user.dir")+"/testBytecode/generatedBC/";
|
||||||
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
|
classToTest = loader.loadClass("While");
|
||||||
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
Method m = classToTest.getDeclaredMethod("m", Integer.class);
|
||||||
|
Integer result = (Integer) m.invoke(instanceOfClass, 0);
|
||||||
|
assertEquals(2, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
8
test/bytecode/javFiles/Gen.jav
Normal file
8
test/bytecode/javFiles/Gen.jav
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
public class Gen{
|
||||||
|
Vector<? extends Integer> m(Vector<Integer> v){
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}
|
57
test/bytecode/javFiles/GreaterEqual.jav
Normal file
57
test/bytecode/javFiles/GreaterEqual.jav
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.Long;
|
||||||
|
import java.lang.Float;
|
||||||
|
import java.lang.Double;
|
||||||
|
|
||||||
|
public class GreaterEqual {
|
||||||
|
|
||||||
|
gE(Integer a, Integer b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Long a, Long b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Float a, Float b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Double a, Double b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Long a, Integer b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Float a, Integer b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Double a, Integer b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Float a, Long b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Double a, Long b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gE(Double a, Float b){
|
||||||
|
var c = a>=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
56
test/bytecode/javFiles/GreaterThan.jav
Normal file
56
test/bytecode/javFiles/GreaterThan.jav
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.Long;
|
||||||
|
import java.lang.Float;
|
||||||
|
import java.lang.Double;
|
||||||
|
|
||||||
|
public class GreaterThan {
|
||||||
|
gT(Integer a, Integer b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Long a, Long b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Float a, Float b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Double a, Double b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Long a, Integer b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Float a, Integer b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Double a, Integer b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Float a, Long b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Double a, Long b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
gT(Double a, Float b){
|
||||||
|
var c = a>b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
import java.lang.Integer;
|
import java.lang.Integer;
|
||||||
|
|
||||||
class LamAssign {
|
public class Lambda {
|
||||||
|
|
||||||
m () {
|
m () {
|
||||||
var lam1 = (Integer x) -> {
|
var lam1 = (Integer x) -> {
|
||||||
@ -9,7 +9,3 @@ class LamAssign {
|
|||||||
return lam1;
|
return lam1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Fun1<A,B>{
|
|
||||||
public A apply(B b);
|
|
||||||
}
|
|
56
test/bytecode/javFiles/LessEqual.jav
Normal file
56
test/bytecode/javFiles/LessEqual.jav
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.Long;
|
||||||
|
import java.lang.Float;
|
||||||
|
import java.lang.Double;
|
||||||
|
|
||||||
|
public class LessEqual {
|
||||||
|
lessEqual(Integer a, Integer b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Long a, Long b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Float a, Float b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Double a, Double b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Long a, Integer b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Float a, Integer b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Double a, Integer b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Float a, Long b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Double a, Long b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessEqual(Double a, Float b){
|
||||||
|
var c = a<=b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
57
test/bytecode/javFiles/LessThan.jav
Normal file
57
test/bytecode/javFiles/LessThan.jav
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.Long;
|
||||||
|
import java.lang.Float;
|
||||||
|
import java.lang.Double;
|
||||||
|
|
||||||
|
public class LessThan {
|
||||||
|
|
||||||
|
lessThan(Integer a, Integer b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Long a, Long b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Float a, Float b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Double a, Double b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Long a, Integer b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Float a, Integer b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Double a, Integer b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Float a, Long b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Double a, Long b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
lessThan(Double a, Float b){
|
||||||
|
var c = a<b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
27
test/bytecode/javFiles/Matrix.jav
Normal file
27
test/bytecode/javFiles/Matrix.jav
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import java.util.Vector;
|
||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.Boolean;
|
||||||
|
|
||||||
|
class Matrix extends Vector<Vector<Integer>> {
|
||||||
|
mul(m) {
|
||||||
|
var ret = new Matrix();
|
||||||
|
var i = 0;
|
||||||
|
while(i < size()) {
|
||||||
|
var v1 = this.elementAt(i);
|
||||||
|
var v2 = new Vector<Integer>();
|
||||||
|
var j = 0;
|
||||||
|
while(j < v1.size()) {
|
||||||
|
var erg = 0;
|
||||||
|
var k = 0;
|
||||||
|
while(k < v1.size()) {
|
||||||
|
erg = erg + v1.elementAt(k)
|
||||||
|
* m.elementAt(k).elementAt(j);
|
||||||
|
k++; }
|
||||||
|
v2.addElement(new Integer(erg));
|
||||||
|
j++; }
|
||||||
|
ret.addElement(v2);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
9
test/bytecode/javFiles/OL.jav
Normal file
9
test/bytecode/javFiles/OL.jav
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.Boolean;
|
||||||
|
|
||||||
|
class OL {
|
||||||
|
|
||||||
|
m(Integer x) { return x + x; }
|
||||||
|
|
||||||
|
m(Boolean x) {return x || x; }
|
||||||
|
}
|
16
test/bytecode/javFiles/Op.jav
Normal file
16
test/bytecode/javFiles/Op.jav
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.String;
|
||||||
|
import java.lang.Long;
|
||||||
|
import java.lang.Float;
|
||||||
|
import java.lang.Double;
|
||||||
|
import java.lang.Boolean;
|
||||||
|
import java.lang.Short;
|
||||||
|
import java.lang.Byte;
|
||||||
|
|
||||||
|
public class Op {
|
||||||
|
|
||||||
|
Integer m(Integer a, Integer b) {
|
||||||
|
//var c = a+b;
|
||||||
|
return a+b;
|
||||||
|
}
|
||||||
|
}
|
11
test/bytecode/javFiles/Op2.jav
Normal file
11
test/bytecode/javFiles/Op2.jav
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.String;
|
||||||
|
|
||||||
|
public class Op2 {
|
||||||
|
m(){
|
||||||
|
var x = "";
|
||||||
|
var a = 5+x;
|
||||||
|
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
18
test/bytecode/javFiles/Overloading.jav
Normal file
18
test/bytecode/javFiles/Overloading.jav
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import java.lang.String;
|
||||||
|
|
||||||
|
public class Overloading{
|
||||||
|
|
||||||
|
test(x){
|
||||||
|
return x.methode();
|
||||||
|
}
|
||||||
|
|
||||||
|
methode(){
|
||||||
|
return "Overloading";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Overloading2{
|
||||||
|
methode(){
|
||||||
|
return "Overloading2";
|
||||||
|
}
|
||||||
|
}
|
8
test/bytecode/javFiles/Plus.jav
Normal file
8
test/bytecode/javFiles/Plus.jav
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
|
||||||
|
public class Plus {
|
||||||
|
|
||||||
|
m(a,b) {
|
||||||
|
return a+b;
|
||||||
|
}
|
||||||
|
}
|
27
test/bytecode/javFiles/PostIncDec.jav
Normal file
27
test/bytecode/javFiles/PostIncDec.jav
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
|
||||||
|
public class PostIncDec {
|
||||||
|
m() {
|
||||||
|
var i = 0;
|
||||||
|
i++;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
m2() {
|
||||||
|
var i = 0;
|
||||||
|
var j = i++;
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
d() {
|
||||||
|
var i = 0;
|
||||||
|
i--;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
d2() {
|
||||||
|
var i = 0;
|
||||||
|
var j = i--;
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user