Compare commits

..

19 Commits

Author SHA1 Message Date
Ruben 37c58be1f3 initially check Syntax when opening file
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 40s
2025-09-15 13:49:25 +02:00
Ruben 24920330c6 Merge branch 'refs/heads/master' into LSP-Interface 2025-09-10 13:45:58 +02:00
Ruben bc43ea749d feat: update compiler Interface
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 7m22s
2025-08-07 16:18:51 +02:00
Ruben c479b044b3 feat: add Method to only get AST
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 5m43s
2025-07-16 14:18:22 +02:00
Ruben 9046fb09e5 fix: directly use .generate Method instead of compiling each file by hand
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 7m20s
2025-07-16 11:53:48 +02:00
Ruben 42e31a3471 Merge branch 'master' into LSP-Interface
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 4m49s
2025-05-13 16:01:20 +02:00
Ruben d3b3f92193 feat: make dir when /out does not exist
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 43s
2025-05-12 18:57:46 +02:00
Ruben 8208abcaea fix: exclude Files that do not end on .jav
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 45s
2025-05-12 18:43:10 +02:00
Ruben e4a3939ce9 test: change TEstnames
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 41s
2025-05-09 14:11:39 +02:00
Ruben d903ec0ebb test: change TEstnames
Build and Test with Maven / Build-and-test-with-Maven (push) Has been cancelled
2025-05-09 14:11:11 +02:00
Ruben 61de81cf92 feat: compile all classes in workspace
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 42s
2025-05-08 19:00:12 +02:00
Ruben 59888006e0 feat: compile all classes in workspace
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 42s
2025-05-08 18:51:25 +02:00
Ruben 94034912b4 feat: clean out file when generating Bytecode
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 42s
2025-05-08 17:51:17 +02:00
Ruben f303163118 feat: clean out file when generating Bytecode
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 43s
2025-05-08 17:10:35 +02:00
Ruben 7d99fba044 fix: update Interface for Language Server to not throw random Errors anymore
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 43s
2025-05-07 18:53:47 +02:00
Ruben 3740d34954 fix: create Path if its non existent and add Try-Catch Clause when deleting Files in Case they dont exist
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 41s
2025-05-06 15:31:27 +02:00
Ruben d8b861ea95 feat: add Method in Interface to generate Bytecode
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 43s
2025-05-06 15:10:55 +02:00
Ruben cf45ea68bd feat: include Bytecode in /out Folder
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 42s
2025-05-05 17:26:10 +02:00
Ruben be72e4d7fb feat: add Compiler Interface
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 1m6s
2025-05-05 14:34:23 +02:00
65 changed files with 716 additions and 947 deletions
+2 -2
View File
@@ -73,8 +73,8 @@ http://maven.apache.org/maven-v4_0_0.xsd">
<version>3.14.0</version>
<configuration>
<compilerArgs>--enable-preview</compilerArgs>
<source>24</source>
<target>24</target>
<source>23</source>
<target>23</target>
</configuration>
</plugin>
<plugin>
-7
View File
@@ -1,7 +0,0 @@
public class Uncurrier{
uncurry (f){
return x -> f.apply(x);}
uncurry (f){
return (x, y) -> f.apply(x).apply(y);
}
}
@@ -1,9 +0,0 @@
import Uncurrier;
import java.lang.Integer;
class UncurrierMain {
meth(y) {
var uc = new Uncurrier() ;
uc.uncurry(x -> x+1);
}
}
-9
View File
@@ -1,9 +0,0 @@
import java.util.Vector;
import java.util.Collection;
class AddEle {
addEle(x, y) {
x.add(y);
return x;
}
}
-15
View File
@@ -1,15 +0,0 @@
import java.lang.Double;
import java.lang.Integer;
public class Fac {
getFac(n){
var res = 1;
var i = 1;
while(i<=n) {
res = res * i;
i++;
}
return res;
}
}
-25
View File
@@ -1,25 +0,0 @@
import java.lang.Integer;
import java.lang.Double;
import java.lang.System;
import java.io.PrintStream;
public class Faculty {
public Fun1$$<Double, Double> fact = (x) -> {
if (x == 1) {
return 1;
}
else {
return x * (fact.apply(x-1.0));
}
};
public getFact(x) {
return fact.apply(x);
}
public static void main(x) {
var f = new Faculty();
var intRes = f.getFact(3.0);
System.out.println(intRes);
}
}
-18
View File
@@ -1,18 +0,0 @@
import java.lang.Integer;
import java.lang.Float;
public class FacultyBug {
public Fun1$$<Float, Float> fact = (x) -> {
if (x == 1) {
return 1;
}
else {
return x * (fact.apply(x-1));
}
};
public getFact(x) {
return fact.apply(x);
}
}
-11
View File
@@ -1,11 +0,0 @@
class Id {
id2 = x -> x;
id(x) {
return x;
}
id3(x) {
return id(x);
}
}
-11
View File
@@ -1,11 +0,0 @@
import java.lang.Integer;
public class Lambda {
m () {
var lam1 = (x) -> {
return x * x;
};
return lam1;
}
}
-106
View File
@@ -1,106 +0,0 @@
import java.lang.String ;
import java.lang.System;
import java.io.PrintStream;
import java.lang.Character;
import java.lang.Object;
import java.lang.Integer;
import fst;
import Id;
import OLMain;
import Fac;
import Faculty;
import applyLambda;
import java.util.Vector;
import Matrix;
import MatrixOP;
public class Main {
public static main(x) {
/*
new fst().main(5);
System.out.println(new fst().main(5));
//Id.jav: the identity-function
//applied to an integer
System.out.println(new Id().id(1));
//applied to a string
System.out.println(new Id().id("hallo"));
//lamda-Expr
//System.out.println(new Id().id2.apply(1));
//Bug: https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore/issues/378
//OL.jav: Overloading
OLMain ol = new OLMain();
//the function main is applied to an integer
System.out.println(ol.main(2));
//the main is applied to a double
System.out.println(ol.main(2.0));
System.out.println(ol.main("Hallo"));
//Fac.jav
System.out.println(new Fac().getFac(6));
//Faculty.jav
//System.out.println(new Faculty().fact.apply(6));
//Bug: https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore/issues/378
System.out.println(new Faculty().getFact(3));
//Lambda.jav: An lambda expression applied by the method apply
//System.out.println(new Lambda().m().apply(77));
//Bug: https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore/issues/378
//applyLambda.jav: A defined lambda expression is applied
System.out.println(new applyLambda().m());
*/
Vector<Vector<Integer>> vv = new Vector<Vector<Integer>>();
Vector<Integer> v1 = new Vector<Integer> ();
v1.addElement(2);
v1.addElement(2);
Vector<Integer> v2 = new Vector<Integer> ();
v2.addElement(3);
v2.addElement(3);
Matrix m1 = new Matrix();
m1.addElement(v1);
m1.addElement(v2);
//vv.addElement(v1);
//vv.addElement(v2);
//Matrix m1 = new Matrix(vv);
Vector<Vector<Integer>> vv1 = new Vector<Vector<Integer>>();
Vector<Integer> v3 = new Vector<Integer> ();
v3.addElement(2);
v3.addElement(2);
Vector<Integer> v4 = new Vector<Integer> ();
v4.addElement(3);
v4.addElement(3);
Matrix m2 = new Matrix();
m2.addElement(v3);
m2.addElement(v4);
//vv1.addElement(v3);
//vv1.addElement(v4);
//Matrix m2 = new Matrix(vv1);
//Matrix m3 = m1.mul(vv1);
Matrix m3 = m1.mul(m2);
System.out.println(m1.toString() + " * " + m2.toString() + " = " + m3.toString());
//MatrixOP
MatrixOP mOp1 = new MatrixOP();
mOp1.addElement(v1);
mOp1.addElement(v2);
MatrixOP mOp2 = mOp1.mul.apply(mOp1, mOp1);
System.out.println(m1.toString() + " * " + m2.toString() + " = " + mOp2.toString());
}
}
/*
public class MainBug {
public static main(x) {
System.out.println(new fst().main(5));
//System.out.println(new FacultyBug().getFact(3));
}
}
*/
-11
View File
@@ -1,11 +0,0 @@
import java.lang.System;
import java.io.PrintStream;
import Faculty;
public class MainFaculty {
public static void main(x) {
//var f = new Faculty();
//var intRes = f.getFact(3);
//System.out.println(intRes);
}
}
-20
View File
@@ -1,20 +0,0 @@
import java.lang.String ;
import java.lang.System;
import java.io.PrintStream;
import java.lang.Float;
import OL2;
class MainOL {
public static main(x) {
var ol = new OL2();
//the function main is applied to an integer
//var res1 = ol.m2(2);
//the main is applied to a double
//System.out.println(ol.m2(2.0));
//System.out.println(ol.m2("Hallo").toString());
var res2 = ol.m2("Hallo").toString();
System.out.println(res2);
}
}
-41
View File
@@ -1,41 +0,0 @@
import java.util.Vector;
import java.lang.Integer;
import java.lang.Boolean;
public class Matrix extends Vector<Vector<Integer>> {
public Matrix () {
}
public Matrix(vv) {
var i = 0;
while(i < vv.size()) {
this.add(vv.elementAt(i));
i=i+1;
}
}
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(erg);
j++; }
ret.addElement(v2);
i++;
}
return ret;
}
}
-64
View File
@@ -1,64 +0,0 @@
import java.util.Vector;
import java.lang.Integer;
//import java.lang.Byte;
import java.lang.Boolean;
import java.lang.String;
import java.lang.System;
import java.io.PrintStream;
public class MatrixOP extends Vector<Vector<Integer>> {
public MatrixOP () {
}
public MatrixOP(vv) {
Integer i;
i = 0;
while(i < vv.size()) {
this.add(vv.elementAt(i));
i=i+1;
}
}
mul = (m1, m2) -> {
var ret = new MatrixOP();
var i = 0;
while(i < m1.size()) {
var v1 = m1.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)
* m2.elementAt(k).elementAt(j);
k++; }
// v2.addElement(new Integer(erg));
v2.addElement(erg);
j++; }
ret.addElement(v2);
i++;
}
return ret;
};
public static main(x) {
var vv = new Vector<Vector<Integer>>();
var v1 = new Vector<Integer> ();
v1.addElement(2);
v1.addElement(2);
var v2 = new Vector<Integer> ();
v2.addElement(3);
v2.addElement(3);
//MatrixOP
MatrixOP mOp1 = new MatrixOP();
mOp1.addElement(v1);
mOp1.addElement(v2);
MatrixOP mOp2 = mOp1.mul.apply(mOp1, mOp1);
System.out.print(mOp1); System.out.print(" * "); System.out.print(mOp1); System.out.print(" = "); System.out.println(mOp2);
//System.out.print(mOp1 + " * " + mOp1 + " = " + mOp2);
}
}
}
-33
View File
@@ -1,33 +0,0 @@
import java.lang.String;
import java.lang.Integer;
import java.lang.Double;
import java.lang.Boolean;
import java.lang.Object;
import java.lang.System;
import java.io.PrintStream;
public class OL1 {
m1( x) { return x + x; }
m1(x) { return x || x; }
}
public class OL2 {
m2(x) {
var ol;
ol = new OL1();
return ol.m1(x);
}
}
-20
View File
@@ -1,20 +0,0 @@
import java.lang.String;
import java.lang.Integer;
import java.lang.Double;
import java.util.Vector;
import java.lang.Boolean;
public class OLFun {
x;
m(f, y) {
y = f.apply(x+x);
return x;
}
}
-12
View File
@@ -1,12 +0,0 @@
class Pair {
fst;
snd;
Pair(fst, snd) { this.fst=fst; this.snd=snd; }
getfst() { return this.fst; }
swap() {
return new Pair<>(this.snd, this.fst);
}
}
-9
View File
@@ -1,9 +0,0 @@
import java.lang.Integer;
import java.lang.String;
public class Plus {
m(a, b) {
return a+b;
}
}
-25
View File
@@ -1,25 +0,0 @@
import java.util.List;
import java.util.ArrayList;
import java.lang.String;
public class Sorting{
merge(a, b){
a.addAll(b);
return a;
}
sort(in){
var firstHalf = in;
var secondHalf = in;
return merge(sort(firstHalf), sort(secondHalf));
}
/*
void sort(a){
a = merge(a,a);
}
*/
}
-20
View File
@@ -1,20 +0,0 @@
import java.lang.String;
import java.lang.Object;
import java.lang.System;
import java.io.PrintStream;
import java.lang.Character;
public class Swap{
<ZDP, ZEA, ZDO, YZP, ZCY, ZDZ> Fun1$$<ZCY, Fun1$$<ZDZ, ZEA>> swap(f){
return x->y->f.apply(y).apply(x);
}
Fun1$$<String, Fun1$$<String, Fun1$$<String, String>>> swap(f){
return x -> y -> z -> f.apply(z).apply(x).apply(y);
}
public static main (y) {
var func = x -> y -> z -> x + y + z;
var res = new Swap().swap(func).apply("A").apply("B").apply("C");
System.out.println(res);}
}
-6
View File
@@ -1,6 +0,0 @@
class TPHMethod {
void m(a, b) {
a = b;
b=a;
}
}
-16
View File
@@ -1,16 +0,0 @@
class Test{
void m( op, a, b ){
op.myapply(a, b);
}
}
class Atype{}
class Btype{}
class Operator1{
void myapply(Atype p1, Atype p2){...}
}
class Operator2{
void myapply(Btype p1, Btype p2){...}
}
-7
View File
@@ -1,7 +0,0 @@
public class Uncurrier{
uncurry (f){
return x -> f.apply(x);}
uncurry (f){
return (x, y) -> f.apply(x).apply(y);
}
}
@@ -1,7 +0,0 @@
import Uncurrier;
class UncurrierMain {
public static main(x) {
var uc = new Uncurrier() ;
}
}
-16
View File
@@ -1,16 +0,0 @@
import java.lang.Integer;
import java.lang.String;
import java.util.Vector;
class VectorAdd {
vectorAdd(v1, v2) {
var i = 0;
var erg = new Vector<>();
while (i < v1.size()) {
erg.addElement(v1.elementAt(i) + v2.elementAt(i));
i++;
}
return erg;
}
}
-16
View File
@@ -1,16 +0,0 @@
import java.util.Vector;
class Apply { }
public class applyLambda {
public m () {
var lam1 = (x) -> {
return x;
};
return lam1.apply(new Apply());
//return lam1;
//return new Vector();
}
}
-7
View File
@@ -1,7 +0,0 @@
//import java.lang.Integer;
class fst {
main(x) {
return x;
}
}
-8
View File
@@ -1,8 +0,0 @@
import java.util.Vector;
class genVector {
m(v) {
return v.elementAt(0);
}
}
-8
View File
@@ -1,8 +0,0 @@
import java.lang.Integer;
import Id;
class Test {
m() {
Integer o1 = new Id<Integer,Integer>().id2.apply(1);
}
}
-9
View File
@@ -1,9 +0,0 @@
public class lambdaId {
lambdaId = x -> x;
/*
id3 (x) {
return lambdaId.apply(x);
}
*/
}
-9
View File
@@ -1,9 +0,0 @@
class mathStruc {
model;
innerOp = (o) -> (ms) -> new mathStruc<>(o.apply(model,ms.model));
mathStruc(m) {
model =m;
}
}
@@ -1,18 +0,0 @@
import java.lang.Integer;
class mathStruc {
model;
innerOp = (o) -> (ms) -> new mathStruc<>(o.apply(model,ms.model));
mathStruc(m) {
model =m;
}
}
class mathStrucIntegerUse {
main() {
var ms = new mathStruc<>(2);
return ms.innerOp.apply((x,y) -> x+y).apply(ms);
}
}
@@ -1,90 +0,0 @@
import java.util.Vector;
import java.lang.Integer;
import java.lang.Boolean;
public class mathStrucMatrixOP {
model;
innerOp = (o) -> (ms) -> new mathStrucMatrixOP<>(o.apply(model,ms.model));
public mathStrucMatrixOP(m) {
model =m;
}
}
public class MatrixOP extends Vector<Vector<Integer>> {
MatrixOP () {
}
MatrixOP(vv) {
Integer i;
i = 0;
while(i < vv.size()) {
// Boolean a = this.add(vv.elementAt(i));
this.add(vv.elementAt(i));
i=i+1;
}
}
public mul = (m1, m2) -> {
var ret = new MatrixOP();
var i = 0;
while(i < m1.size()) {
var v1 = m1.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)
* m2.elementAt(k).elementAt(j);
k++; }
// v2.addElement(new Integer(erg));
v2.addElement(erg);
j++; }
ret.addElement(v2);
i++;
}
return ret;
};
}
class mathStrucUseMatrixOP {
main() {
Vector<Vector<Integer>> vv = new Vector<Vector<Integer>>();
Vector<Integer> v1 = new Vector<Integer>();
v1.addElement(2);
v1.addElement(2);
Vector<Integer> v2 = new Vector<Integer>();
v2.addElement(3);
v2.addElement(3);
vv.addElement(v1);
vv.addElement(v2);
MatrixOP m1 = new MatrixOP(vv);
Vector<Vector<Integer>> vv1 = new Vector<Vector<Integer>>();
Vector<Integer> v3 = new Vector<Integer>();
v3.addElement(2);
v3.addElement(2);
Vector<Integer> v4 = new Vector<Integer>();
v4.addElement(3);
v4.addElement(3);
vv1.addElement(v3);
vv1.addElement(v4);
MatrixOP m2 = new MatrixOP(vv1);
var mms;
mms = new mathStrucMatrixOP<>(m1);
var mms2;
mms2 = new mathStrucMatrixOP<>(m2);
var mms3;
mms3 = mms.innerOp.apply(m1.mul).apply(mms2);
return mms3;
}
}
-14
View File
@@ -1,14 +0,0 @@
import java.lang.String;
import java.lang.Boolean;
import java.lang.Integer;
import java.io.Serializable;
public class testclass{
public testMethod(ele){
if(ele){
return 1;
}
return "";
}
}
+3 -4
View File
@@ -2,10 +2,9 @@ import java.util.Vector;
import java.lang.Integer;
//import java.lang.Byte;
import java.lang.Boolean;
import java.util.function.BiFunction;
public class MatrixOP extends Vector<Vector<Integer>> {
MatrixOP () {
}
@@ -37,8 +36,8 @@ public class MatrixOP extends Vector<Vector<Integer>> {
v2.addElement(erg);
j++; }
ret.addElement(v2);
i++;
i++;
}
return ret;
};
}
}
@@ -132,7 +132,6 @@ public class Codegen {
}
private void boxPrimitive(State state, TargetType type) {
if (type instanceof TargetExtendsWildcard ew) type = ew.innerType();
var mv = state.mv;
if (type.equals(TargetType.Boolean) || type.equals(TargetType.boolean_)) {
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
@@ -154,7 +153,6 @@ public class Codegen {
}
private void unboxPrimitive(State state, TargetType type) {
if (type instanceof TargetExtendsWildcard ew) type = ew.innerType();
var mv = state.mv;
if (type.equals(TargetType.Boolean)) {
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
@@ -230,9 +228,6 @@ public class Codegen {
}
private void convertTo(State state, TargetType source, TargetType dest) {
if (source instanceof TargetExtendsWildcard ew) source = ew.innerType();
if (dest instanceof TargetExtendsWildcard ew) dest = ew.innerType();
var mv = state.mv;
if (source.equals(dest))
return;
@@ -645,7 +640,7 @@ public class Codegen {
} else if (op.expr() instanceof TargetFieldVar fieldVar) {
generate(state, fieldVar.left());
mv.visitInsn(SWAP);
mv.visitFieldInsn(PUTFIELD, fieldVar.owner().getInternalName(), fieldVar.right(), fieldVar.type().toDescriptor());
mv.visitFieldInsn(PUTFIELD, fieldVar.owner().getInternalName(), fieldVar.right(), fieldVar.type().toSignature());
}
}
@@ -808,7 +803,7 @@ public class Codegen {
var handle = new Handle(state.isStatic ? H_INVOKESTATIC : H_INVOKEVIRTUAL, clazz.getName(), impl.name(), implSignature.getDescriptor(), false);
var params = new ArrayList<TargetType>();
if(!state.isStatic) params.add(new TargetRefType(clazz.qualifiedName().toString()));
if(!state.isStatic) params.add(new TargetRefType(clazz.qualifiedName().getClassName()));
params.addAll(lambda.captures().stream().map(mp -> mp.pattern().type()).toList());
if (!state.isStatic)
@@ -947,7 +942,7 @@ public class Codegen {
mv.visitInsn(DUP);
else
mv.visitInsn(DUP_X1);
mv.visitFieldInsn(dot.isStatic() ? PUTSTATIC : PUTFIELD, dot.owner().getInternalName(), dot.right(), fieldType.toDescriptor());
mv.visitFieldInsn(dot.isStatic() ? PUTSTATIC : PUTFIELD, dot.owner().getInternalName(), dot.right(), fieldType.toSignature());
}
default -> throw new CodeGenException("Invalid assignment");
}
@@ -964,7 +959,7 @@ public class Codegen {
case TargetFieldVar dot: {
if (!dot.isStatic())
generate(state, dot.left());
mv.visitFieldInsn(dot.isStatic() ? GETSTATIC : GETFIELD, dot.left().type().getInternalName(), dot.right(), dot.type().toDescriptor());
mv.visitFieldInsn(dot.isStatic() ? GETSTATIC : GETFIELD, dot.left().type().getInternalName(), dot.right(), dot.type().toSignature());
unboxPrimitive(state, dot.type());
break;
}
@@ -1428,7 +1423,7 @@ public class Codegen {
throw new CodeGenException("Couldn't find suitable field accessor for '" + type.name() + "'");
var field = clazz.getFieldDecl().get(i);
var fieldType = converter.convert(field.getType());
state.mv.visitMethodInsn(INVOKEVIRTUAL, type.getInternalName(), field.getName(), "()" + fieldType.toDescriptor(), false);
state.mv.visitMethodInsn(INVOKEVIRTUAL, type.getInternalName(), field.getName(), "()" + fieldType.toSignature(), false);
}
private void bindPattern(State state, TargetType type, TargetPattern pat, Label start, int index, int depth) {
@@ -1533,7 +1528,7 @@ public class Codegen {
//if ((access & ACC_PRIVATE) == 0 && (access & ACC_PROTECTED) == 0) // TODO Implement access modifiers properly
// access |= ACC_PUBLIC;
cw.visitField(access, field.name(), field.type().toDescriptor(), field.type().toSignature(), null);
cw.visitField(access, field.name(), field.type().toSignature(), field.type().toDescriptor(), null);
}
private void generateStaticConstructor(TargetMethod constructor) {
@@ -1609,7 +1604,7 @@ public class Codegen {
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESTATIC, "java/util/List", "of", "([Ljava/lang/Object;)Ljava/util/List;", true);
mv.visitMethodInsn(INVOKESTATIC, new TargetRefType(clazz.qualifiedName().toString()).getInternalName(), "main", "(Ljava/util/List;)V", false);
mv.visitMethodInsn(INVOKESTATIC, className, "main", "(Ljava/util/List;)V", false);
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
@@ -1666,12 +1661,12 @@ public class Codegen {
if (!generics.isEmpty()) {
ret += "<";
for (var generic : generics) {
ret += generic.name() + ":" + generic.bound().toSignature();
ret += generic.name() + ":" + generic.bound().toDescriptor();
}
ret += ">";
}
if (clazz.superType() != null)
ret += clazz.superType().toSignature();
ret += clazz.superType().toDescriptor();
for (var intf : clazz.implementingInterfaces()) {
ret += intf.toSignature();
}
@@ -1783,7 +1778,7 @@ public class Codegen {
cw2.visitEnd();
var bytes = cw2.toByteArray();
compiler.auxiliaries.put(className, bytes);
converter.auxiliaries.put(className, bytes);
// TODO These class loading shenanigans happen in a few places, the tests load the classes individually.
// Instead we should just look at the folder.
@@ -1826,7 +1821,7 @@ public class Codegen {
bootstrapArgs[1] = String.join(";", clazz.fields().stream().map(TargetField::name).toArray(String[]::new));
for (var i = 0; i < clazz.fields().size(); i++) {
var field = clazz.fields().get(i);
var fieldRef = new Handle(H_GETFIELD, clazz.getName(), field.name(), field.type().toDescriptor(), false);
var fieldRef = new Handle(H_GETFIELD, clazz.getName(), field.name(), field.type().toSignature(), false);
bootstrapArgs[i + 2] = fieldRef;
}
@@ -98,7 +98,7 @@ public class FunNGenerator {
}
private static String applySignature(TargetType a) { return a.toSignature(); }
private static String applyNameDescriptor(TargetType a){ return a instanceof TargetGenericType ? "LTPH;" : String.format("%s", a.toDescriptor()); }
private static String applyNameDescriptor(TargetType a){ return a instanceof TargetGenericType ? "LTPH;" : String.format("%s", applySignature(a)); }
public static String encodeType(TargetType type) {
if (type == null) return VOID;
@@ -2,10 +2,10 @@
package de.dhbwstuttgart.core;
import de.dhbwstuttgart.bytecode.Codegen;
import de.dhbwstuttgart.bytecode.FunNGenerator;
import de.dhbwstuttgart.environment.CompilationEnvironment;
import de.dhbwstuttgart.environment.DirectoryClassLoader;
import de.dhbwstuttgart.exceptions.DebugException;
import de.dhbwstuttgart.languageServerInterface.model.LanguageServerTransferObject;
import de.dhbwstuttgart.parser.JavaTXParser;
import de.dhbwstuttgart.parser.NullToken;
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
@@ -74,11 +74,6 @@ public class JavaTXCompiler {
public final List<File> classPath;
private final File outputPath;
public final Map<String, FunNGenerator.GenericParameters> usedFunN = new HashMap<>();
public final Set<Integer> usedFunNSuperTypes = new HashSet<>();
public Map<String, byte[]> auxiliaries = new HashMap<>();
public DirectoryClassLoader getClassLoader() {
return classLoader;
}
@@ -475,6 +470,85 @@ public class JavaTXCompiler {
return results.stream().map((unifyPairs -> new ResultSet(UnifyTypeFactory.convert(unifyPairs, Pair.generateTPHMap(cons))))).collect(Collectors.toList());
}
/**
* TEMPORARY - Only for Language Server Usage
*/
public LanguageServerTransferObject getResultSetAndAbstractSyntax(File file) throws IOException, ClassNotFoundException {
var sf = sourceFiles.get(file);
if(sf == null){
sf = sourceFiles.values().stream().findFirst().get();
}
Set<ClassOrInterface> allClasses = new HashSet<>();
allClasses.addAll(getAvailableClasses(sf));
allClasses.addAll(sf.getClasses());
var newClasses = CompilationEnvironment.loadDefaultPackageClasses(sf.getPkgName(), file, this).stream().map(ASTFactory::createClass).collect(Collectors.toSet());
for (var clazz : newClasses) {
// Don't load classes that get recompiled
if (sf.getClasses().stream().anyMatch(nf -> nf.getClassName().equals(clazz.getClassName())))
continue;
if (allClasses.stream().noneMatch(old -> old.getClassName().equals(clazz.getClassName())))
allClasses.add(clazz);
}
final ConstraintSet<Pair> cons = getConstraints(file);
Set<Set<UnifyPair>> results = new HashSet<>();
try {
Writer logFile = new OutputStreamWriter(new NullOutputStream());
IFiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses.stream().toList(), logFile, classLoader, this);
ConstraintSet<UnifyPair> unifyCons = UnifyTypeFactory.convert(this, cons);
Function<UnifyPair, UnifyPair> distributeInnerVars = x -> {
UnifyType lhs, rhs;
if (((lhs = x.getLhsType()) instanceof PlaceholderType) && ((rhs = x.getRhsType()) instanceof PlaceholderType) && (((PlaceholderType) lhs).isInnerType() || ((PlaceholderType) rhs).isInnerType())) {
((PlaceholderType) lhs).setInnerType(true);
((PlaceholderType) rhs).setInnerType(true);
}
return x;
};
unifyCons = unifyCons.map(distributeInnerVars);
TypeUnify unify = new TypeUnify();
Set<PlaceholderType> varianceTPHold;
Set<PlaceholderType> varianceTPH = new HashSet<>();
varianceTPH = varianceInheritanceConstraintSet(unifyCons);
List<Set<Constraint<UnifyPair>>> oderConstraints = unifyCons.getOderConstraints();
if (resultmodel) {
/* UnifyResultModel Anfang */
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyResultListenerImpl li = new UnifyResultListenerImpl();
urm.addUnifyResultListener(li);
unify.unifyParallel(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm, usedTasks);
generateBytecode(sf, li.getResults());
return new LanguageServerTransferObject(li.getResults(), sf, ASTTypePrinter.print(sf), generatedGenerics);
}
/* UnifyResultModel End */
else {
Set<Set<UnifyPair>> result = unify.unifyOderConstraints(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, new UnifyResultModel(cons, finiteClosure), usedTasks);
results.addAll(result);
results = results.stream().map(x -> {
Optional<Set<UnifyPair>> res = new RuleSet().subst(x.stream().map(y -> {
if (y.getPairOp() == PairOperator.SMALLERDOTWC)
y.setPairOp(PairOperator.EQUALSDOT);
return y; // alle Paare a <.? b erden durch a =. b ersetzt
}).collect(Collectors.toCollection(HashSet::new)));
if (res.isPresent()) {// wenn subst ein Erg liefert wurde was veraendert
return new TypeUnifyTask().applyTypeUnificationRules(res.get(), finiteClosure);
} else
return x; // wenn nichts veraendert wurde wird x zurueckgegeben
}).collect(Collectors.toCollection(HashSet::new));
}
} catch (ClassNotFoundException e) {
}
generateBytecode(sf, results.stream().map((unifyPairs -> new ResultSet(UnifyTypeFactory.convert(unifyPairs, Pair.generateTPHMap(cons))))).collect(Collectors.toList()));
return new LanguageServerTransferObject(results.stream().map((unifyPairs -> new ResultSet(UnifyTypeFactory.convert(unifyPairs, Pair.generateTPHMap(cons))))).collect(Collectors.toList()), sf, ASTTypePrinter.print(sf), generatedGenerics);
}
/**
* Vererbt alle Variancen bei Paaren (a <. theta) oder (Theta <. a) wenn a eine Variance !=0 hat auf alle Typvariablen in Theta.
*
@@ -652,7 +726,7 @@ public class JavaTXCompiler {
}
generatedGenerics.put(sf, converter.javaGenerics());
converter.generateFunNTypes();
auxiliaries.forEach((name, source) -> {
converter.auxiliaries.forEach((name, source) -> {
generatedClasses.put(new JavaClassName(name), source);
});
return generatedClasses;
@@ -0,0 +1,279 @@
package de.dhbwstuttgart.languageServerInterface;
import de.dhbwstuttgart.bytecode.Codegen;
import de.dhbwstuttgart.core.JavaTXCompiler;
import de.dhbwstuttgart.environment.IByteArrayClassLoader;
import de.dhbwstuttgart.languageServerInterface.model.LanguageServerTransferObject;
import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
import de.dhbwstuttgart.target.generate.ASTToTargetAST;
import de.dhbwstuttgart.target.generate.GenericsResult;
import de.dhbwstuttgart.target.tree.TargetStructure;
import org.apache.commons.io.FileUtils;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Implementation of an Interface for the Language-Server to get the Resultset and abstract Syntax.
*/
public class LanguageServerInterface {
public LanguageServerTransferObject getResultSetAndAbastractSyntax(String path, String resetNamesTo) throws IOException, URISyntaxException, ClassNotFoundException {
NameGenerator.resetTo(resetNamesTo);
return getResultSetAndAbstractSyntax(path);
}
public SourceFile getAst(String path, String resetNamesTo) throws IOException, URISyntaxException, ClassNotFoundException {
NameGenerator.resetTo(resetNamesTo);
return getAST(path);
}
/**
* returns the ResultSets, GenericResultSet and the AST
* You have to give the input as well as the path because of potential locks when the File is currently opened in an IDE.
* Example: file:///c:/test/main.jav -> file:///c:/test/out/main.class
*
* @param path the URI of the File. See Example.
* @throws IOException
* @throws ClassNotFoundException
* @throws URISyntaxException
*/
public LanguageServerTransferObject getResultSetAndAbstractSyntax(String path) throws IOException, ClassNotFoundException, URISyntaxException {
//
// System.setOut(new PrintStream(OutputStream.nullOutputStream()));
//
//
// URI uri = new URI(path);
// ArrayList<String> pathWithoutName = new ArrayList<>(List.of(uri.getPath().split("/")));
// pathWithoutName.remove(List.of(uri.getPath().split("/")).size() - 1);
// String stringPathWithoutName = "";
//
// for (String i : pathWithoutName) {
// stringPathWithoutName += "/" + i;
// }
//
// try {
// FileUtils.cleanDirectory(new File(stringPathWithoutName + "/out"));
// } catch (Exception e) {
//
// }
// try {
// (new File(stringPathWithoutName + "/out")).mkdirs();
// } catch (Exception e) {
//
// }
// var test = getLanguageServerTransferObject(uri.getPath().split("/")[uri.getPath().split("/").length - 1], new ByteArrayClassLoader(), new File(stringPathWithoutName).getPath());
// System.setOut(System.out);
// return test;
// File oldTempSourcefile = new File(stringPathWithoutName + "/out/" + uri.getPath().split("/")[uri.getPath().split("/").length - 1].replace(".jav", ".tmp"));
// File oldTempOutFile = new File(stringPathWithoutName + "/out/" + uri.getPath().split("/")[uri.getPath().split("/").length - 1].replace(".jav", ".class"));
// Files.deleteIfExists(oldTempSourcefile.toPath());
// Files.deleteIfExists(oldTempOutFile.toPath());
// FileUtils.deleteDirectory(oldTempSourcefile);
//
// File tempSourcefile = new File(stringPathWithoutName + "/out/" + uri.getPath().split("/")[uri.getPath().split("/").length - 1].replace(".jav", ".tmp"));
// File tempOutFile = new File(stringPathWithoutName + "/out/");
// FileUtils.writeStringToFile(tempSourcefile, input, "UTF-8");
//
// //TODO: Enable for multiple Class-Files
// JavaTXCompiler tx = new JavaTXCompiler(new ArrayList<File>(List.of(tempSourcefile)), new ArrayList<File>(List.of((tempSourcefile))), tempOutFile);
// var result = tx.getResultSetAndAbstractSyntax(tempSourcefile);
// System.setOut(System.out);
// tempSourcefile.delete();
// tempOutFile.delete();
// return result;
return null;
}
/**
* returns the AST without calculating the result
* You have to give the input as well as the path because of potential locks when the File is currently opened in an IDE.
* Example: file:///c:/test/main.jav -> file:///c:/test/out/main.class
*
* @param path the URI of the File. See Example.
* @throws IOException
* @throws ClassNotFoundException
* @throws URISyntaxException
*/
public SourceFile getAST(String path) throws IOException, ClassNotFoundException, URISyntaxException {
System.setOut(new PrintStream(OutputStream.nullOutputStream()));
URI uri = new URI(path);
ArrayList<String> pathWithoutName = new ArrayList<>(List.of(uri.getPath().split("/")));
pathWithoutName.remove(List.of(uri.getPath().split("/")).size() - 1);
String stringPathWithoutName = "";
for (String i : pathWithoutName) {
stringPathWithoutName += "/" + i;
}
try {
FileUtils.cleanDirectory(new File(stringPathWithoutName + "/out"));
} catch (Exception e) {
}
try {
(new File(stringPathWithoutName + "/out")).mkdirs();
} catch (Exception e) {
}
var test = getAST(uri.getPath().split("/")[uri.getPath().split("/").length - 1], new File(stringPathWithoutName).getPath());
System.setOut(System.out);
return test;
}
private static void writeClassFile(String name, byte[] code, Path outputPath) throws IOException {
Files.createDirectories(outputPath);
Files.write(outputPath.resolve(name + ".class"), code);
}
public static Map<String, ? extends Class<?>> generateClassFiles(IByteArrayClassLoader classLoader, Path path, Path outputPath, String... files) throws IOException, ClassNotFoundException {
Files.createDirectories(outputPath);
var filenames = Arrays.stream(files).map(filename -> Path.of(path.toString(), filename).toFile()).toList();
var compiler = new JavaTXCompiler(filenames, List.of(path.toFile(), outputPath.toFile()), outputPath.toFile());
var result = new HashMap<String, Class<?>>();
for (var file : filenames) {
var resultSet = compiler.typeInference(file);
var sourceFile = compiler.sourceFiles.get(file);
var converter = new ASTToTargetAST(compiler, resultSet, sourceFile, classLoader);
var classes = compiler.sourceFiles.get(file).getClasses();
result.putAll(classes.stream().map(cli -> {
try {
return generateClass(converter.convert(cli), classLoader, converter, outputPath);
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}).collect(Collectors.toMap(Class::getName, Function.identity())));
converter.generateFunNTypes();
for (var entry : converter.auxiliaries.entrySet()) {
writeClassFile(entry.getKey(), entry.getValue(), outputPath);
}
}
for (var entry : compiler.loadedClasses.entrySet()) {
var name = entry.getKey().toString();
result.put(name, classLoader.loadClass(Path.of(entry.getValue().classFile().toURI())));
}
return result;
}
public static Class<?> generateClass(TargetStructure clazz, IByteArrayClassLoader classLoader, ASTToTargetAST converter, Path outputPath) throws IOException {
Codegen codegen = new Codegen(clazz, converter.compiler, converter);
var code = codegen.generate();
writeClassFile(clazz.qualifiedName().getClassName(), code, outputPath);
return classLoader.loadClass(code);
}
public static Map<String, ? extends Class<?>> generateClassFiles(String filename, IByteArrayClassLoader classLoader, String filePath) throws IOException, ClassNotFoundException {
var file = Path.of(filePath, filename).toFile();
var compiler = new JavaTXCompiler(List.of(file), List.of(file.getParentFile()), Path.of(filePath + "/out").toFile());
var resultSet = compiler.typeInference(file);
var sourceFile = compiler.sourceFiles.get(file);
var converter = new ASTToTargetAST(compiler, resultSet, sourceFile, classLoader);
var classes = compiler.sourceFiles.get(file).getClasses();
var result = classes.stream().map(cli -> {
try {
return generateClass(converter.convert(cli), classLoader, converter, Path.of(filePath + "/out/"));
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}).collect(Collectors.toMap(Class::getName, Function.identity()));
converter.generateFunNTypes();
for (var entry : converter.auxiliaries.entrySet()) {
writeClassFile(entry.getKey(), entry.getValue(), Path.of(filePath + "/out/"));
}
return result;
}
public static SourceFile getAST(String filename, String filePath) throws IOException, ClassNotFoundException {
var file = Path.of(filePath, filename).toFile();
var compiler = new JavaTXCompiler(List.of(file), List.of(file.getParentFile()), Path.of(filePath + "/out").toFile());
return compiler.sourceFiles.get(file);
}
public static LanguageServerTransferObject getLanguageServerTransferObject(String filename, IByteArrayClassLoader classLoader, String filePath) throws IOException, ClassNotFoundException {
var file = Path.of(filePath, filename).toFile();
var compiler = new JavaTXCompiler(List.of(file), List.of(file.getParentFile()), Path.of(filePath + "/out").toFile());
var resultSet = compiler.typeInference(file);
var sourceFile = compiler.sourceFiles.get(file);
var converter = new ASTToTargetAST(compiler, resultSet, sourceFile, classLoader);
compiler.generateBytecode();
converter.generateFunNTypes();
var ta = converter.javaGenerics();
var tb = converter.txGenerics();
Map<SourceFile, List<GenericsResult>> generics = new HashMap<>();
ArrayList<GenericsResult> genericsResults = new ArrayList<>();
genericsResults.addAll(ta);
genericsResults.addAll(tb);
generics.put(converter.compiler.sourceFiles.values().stream().findFirst().get(), ta);
var test = new LanguageServerTransferObject(resultSet, converter.compiler.sourceFiles.values().stream().findFirst().get(), "", compiler.getGeneratedGenerics());
return test;
}
/**
* generates Bytecode for the given Path of the File.
* The Generated Bytecode can be found in the same place as the path, except the File lies in an /out/ Directory
* Example: file:///c:/test/main.jav -> file:///c:/test/out/main.class
*
* @param uri the URI of the File. See Example.
* @throws IOException
* @throws ClassNotFoundException
* @throws URISyntaxException
*/
public void generateBytecode(URI uri) throws IOException, ClassNotFoundException, URISyntaxException {
// System.setOut(new PrintStream(OutputStream.nullOutputStream()));
//
//
// File inputDir = new File(uri.getPath());
// File outFile = new File(uri.getPath() + "/out");
// FileUtils.cleanDirectory(outFile);
// String[] allowedEndings = {".jav"};
// ArrayList<File> files = new ArrayList<>();
//
// try (Stream<Path> stream = Files.walk(Paths.get(inputDir.toURI()))) {
// stream.filter(Files::isRegularFile)
// .forEach(el -> files.add(el.toFile()));
// }
//
//
// List<String> javFiles = files.stream().filter(el -> el.getName().split("\\.").length >= 2 && el.getName().split("\\.")[el.getName().split("\\.").length - 1].contains("jav")).map(el -> el.getPath().replace(inputDir.getPath(), "").substring(1)).toList();
// //TODO: Link between Files
// generateClassFiles(new ByteArrayClassLoader(), Path.of(inputDir.toURI()), Path.of(outFile.toURI()), javFiles.toArray(new String[0]));
// System.setOut(System.out);
}
}
@@ -0,0 +1,40 @@
package de.dhbwstuttgart.languageServerInterface;
import de.dhbwstuttgart.languageServerInterface.model.CustomParserErrorHandler;
import de.dhbwstuttgart.languageServerInterface.model.ParserError;
import de.dhbwstuttgart.parser.antlr.Java17Lexer;
import de.dhbwstuttgart.parser.antlr.Java17Parser;
import de.dhbwstuttgart.parser.antlr.Java17ParserBaseListener;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import java.util.List;
public class ParserInterface {
public List<ParserError> getParseErrors(String input){
CustomParserErrorHandler errorListener = new CustomParserErrorHandler();
CharStream charStream = CharStreams.fromString(input);
Java17Lexer lexer = new Java17Lexer(charStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
Java17Parser parser = new Java17Parser(tokens);
parser.removeErrorListeners();
parser.addErrorListener(errorListener);
ParseTree tree = parser.sourceFile();
ParseTreeWalker walker = new ParseTreeWalker();
Java17ParserBaseListener listener = new Java17ParserBaseListener();
walker.walk(listener, tree);
return errorListener.getErrorMessages();
}
}
@@ -0,0 +1,47 @@
package de.dhbwstuttgart.languageServerInterface.model;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.atn.ATNConfigSet;
import org.antlr.v4.runtime.dfa.DFA;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
public class CustomParserErrorHandler implements ANTLRErrorListener {
private final List<ParserError> errorMessages = new ArrayList<>();
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
int endCharPosition = charPositionInLine;
if (offendingSymbol instanceof Token) {
Token offendingToken = (Token) offendingSymbol;
endCharPosition = charPositionInLine + offendingToken.getText().length();
}
ParserError parserError = new ParserError(line, charPositionInLine, endCharPosition, msg);
errorMessages.add(parserError);
}
@Override
public void reportAmbiguity(Parser parser, DFA dfa, int i, int i1, boolean b, BitSet bitSet, ATNConfigSet atnConfigSet) {
}
@Override
public void reportAttemptingFullContext(Parser parser, DFA dfa, int i, int i1, BitSet bitSet, ATNConfigSet atnConfigSet) {
}
@Override
public void reportContextSensitivity(Parser parser, DFA dfa, int i, int i1, int i2, ATNConfigSet atnConfigSet) {
}
public List<ParserError> getErrorMessages() {
return errorMessages;
}
}
@@ -0,0 +1,31 @@
package de.dhbwstuttgart.languageServerInterface.model;
import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.target.generate.GenericsResult;
import de.dhbwstuttgart.typeinference.result.ResultSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LanguageServerTransferObject {
List<ResultSet> resultSets;
SourceFile Ast;
String printedAst;
Map<SourceFile, List<GenericsResult>> generatedGenerics = new HashMap<>();
public LanguageServerTransferObject(List<ResultSet> resultSets, SourceFile Ast, String printedAst, Map<SourceFile, List<GenericsResult>> generatedGenerics) {
this.resultSets = resultSets;
this.Ast = Ast;
this.printedAst = printedAst;
this.generatedGenerics = generatedGenerics;
}
public List<ResultSet> getResultSets() {return resultSets;}
public SourceFile getAst() {return Ast;}
public String getPrintedAst() {return printedAst;}
public Map<SourceFile, List<GenericsResult>> getGeneratedGenerics() {return generatedGenerics;}
}
@@ -0,0 +1,48 @@
package de.dhbwstuttgart.languageServerInterface.model;
public class ParserError {
private int line;
private int charPositionInLine;
private int endCharPosition;
String msg;
public ParserError(int line, int charPositionInLine, int endCharPosition, String msg) {
this.line = line;
this.charPositionInLine = charPositionInLine;
this. endCharPosition = endCharPosition;
this.msg = msg;
}
public int getEndCharPosition() {
return endCharPosition;
}
public void setEndCharPosition(int endCharPosition) {
this.endCharPosition = endCharPosition;
}
public void setCharPositionInLine(int charPositionInLine) {
this.charPositionInLine = charPositionInLine;
}
public void setLine(int line) {
this.line = line;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getCharPositionInLine() {
return charPositionInLine;
}
public int getLine() {
return line;
}
public String getMsg() {
return msg;
}
}
@@ -0,0 +1,20 @@
package de.dhbwstuttgart.languageServerInterface.model;
import com.google.common.reflect.TypeResolver;
import de.dhbwstuttgart.typeinference.unify.UnifyResultEvent;
import de.dhbwstuttgart.typeinference.unify.UnifyResultListener;
public class ResultSetListener implements UnifyResultListener {
TypeResolver typeResolver;
public ResultSetListener(TypeResolver typeResolver){
this.typeResolver = typeResolver;
}
@Override
public void onNewTypeResultFound(UnifyResultEvent evt) {
}
}
@@ -150,7 +150,7 @@ public class StatementGenerator {
} else {
type = methodparameters?
TypePlaceholder.fresh(fp.getStart(), 1, false)
: TypePlaceholder.fresh(fp.getStart(), 1, false);
: TypePlaceholder.fresh(fp.getStart());
}
ret.add(new FormalParameter(paramName, type, fp.getStart()));
localVars.put(paramName, type);
@@ -1065,7 +1065,7 @@ public class StatementGenerator {
List<Pattern> parameterList = new ArrayList<>();
for (IdentifierContext identifier : lambdaParams.identifier()) {
Token offset = identifier.getStart();
parameterList.add(new FormalParameter(identifier.getText(), TypePlaceholder.fresh(offset, 1, false), offset));
parameterList.add(new FormalParameter(identifier.getText(), TypePlaceholder.fresh(offset), offset));
}
params = new ParameterList(parameterList, lambdaParams.getStart());
} else if (lambdaParams.formalParameterList() != null) {
@@ -1075,7 +1075,7 @@ public class StatementGenerator {
List<Pattern> parameterList = new ArrayList<>();
for (LambdaLVTIParameterContext param : lambdaParams.lambdaLVTIList().lambdaLVTIParameter()) {
Token offset = param.getStart();
parameterList.add(new FormalParameter(param.identifier().getText(), TypePlaceholder.fresh(offset, 1, false), offset));
parameterList.add(new FormalParameter(param.identifier().getText(), TypePlaceholder.fresh(offset), offset));
}
params = new ParameterList(parameterList, lambdaParams.getStart());
} else {
@@ -6,12 +6,10 @@ import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
import de.dhbwstuttgart.syntaxtree.type.RefType;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
import de.dhbwstuttgart.target.tree.TargetGeneric;
import org.antlr.v4.runtime.Token;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.stream.Collectors;
/**
* Stellt jede Art von Klasse dar. Auch abstrakte Klassen und Interfaces
@@ -33,7 +31,6 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope {
private List<RefType> implementedInterfaces;
private List<RefType> permittedSubtypes;
private List<Constructor> constructors;
private Set<GenericTypeVar> userDefinedGenerics;
public ClassOrInterface(int modifiers, JavaClassName name, List<Field> fielddecl, Optional<Constructor> fieldInitializations, Optional<Method> staticInitializer, List<Method> methods, List<Constructor> constructors, GenericDeclarationList genericClassParameters, RefType superClass, Boolean isInterface, Boolean isFunctionalInterface, List<RefType> implementedInterfaces, List<RefType> permittedSubtypes, Token offset, String fileName) {
super(offset);
@@ -202,22 +199,4 @@ public class ClassOrInterface extends SyntaxTreeNode implements TypeScope {
public int hashCode() {
return Objects.hash(name);
}
public Set<GenericTypeVar> getUserDefinedGenerics() {
if (this.userDefinedGenerics != null) return this.userDefinedGenerics;
var genericsIter = getGenerics().iterator();
if (genericsIter.hasNext()) {
// Add empty set of generics to cache so that it doesn't try to calculate it later
this.userDefinedGenerics = new HashSet<>();
while (genericsIter.hasNext()) {
var next = genericsIter.next();
userDefinedGenerics.add(next);
}
} else {
this.userDefinedGenerics = new HashSet<>();
}
return this.userDefinedGenerics;
}
}
@@ -5,10 +5,8 @@ import java.util.*;
import de.dhbwstuttgart.parser.NullToken;
import de.dhbwstuttgart.parser.scope.JavaClassName;
import de.dhbwstuttgart.target.generate.ASTToTargetAST;
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceInformation;
import de.dhbwstuttgart.typeinference.result.ResultSet;
//import sun.security.x509.X509CertInfo;
public class SourceFile extends SyntaxTreeNode {
@@ -20,7 +18,6 @@ public class SourceFile extends SyntaxTreeNode {
private boolean isGenerated;
public List<ClassOrInterface> availableClasses = new ArrayList<>();
public List<ASTToTargetAST.Generics> generics = new ArrayList<>();
/**
* Die SourceFile repräsntiert eine zu einem Syntaxbaum eingelesene Java-Datei.
@@ -43,10 +40,6 @@ public class SourceFile extends SyntaxTreeNode {
this.imports = new HashSet<>(sf.imports);
}
public void addResultSet(ResultSet rs) {
}
public void setPackageName(String packageName) {
this.pkgName = packageName;
}
@@ -13,6 +13,10 @@ public class NameGenerator {
public static void reset() {
strNextName = "A";
}
public static void resetTo(String name) {
strNextName = name;
}
/**
* Berechnet einen neuen, eindeutigen Namen f�r eine neue
@@ -1,3 +1,4 @@
package de.dhbwstuttgart.target.generate;
import de.dhbwstuttgart.bytecode.FunNGenerator;
@@ -36,6 +37,7 @@ public class ASTToTargetAST {
public Generics generics;
public List<Generics> currentMethodOverloads;
final Map<ClassOrInterface, Set<GenericTypeVar>> userDefinedGenerics = new HashMap<>();
final Map<Method, Set<SignaturePair>> tphsInMethods = new HashMap<>();
private Method currentMethod;
@@ -60,11 +62,9 @@ public class ASTToTargetAST {
}
public record Generics(JavaGenerics javaGenerics, TxGenerics txGenerics) {
public Generics(JavaTXCompiler compiler, ResultSet set) {
this(new JavaGenerics(compiler, set), new TxGenerics(compiler, set));
}
}
public IByteArrayClassLoader classLoader;
protected SourceFile sourceFile;
@@ -82,9 +82,9 @@ public class ASTToTargetAST {
all = new ArrayList<>();
for (var set : resultSets) {
all.add(new Generics(compiler, set));
all.add(new Generics(new JavaGenerics(this, set), new TxGenerics(this, set)));
}
this.generics = all.getFirst();
this.generics = all.get(0);
}
public void addSignaturePair(TypePlaceholder signature, RefTypeOrTPHOrWildcardOrGeneric parameter) {
@@ -94,13 +94,9 @@ public class ASTToTargetAST {
}
Optional<Method> findMethod(ClassOrInterface owner, String name, List<TargetType> argumentList) {
return findMethod(owner, name, argumentList, this.generics.javaGenerics, this.compiler);
}
public static Optional<Method> findMethod(ClassOrInterface owner, String name, List<TargetType> argumentList, GenerateGenerics generics, JavaTXCompiler compiler) {
Optional<Method> method = Optional.empty();
while (method.isEmpty()) {
method = owner.getMethods().stream().filter(m -> m.name.equals(name) && parameterEquals(m.getParameterList(), argumentList, generics)).findFirst();
method = owner.getMethods().stream().filter(m -> m.name.equals(name) && parameterEquals(m.getParameterList(), argumentList)).findFirst();
if (owner.getClassName().toString().equals("java.lang.Object")) break;
owner = compiler.getClass(owner.getSuperClass().getName());
}
@@ -108,16 +104,16 @@ public class ASTToTargetAST {
}
Optional<Constructor> findConstructor(ClassOrInterface owner, List<TargetType> argumentList) {
return owner.getConstructors().stream().filter(c -> parameterEquals(c.getParameterList(), argumentList, generics.javaGenerics)).findFirst();
return owner.getConstructors().stream().filter(c -> parameterEquals(c.getParameterList(), argumentList)).findFirst();
}
static boolean parameterEquals(ParameterList parameterList, List<TargetType> arguments, GenerateGenerics generics) {
boolean parameterEquals(ParameterList parameterList, List<TargetType> arguments) {
var pars = parameterList.getFormalparalist();
if (pars.size() != arguments.size())
return false;
for (var i = 0; i < pars.size(); i++) {
var type1 = generics.getTargetType(pars.get(i).getType());
var type1 = convert(pars.get(i).getType(), generics.javaGenerics);
var type2 = arguments.get(i);
if (type1 instanceof TargetGenericType)
return true;
@@ -355,14 +351,19 @@ public class ASTToTargetAST {
Set<TargetGeneric> javaGenerics = new HashSet<>();
Set<TargetGeneric> txGenerics = new HashSet<>();
var userDefinedGenerics = input.getUserDefinedGenerics();
if (!userDefinedGenerics.isEmpty()) {
var genericsIter = input.getGenerics().iterator();
if (genericsIter.hasNext()) {
// Add empty set of generics to cache so that it doesn't try to calculate it later
for (var generic : userDefinedGenerics) {
// TODO Support multiple bouds
javaGenerics.add(new TargetGeneric(generic.getName(), convert(generic.getBounds().getFirst())));
var userDefinedGenerics = new HashSet<GenericTypeVar>();
this.userDefinedGenerics.put(input, userDefinedGenerics);
while (genericsIter.hasNext()) {
var next = genericsIter.next();
userDefinedGenerics.add(next);
// TODO Support multiple bounds
javaGenerics.add(new TargetGeneric(next.getName(), convert(next.getBounds().get(0))));
}
} else {
this.userDefinedGenerics.put(input, new HashSet<>());
// Generate generics only if there are no user defined ones
javaGenerics = convert(generics.javaGenerics.generics(input), generics.javaGenerics);
txGenerics = convert(generics.txGenerics.generics(input), generics.txGenerics);
@@ -424,7 +425,7 @@ public class ASTToTargetAST {
}
private List<TargetConstructor> convert(ClassOrInterface currentClass, Constructor input, TargetBlock fieldInitializer) {
generics = all.getFirst();
generics = all.get(0);
List<TargetConstructor> result = new ArrayList<>();
Set<List<MethodParameter>> parameterSet = new HashSet<>();
this.currentMethod = input;
@@ -468,6 +469,13 @@ public class ASTToTargetAST {
}
}
private TargetType unwrap(TargetType type) {
if (type instanceof TargetRefType ref) {
if (!ref.params().isEmpty()) return new TargetRefType(ref.name());
}
return type;
}
private TargetExpression generatePatternOverloadsRec(int offset, TargetExpression switchExpr, List<TargetLocalVar> params, List<TargetPattern> patterns, List<TargetMethod> methods, TargetType classType) {
if (methods.isEmpty()) throw new DebugException("Couldn't find a candidate for switch overloading");
if (methods.size() == 1) {
@@ -738,6 +746,11 @@ public class ASTToTargetAST {
return new TargetField(input.modifier, convert(input.getType(), generics.javaGenerics), input.getName());
}
private final Map<String, FunNGenerator.GenericParameters> usedFunN = new HashMap<>();
private final Set<Integer> usedFunNSuperTypes = new HashSet<>();
public Map<String, byte[]> auxiliaries = new HashMap<>();
public TargetType convert(RefTypeOrTPHOrWildcardOrGeneric input) {
return convert(input, generics.javaGenerics);
}
@@ -806,24 +819,20 @@ public class ASTToTargetAST {
}
public void generateFunNTypes() {
for (var entry : compiler.usedFunN.entrySet()) {
for (var entry : usedFunN.entrySet()) {
var gep = entry.getValue();
var superInterfaces = compiler.usedFunN.values().stream()
var superInterfaces = usedFunN.values().stream()
.filter(g -> !g.equals(gep))
.filter(genericParameters -> isSubtype(gep, genericParameters))
.map(FunNGenerator::getSpecializedClassName)
.toList();
var code = FunNGenerator.generateSpecializedBytecode(gep, superInterfaces);
compiler.auxiliaries.put(entry.getKey(), code);
auxiliaries.put(entry.getKey(), code);
}
}
public TargetType convert(RefTypeOrTPHOrWildcardOrGeneric input, GenerateGenerics generics) {
return convert(input, generics, compiler);
}
public static TargetType convert(RefTypeOrTPHOrWildcardOrGeneric input, GenerateGenerics generics, JavaTXCompiler compiler) {
protected TargetType convert(RefTypeOrTPHOrWildcardOrGeneric input, GenerateGenerics generics) {
return input.acceptTV(new TypeVisitor<>() {
@Override
public TargetType visit(RefType refType) {
@@ -835,31 +844,31 @@ public class ASTToTargetAST {
}
var params = refType.getParaList().stream().map(type -> {
return convert(type, generics, compiler);
return convert(type, generics);
}).toList();
if (name.matches("Fun\\d+\\$\\$")) { // TODO This seems like a bad idea
var returnType = FunNGenerator.getReturnType(params);
var className = FunNGenerator.getSpecializedClassName(FunNGenerator.getArguments(params), returnType);
if (!compiler.usedFunNSuperTypes.contains(params.size())) {
compiler.usedFunNSuperTypes.add(params.size());
if (!usedFunNSuperTypes.contains(params.size())) {
usedFunNSuperTypes.add(params.size());
var code = FunNGenerator.generateSuperBytecode(params.size() - 1, returnType != null ? 1 : 0);
var superClassName = FunNGenerator.getSuperClassName(params.size() - 1, returnType != null ? 1 : 0);
try {
compiler.classLoader.findClass(superClassName);
classLoader.findClass(superClassName);
} catch (ClassNotFoundException e) {
try {
compiler.classLoader.loadClass(superClassName, code);
classLoader.loadClass(superClassName, code);
} catch (LinkageError ignored) {}
}
compiler.auxiliaries.put(superClassName, code);
auxiliaries.put(superClassName, code);
}
FunNGenerator.GenericParameters gep = null;
if (!compiler.usedFunN.containsKey(className)) {
if (!usedFunN.containsKey(className)) {
gep = new FunNGenerator.GenericParameters(params, returnType != null ? 1 : 0);
compiler.usedFunN.put(className, gep);
usedFunN.put(className, gep);
} else {
gep = compiler.usedFunN.get(className);
gep = usedFunN.get(className);
}
return flattenFunNType(params, gep);
}
@@ -868,7 +877,7 @@ public class ASTToTargetAST {
@Override
public TargetType visit(SuperWildcardType superWildcardType) {
return new TargetSuperWildcard(convert(superWildcardType.getInnerType(), generics, compiler));
return new TargetSuperWildcard(convert(superWildcardType.getInnerType(), generics));
}
@Override
@@ -878,7 +887,7 @@ public class ASTToTargetAST {
@Override
public TargetType visit(ExtendsWildcardType extendsWildcardType) {
return new TargetExtendsWildcard(convert(extendsWildcardType.getInnerType(), generics, compiler));
return new TargetExtendsWildcard(convert(extendsWildcardType.getInnerType(), generics));
}
@Override
@@ -1,7 +1,5 @@
package de.dhbwstuttgart.target.generate;
import de.dhbwstuttgart.core.JavaTXCompiler;
import de.dhbwstuttgart.parser.JavaTXParser;
import de.dhbwstuttgart.parser.NullToken;
import de.dhbwstuttgart.syntaxtree.*;
import de.dhbwstuttgart.syntaxtree.statement.*;
@@ -20,7 +18,7 @@ import java.util.stream.Stream;
public abstract class GenerateGenerics {
private final JavaTXCompiler compiler;
private final ASTToTargetAST astToTargetAST;
public class TPH {
private final TypePlaceholder wrap;
@@ -136,8 +134,8 @@ public abstract class GenerateGenerics {
Map<TPH, RefTypeOrTPHOrWildcardOrGeneric> concreteTypes = new HashMap<>();
Map<TypePlaceholder, TypePlaceholder> equality = new HashMap<>();
GenerateGenerics(JavaTXCompiler compiler, ResultSet constraints) {
this.compiler = compiler;
GenerateGenerics(ASTToTargetAST astToTargetAST, ResultSet constraints) {
this.astToTargetAST = astToTargetAST;
for (var constraint : constraints.results) {
if (constraint instanceof PairTPHsmallerTPH p) {
System.out.println(p.left + " " + p.left.getVariance());
@@ -283,7 +281,7 @@ public abstract class GenerateGenerics {
Set<TPH> typeVariablesOfClass,
Set<Pair> result
) {
var userDefinedGenericsOfClass = owner.getUserDefinedGenerics();
var userDefinedGenericsOfClass = astToTargetAST.userDefinedGenerics.get(owner);
// Type variables with bounds that are also type variables of the method
for (var typeVariable : new HashSet<>(typeVariables)) {
@@ -331,7 +329,7 @@ public abstract class GenerateGenerics {
if (methodCall.receiver instanceof ExpressionReceiver expressionReceiver) {
if (expressionReceiver.expr instanceof This) {
var optMethod = ASTToTargetAST.findMethod(owner, methodCall.name, methodCall.signatureArguments().stream().map(x -> getTargetType(x)).toList(), GenerateGenerics.this, compiler);
var optMethod = astToTargetAST.findMethod(owner, methodCall.name, methodCall.signatureArguments().stream().map(astToTargetAST::convert).toList());
if (optMethod.isEmpty()) return;
var method2 = optMethod.get();
System.out.println("In: " + method.getName() + " Method: " + method2.getName());
@@ -1007,8 +1005,8 @@ public abstract class GenerateGenerics {
}
var type = concreteTypes.get(new TPH(tph));
if (type == null) return new TargetGenericType(tph.getName());
return ASTToTargetAST.convert(type, this, compiler);
return astToTargetAST.convert(type, this);
}
return ASTToTargetAST.convert(in, this, compiler);
return astToTargetAST.convert(in, this);
}
}
@@ -69,4 +69,8 @@ public class GenericsResult {
return this.generics.getType(tph);
return type;
}
public TargetType resolveTarget(RefTypeOrTPHOrWildcardOrGeneric type) {
return this.generics.getTargetType(type);
}
}
@@ -1,6 +1,5 @@
package de.dhbwstuttgart.target.generate;
import de.dhbwstuttgart.core.JavaTXCompiler;
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
import de.dhbwstuttgart.syntaxtree.Method;
import de.dhbwstuttgart.typeinference.result.ResultSet;
@@ -8,8 +7,8 @@ import de.dhbwstuttgart.typeinference.result.ResultSet;
import java.util.Set;
final class JavaGenerics extends GenerateGenerics {
JavaGenerics(JavaTXCompiler compiler, ResultSet constraints) {
super(compiler, constraints);
JavaGenerics(ASTToTargetAST astToTargetAST, ResultSet constraints) {
super(astToTargetAST, constraints);
}
@Override
@@ -1,6 +1,5 @@
package de.dhbwstuttgart.target.generate;
import de.dhbwstuttgart.core.JavaTXCompiler;
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
import de.dhbwstuttgart.syntaxtree.Method;
import de.dhbwstuttgart.typeinference.result.ResultSet;
@@ -8,8 +7,8 @@ import de.dhbwstuttgart.typeinference.result.ResultSet;
import java.util.Set;
final class TxGenerics extends GenerateGenerics {
TxGenerics(JavaTXCompiler compiler, ResultSet constraints) {
super(compiler, constraints);
TxGenerics(ASTToTargetAST astToTargetAST, ResultSet constraints) {
super(astToTargetAST, constraints);
}
@Override
@@ -36,30 +36,30 @@ public record TargetMethod(int access, String name, TargetBlock block, Signature
public static String getDescriptor(TargetType returnType, TargetType... parameters) {
String ret = "(";
for (var parameterType : parameters) {
ret += parameterType.toDescriptor();
ret += parameterType.toSignature();
}
ret += ")";
if (returnType == null) ret += "V";
else ret += returnType.toDescriptor();
else ret += returnType.toSignature();
return ret;
}
public static String getSignature(Set<TargetGeneric> generics, List<MethodParameter> parameters, TargetType returnType) {
String ret = "";
if (!generics.isEmpty()) {
if (generics.size() > 0) {
ret += "<";
for (var generic : generics) {
ret += generic.name() + ":" + generic.bound().toSignature();
ret += generic.name() + ":" + generic.bound().toDescriptor();
}
ret += ">";
}
ret += "(";
for (var param : parameters) {
ret += param.pattern().type().toSignature();
ret += param.pattern().type().toDescriptor();
}
ret += ")";
if (returnType == null) ret += "V";
else ret += returnType.toSignature();
else ret += returnType.toDescriptor();
return ret;
}
@@ -3,12 +3,12 @@ package de.dhbwstuttgart.target.tree.type;
public record TargetExtendsWildcard(TargetType innerType) implements TargetType {
@Override
public String toSignature() {
return "+" + innerType.toSignature();
return innerType.toSignature();
}
@Override
public String toDescriptor() {
return innerType.toDescriptor();
return "+" + innerType.toDescriptor();
}
@Override
@@ -33,4 +33,9 @@ public record TargetFunNType(String name, List<TargetType> funNParams, List<Targ
public String getInternalName() {
return name;
}
@Override
public String toSignature() {
return "L" + getInternalName() + ";";
}
}
@@ -2,12 +2,12 @@ package de.dhbwstuttgart.target.tree.type;
public record TargetGenericType(String name) implements TargetType {
@Override
public String toDescriptor() {
public String toSignature() {
return "Ljava/lang/Object;"; // TODO Use bounds for this?
}
@Override
public String toSignature() {
public String toDescriptor() {
return "T" + getInternalName() + ";";
}
@@ -12,6 +12,11 @@ public record TargetRefType(String name, List<TargetType> params) implements Tar
return this.name.replaceAll("\\.", "/");
}
@Override
public String toSignature() {
return "L" + getInternalName() + ";";
}
// Type erasure means we need to override hashCode and equals to only consider the name
@Override
public int hashCode() {
@@ -6,21 +6,16 @@ public sealed interface TargetSpecializedType extends TargetType permits TargetF
List<TargetType> params();
@Override
default String toSignature() {
default String toDescriptor() {
String ret = "L" + getInternalName();
if (!params().isEmpty()) {
if (params().size() > 0) {
ret += "<";
for (var param : params()) {
ret += param.toSignature();
ret += param.toDescriptor();
}
ret += ">";
}
ret += ";";
return ret;
}
@Override
default String toDescriptor() {
return "L" + getInternalName() + ";";
}
}
@@ -3,12 +3,12 @@ package de.dhbwstuttgart.target.tree.type;
public record TargetSuperWildcard(TargetType innerType) implements TargetType {
@Override
public String toSignature() {
return "-" + innerType.toSignature();
return innerType.toSignature();
}
@Override
public String toDescriptor() {
return innerType.toDescriptor();
return "-" + innerType.toDescriptor();
}
@Override
+1 -3
View File
@@ -63,13 +63,11 @@ public class AllgemeinTest {
//String className = "Cycle";
//String className = "TripleTest";
//String className = "WildcardList";
//String className = "List";
String className = "List";
//String className = "Box";
//String className = "GenBox";
//String className = "InnerInf";
//String className = "Foo";
//String className = "Uncurrier";
String className = "UncurrierMain";
//PL 2019-10-24: genutzt fuer unterschiedliche Tests
path = System.getProperty("user.dir")+"/resources/AllgemeinTest/" + className + ".jav";
//path = System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/Overloading_Generics.jav";
-111
View File
@@ -1,111 +0,0 @@
import static org.junit.jupiter.api.Assertions.*;
import static targetast.TestCodegen.generateClassFiles;
import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import com.google.common.collect.Lists;
import de.dhbwstuttgart.core.JavaTXCompiler;
public class KPSPresentation {
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;
public void testAlgo(String className) throws Exception {
//PL 2019-10-24: genutzt fuer unterschiedliche Tests
path = System.getProperty("user.dir")+"/resources/KPSPresentation/" + className + ".jav";
//path = System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/Overloading_Generics.jav";
//path = System.getProperty("user.dir")+"/src/test/resources/bytecode/javFiles/mathStrucInteger.jav";
//compiler = new JavaTXCompiler(Lists.newArrayList(new File(System.getProperty("user.dir")+"/src/test/resources/AllgemeinTest/Overloading_Generics.jav")));
///*
compiler = new JavaTXCompiler(
Lists.newArrayList(new File(path)),
Lists.newArrayList(new File(System.getProperty("user.dir")+"/resources/KPSPresentation/classFiles/")),
new File(System.getProperty("user.dir")+"/resources/KPSPresentation/classFiles/"));
//*/
compiler.generateBytecode();
pathToClassFile = System.getProperty("user.dir")+"/resources/KPSPresentation/classFiles/";
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
classToTest = loader.loadClass(className);
//classToTest = loader.loadClass("Overloading_Generics");
//instanceOfClass = classToTest.getDeclaredConstructor().newInstance("A");
//classToTest = loader.loadClass("Overloading_Generics1");
//instanceOfClass = classToTest.getDeclaredConstructor(Object.class).newInstance("B");
}
@Test
public void MainTest() throws Exception {
testAlgo("Main");
}
@Test
public void fstTest() throws Exception {
testAlgo("fst");
}
@Test
public void IdTest() throws Exception {
testAlgo("Id");
}
@Test
public void OLTest() throws Exception {
testAlgo("OL");
}
@Test
public void MainOLTest() throws Exception {
testAlgo("MainOL");
}
@Test
public void FacTest() throws Exception {
testAlgo("Fac");
}
@Test
public void FacultyTest() throws Exception {
testAlgo("Faculty");
}
@Test
public void MainFacultyTest() throws Exception {
testAlgo("MainFaculty");
}
@Test
public void LambdaTest() throws Exception {
testAlgo("Lambda");
}
@Test
public void applyLambdaTest() throws Exception {
testAlgo("applyLambda");
}
@Test
public void MatrixTest() throws Exception {
testAlgo("Matrix");
}
@Test
public void MatrixOPTest() throws Exception {
testAlgo("MatrixOP");
}
}
@@ -0,0 +1,51 @@
package languageServerInterfaceTest;
import de.dhbwstuttgart.core.ConsoleInterface;
import de.dhbwstuttgart.core.JavaTXCompiler;
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
import de.dhbwstuttgart.syntaxtree.visual.ASTPrinter;
import org.junit.Ignore;
import org.junit.Test;
import de.dhbwstuttgart.languageServerInterface.LanguageServerInterface;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class LangaugeServerInterfaceTest {
@Test
@Ignore
public void consoleInterfaceTest() throws IOException, ClassNotFoundException, URISyntaxException {
LanguageServerInterface languageServerInterface = new LanguageServerInterface();
var resp = languageServerInterface.getResultSetAndAbstractSyntax("/home/ruben/code/JavaCompilerCore/src/test/java/languageServerInterfaceTest/test.jav");
System.out.println("\n-----------------------------------------\n");
System.out.println(ASTPrinter.print(resp.getAst()));
System.out.println("\n-----------------------------------------\n");
LanguageServerInterface languageServerInterface2 = new LanguageServerInterface();
var ast = languageServerInterface2.getAst("/home/ruben/code/JavaCompilerCore/src/test/java/languageServerInterfaceTest/test.jav", "N");
System.out.println("\n-----------------------------------------\n");
System.out.println(ASTPrinter.print(ast));
System.out.println("\n-----------------------------------------\n");
System.out.println("");
}
@Test
@Ignore
public void testBytecodeGen() throws IOException, ClassNotFoundException, URISyntaxException {
//TODO: Ordner und Datei löschen wenn sie bereits existieren
LanguageServerInterface languageServerInterface = new LanguageServerInterface();
languageServerInterface.generateBytecode(new URI("c%3A/Users/ruben/Neuer%20Ordner%20%282%29/LSP-Vortrag/images/"));
}
}
@@ -0,0 +1,5 @@
public class t{
public mofus(){
return 1;
}
}
+2 -2
View File
@@ -66,7 +66,7 @@ public class TestCodegen {
converter.generateFunNTypes();
for (var entry : compiler.auxiliaries.entrySet()) {
for (var entry : converter.auxiliaries.entrySet()) {
writeClassFile(entry.getKey(), entry.getValue());
}
}
@@ -112,7 +112,7 @@ public class TestCodegen {
converter.generateFunNTypes();
for (var entry : compiler.auxiliaries.entrySet()) {
for (var entry : converter.auxiliaries.entrySet()) {
writeClassFile(entry.getKey(), entry.getValue());
}