Compare commits

..
Author SHA1 Message Date
dholle c19d4d74d5 Some generated test validation, tphs needs to be reset for this to work
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 2m25s
2026-11-10 13:56:38 +01:00
dholle a5c8d93e4c Failing test
SonarQube Scan / SonarQube Trigger (push) Failing after 1m28s
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 1m32s
2026-10-01 10:39:29 +02:00
dholle e70f071c63 Fix tests
SonarQube Scan / SonarQube Trigger (push) Failing after 1m28s
2026-09-30 19:22:21 +02:00
dholle f66499b4fe Revert "Update"
SonarQube Scan / SonarQube Trigger (push) Failing after 3m27s
This reverts commit eb05d22735.
2026-09-29 18:01:44 +02:00
6 changed files with 230 additions and 21 deletions

No files matched your search

+3 -3
View File
@@ -2,7 +2,7 @@ sealed interface Interface permits A, B {}
public record A() implements Interface {}
public record B() implements Interface {}
public interface Matcher {
default match(A()@a) { return 0; }
default match(B()@b) { return 1; }
public class Matcher {
match(A()@a) { return 0; }
match(B()@b) { return 1; }
}
@@ -3,7 +3,7 @@ import java.lang.Integer;
import Matcher;
import Interface;
public class M implements Matcher {}
public class M extends Matcher {}
public class PatternMatchingInterface {
public static match(matcher, v) {
@@ -618,7 +618,7 @@ public class ASTToTargetAST {
}
}
private static TargetExpression generateCall(TargetMethod method, List<TargetLocalVar> params, TargetType classType, boolean isInterface) {
private static TargetExpression generateCall(TargetMethod method, List<TargetLocalVar> params, TargetType classType) {
var mParams = new ArrayList<TargetExpression>();
for (var i = 0; i < params.size(); i++) {
var tpe = method.signature().parameters().get(i).pattern().type();
@@ -626,11 +626,11 @@ public class ASTToTargetAST {
}
TargetExpression caseBody = new TargetMethodCall(
method.signature().returnType(),
method.isStatic() ? new TargetClassName(classType) : new TargetThis(classType),
new TargetThis(classType),
mParams,
classType,
method.name(),
method.isStatic(), isInterface, method.isPrivate()
false, false, method.isPrivate()
);
if (method.signature().returnType() != null) {
caseBody = new TargetReturn(caseBody);
@@ -638,11 +638,11 @@ public class ASTToTargetAST {
return caseBody;
}
private TargetExpression generatePatternOverloadsRec(int offset, TargetExpression switchExpr, List<TargetLocalVar> params, List<TargetPattern> patterns, List<TargetMethod> methods, TargetType classType, boolean isInterface) {
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) {
var method = methods.getFirst();
return generateCall(method, params, classType, isInterface);
return generateCall(method, params, classType);
}
var cases = new ArrayList<TargetSwitch.Case>();
@@ -691,11 +691,11 @@ public class ASTToTargetAST {
}).toList();
if (candidates.isEmpty()) {
var body = new TargetBlock(List.of(generateCall(method, params, classType, isInterface)));
var body = new TargetBlock(List.of(generateCall(method, params, classType)));
cases.add(new TargetSwitch.Case(List.of(lastPattern), body));
} else {
//candidates.forEach(m -> Target.logger.info(m.getSignature()));
var caseBody = generatePatternOverloadsRec(offset + 1, expr, params, patternsRec, candidates, classType, isInterface);
var caseBody = generatePatternOverloadsRec(offset + 1, expr, params, patternsRec, candidates, classType);
var body = new TargetBlock(List.of(caseBody));
var case_ = new TargetSwitch.Case(List.of(lastPattern), body);
@@ -787,7 +787,7 @@ public class ASTToTargetAST {
var parameters = resParams.stream().map( p -> new TargetLocalVar(p.pattern().type(), p.pattern().name())).toList();
var classType = new TargetRefType(clazz.getClassName().toString());
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(resParams.getFirst().pattern().type(), resParams.getFirst().pattern().name()), parameters, List.of(), methods, classType, clazz.isInterface());
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(resParams.getFirst().pattern().type(), resParams.getFirst().pattern().name()), parameters, List.of(), methods, classType);
var block = new TargetBlock(List.of(stmt));
var generics = new HashSet<>(firstMethod.signature().generics());
@@ -870,7 +870,7 @@ public class ASTToTargetAST {
// Generate dispatch method
var classType = new TargetRefType(clazz.getClassName().toString());
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(signatureParams.getFirst().pattern().type(), signatureParams.getFirst().pattern().name()), parameters, List.of(), res, classType, clazz.isInterface());
var stmt = generatePatternOverloadsRec(0, new TargetLocalVar(signatureParams.getFirst().pattern().type(), signatureParams.getFirst().pattern().name()), parameters, List.of(), res, classType);
var block = new TargetBlock(List.of(stmt));
var bridgeMethod = new TargetMethod(firstMethod.access(), firstMethod.name(), block, group.signature.java, group.signature.tx, firstMethod.base(), null);
@@ -256,9 +256,9 @@ public class StatementToTargetExpression implements ASTVisitor {
foundMethod = findMethod(receiverName, methodCall.name, signature, converter.compiler).orElseThrow(
() -> new DebugException("Method " + methodCall.name + " not found (" + finalSignature + ") on class " + receiverName)
);
if (foundMethod != null) {
signature = foundMethod.getParameterList().getFormalparalist().stream().map(pattern -> converter.convert(pattern.getType(), generics)).toList();
}
//if (foundMethod != null) {
// signature = foundMethod.getParameterList().getFormalparalist().stream().map(pattern -> converter.convert(pattern.getType(), generics)).toList();
//}
}
if (!isFunNType) {
+212 -5
View File
@@ -41,6 +41,16 @@ public class TestComplete {
var m = applyLambda.getDeclaredMethod("m");
var result = m.invoke(instance);
assertEquals(Object.class, m.getReturnType());
assertArrayEquals(new Class<?>[0], m.getParameterTypes());
var lambda = applyLambda.getDeclaredMethod("lambda$0", Object.class);
assertEquals(Object.class, lambda.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
assertEquals(2, applyLambda.getDeclaredMethods().length);
var apply = classFiles.get("Apply");
assertEquals(0, apply.getDeclaredMethods().length);
assertEquals(result.getClass(), classFiles.get("Apply"));
}
@@ -52,6 +62,23 @@ public class TestComplete {
var m2 = binaryInMeth.getDeclaredMethod("m2", Integer.class, Integer.class);
var m3 = binaryInMeth.getDeclaredMethod("m3", Integer.class);
var mInteger = binaryInMeth.getDeclaredMethod("m", Integer.class);
var mDouble = binaryInMeth.getDeclaredMethod("m", Double.class);
var m2Double = binaryInMeth.getDeclaredMethod("m2", Double.class, Double.class);
var m3Double = binaryInMeth.getDeclaredMethod("m3", Double.class);
assertEquals(Integer.class, m2.getReturnType());
assertArrayEquals(new Class<?>[]{Integer.class, Integer.class}, m2.getParameterTypes());
assertEquals(Integer.class, m3.getReturnType());
assertArrayEquals(new Class<?>[]{Integer.class}, m3.getParameterTypes());
assertEquals(Integer.class, mInteger.getReturnType());
assertArrayEquals(new Class<?>[]{Integer.class}, mInteger.getParameterTypes());
assertEquals(Double.class, mDouble.getReturnType());
assertArrayEquals(new Class<?>[]{Double.class}, mDouble.getParameterTypes());
assertEquals(Double.class, m2Double.getReturnType());
assertArrayEquals(new Class<?>[]{Double.class, Double.class}, m2Double.getParameterTypes());
assertEquals(Double.class, m3Double.getReturnType());
assertArrayEquals(new Class<?>[]{Double.class}, m3Double.getParameterTypes());
assertEquals(6, m2.invoke(instance, 2, 3));
assertEquals(4, m3.invoke(instance, 2));
@@ -60,7 +87,24 @@ public class TestComplete {
@Test
public void classGenLamTest() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "ClassGenLam.jav");
classFiles.get("ClassGenLam").getDeclaredConstructor().newInstance();
var classGenLam = classFiles.get("ClassGenLam");
classGenLam.getDeclaredConstructor().newInstance();
assertEquals(1, classGenLam.getTypeParameters().length);
var typeParameter = classGenLam.getTypeParameters()[0];
var lam = classGenLam.getDeclaredField("lam");
assertEquals("lam", lam.getName());
assertEquals("Fun1$$LTPH$_$LTPH$_$", lam.getType().getName());
assertTrue(lam.getGenericType() instanceof ParameterizedType);
var lamType = (ParameterizedType) lam.getGenericType();
assertEquals(2, lamType.getActualTypeArguments().length);
assertEquals(typeParameter, lamType.getActualTypeArguments()[0]);
assertEquals(typeParameter, lamType.getActualTypeArguments()[1]);
var lambda = classGenLam.getDeclaredMethod("lambda$0", Object.class);
assertEquals(Object.class, lambda.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
}
@Test
@@ -70,6 +114,13 @@ public class TestComplete {
var instance = fac.getDeclaredConstructor().newInstance();
var getFac = fac.getDeclaredMethod("getFac", Integer.class);
var getFacDouble = fac.getDeclaredMethod("getFac", Double.class);
assertEquals(0, fac.getDeclaredFields().length);
assertEquals(Double.class, getFac.getReturnType());
assertArrayEquals(new Class<?>[]{Integer.class}, getFac.getParameterTypes());
assertEquals(Double.class, getFacDouble.getReturnType());
assertArrayEquals(new Class<?>[]{Double.class}, getFacDouble.getParameterTypes());
// assertEquals(6, getFac.invoke(instance, 3)); TODO This could be either an Integer or a Double so this simple test fails
}
@@ -83,6 +134,21 @@ public class TestComplete {
var instance = constructor.newInstance();
var getFact = fac.getDeclaredMethod("getFact", Integer.class);
var lambda = fac.getDeclaredMethod("lambda$0", Object.class);
var fact = fac.getDeclaredField("fact");
assertEquals(1, fac.getDeclaredFields().length);
assertEquals("Fun1$$Ljava$lang$Integer$_$Ljava$lang$Integer$_$", fact.getType().getName());
assertTrue(fact.getGenericType() instanceof ParameterizedType);
var factType = (ParameterizedType) fact.getGenericType();
assertEquals(2, factType.getActualTypeArguments().length);
assertEquals(Integer.class, factType.getActualTypeArguments()[0]);
assertEquals(Integer.class, factType.getActualTypeArguments()[1]);
assertEquals(Integer.class, getFact.getReturnType());
assertArrayEquals(new Class<?>[]{Integer.class}, getFact.getParameterTypes());
assertEquals(Integer.class, lambda.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
assertEquals(6, getFact.invoke(instance, 3));
}
@@ -91,7 +157,14 @@ public class TestComplete {
var classFiles = generateClassFiles(createClassLoader(), "Field.jav");
var field = classFiles.get("Field");
var instance = field.getDeclaredConstructor().newInstance();
var x = field.getDeclaredField("x");
var m = field.getDeclaredMethod("m");
assertEquals(1, field.getFields().length);
assertEquals(Integer.class, x.getType());
assertEquals(Integer.class, x.getGenericType());
assertEquals(Integer.class, m.getReturnType());
assertArrayEquals(new Class<?>[0], m.getParameterTypes());
}
@Test
@@ -105,6 +178,24 @@ public class TestComplete {
m2.invoke(instance, 1);
var m = fieldtph2.getDeclaredMethod("m", Object.class);
var typeParameters = fieldtph2.getTypeParameters();
assertEquals(2, typeParameters.length);
var p = typeParameters[0];
var t = typeParameters[1];
assertEquals("P", p.getName());
assertEquals("T", t.getName());
assertEquals(p, t.getBounds()[0]);
assertEquals(Object.class, a.getType());
assertEquals(t, a.getGenericType());
assertEquals(Object.class, m.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, m.getParameterTypes());
assertEquals(p, m.getGenericReturnType());
assertEquals(p, m.getGenericParameterTypes()[0]);
assertEquals(void.class, m2.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, m2.getParameterTypes());
assertEquals(t, m2.getGenericParameterTypes()[0]);
assertEquals(1, m.invoke(instance, 1));
}
@@ -117,6 +208,35 @@ public class TestComplete {
var instance = ctor.newInstance("C");
var a = fieldTphConsMeth.getDeclaredField("a");
var id = fieldTphConsMeth.getDeclaredMethod("id", Object.class);
var typeParameter = fieldTphConsMeth.getTypeParameters()[0];
var setA = fieldTphConsMeth.getDeclaredMethod("setA", Object.class);
var m = fieldTphConsMeth.getDeclaredMethod("m", Object.class, Object.class);
assertEquals(1, fieldTphConsMeth.getTypeParameters().length);
assertEquals("AAB", typeParameter.getName());
assertEquals(Object.class, a.getType());
assertEquals(typeParameter, a.getGenericType());
assertEquals(Object.class, ctor.getParameterTypes()[0]);
assertEquals(1, ctor.getTypeParameters().length);
assertEquals(typeParameter, ctor.getTypeParameters()[0].getBounds()[0]);
assertEquals(ctor.getTypeParameters()[0], ctor.getGenericParameterTypes()[0]);
assertEquals(Object.class, setA.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, setA.getParameterTypes());
assertEquals(typeParameter, setA.getGenericReturnType());
assertEquals(setA.getTypeParameters()[0], setA.getGenericParameterTypes()[0]);
assertEquals(typeParameter, setA.getTypeParameters()[0].getBounds()[0]);
assertEquals(Object.class, id.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, id.getParameterTypes());
assertEquals(typeParameter, id.getGenericReturnType());
assertEquals(typeParameter, id.getGenericParameterTypes()[0]);
assertEquals(void.class, m.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class, Object.class}, m.getParameterTypes());
assertEquals(3, m.getTypeParameters().length);
assertEquals(Object.class, m.getTypeParameters()[0].getBounds()[0]);
assertEquals(m.getTypeParameters()[2], m.getTypeParameters()[1].getBounds()[0]);
assertEquals(m.getTypeParameters()[0], m.getTypeParameters()[2].getBounds()[0]);
assertEquals(m.getTypeParameters()[0], m.getGenericParameterTypes()[0]);
assertEquals(m.getTypeParameters()[1], m.getGenericParameterTypes()[1]);
assertEquals(42, id.invoke(instance, 42));
assertEquals("C", a.get(instance));
@@ -132,9 +252,39 @@ public class TestComplete {
var instance2 = ctor.newInstance("C", 42, false);
var m = fieldTphMMeth.getDeclaredMethod("m", Object.class, Object.class, Boolean.class);
var m2 = fieldTphMMeth.getDeclaredMethod("m2", Object.class);
var m3 = fieldTphMMeth.getDeclaredMethod("m3", Object.class);
var a = fieldTphMMeth.getDeclaredField("a");
var classTypeParameter = fieldTphMMeth.getTypeParameters()[0];
assertEquals(1, fieldTphMMeth.getTypeParameters().length);
assertEquals("AF", classTypeParameter.getName());
assertEquals(Object.class, a.getType());
assertEquals(classTypeParameter, a.getGenericType());
assertArrayEquals(new Class<?>[]{Object.class, Object.class, Boolean.class}, ctor.getParameterTypes());
assertEquals(2, ctor.getTypeParameters().length);
assertEquals(classTypeParameter, ctor.getTypeParameters()[0].getBounds()[0]);
assertEquals(classTypeParameter, ctor.getTypeParameters()[1].getBounds()[0]);
assertEquals(Object.class, m.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class, Object.class, Boolean.class}, m.getParameterTypes());
assertEquals(2, m.getTypeParameters().length);
assertEquals(Object.class, m.getTypeParameters()[0].getBounds()[0]);
assertEquals(m.getTypeParameters()[0], m.getTypeParameters()[1].getBounds()[0]);
assertEquals(m.getTypeParameters()[0], m.getGenericReturnType());
assertEquals(m.getTypeParameters()[0], m.getGenericParameterTypes()[0]);
assertEquals(m.getTypeParameters()[1], m.getGenericParameterTypes()[1]);
assertEquals(void.class, m2.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, m2.getParameterTypes());
assertEquals(classTypeParameter, m2.getTypeParameters()[0].getBounds()[0]);
assertEquals(m2.getTypeParameters()[0], m2.getGenericParameterTypes()[0]);
assertEquals(Object.class, m3.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, m3.getParameterTypes());
assertEquals(classTypeParameter, m3.getTypeParameters()[0].getBounds()[0]);
assertEquals(m3.getTypeParameters()[0], m3.getGenericReturnType());
assertEquals(m3.getTypeParameters()[0], m3.getGenericParameterTypes()[0]);
assertEquals(42, m.invoke(instance1, "C", 42, false));
var a = fieldTphMMeth.getDeclaredField("a");
assertEquals("C", a.get(instance1));
assertEquals(42, a.get(instance2));
}
@@ -142,19 +292,74 @@ public class TestComplete {
@Test
public void genTest() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "Gen.jav");
var gen = classFiles.get("Gen");
var m = gen.getDeclaredMethod("m", Vector.class);
assertEquals(0, gen.getDeclaredFields().length);
assertEquals(Vector.class, m.getReturnType());
assertArrayEquals(new Class<?>[]{Vector.class}, m.getParameterTypes());
assertTrue(m.getGenericReturnType() instanceof ParameterizedType);
var returnType = (ParameterizedType) m.getGenericReturnType();
assertEquals(Vector.class, returnType.getRawType());
assertArrayEquals(new Type[]{Integer.class}, returnType.getActualTypeArguments());
assertTrue(m.getGenericParameterTypes()[0] instanceof ParameterizedType);
var parameterType = (ParameterizedType) m.getGenericParameterTypes()[0];
assertEquals(Vector.class, parameterType.getRawType());
assertArrayEquals(new Type[]{Integer.class}, parameterType.getActualTypeArguments());
}
@Test
public void idTest() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "Id.jav");
var instance = classFiles.get("Id").getDeclaredConstructor().newInstance();
var id = classFiles.get("Id");
id.getDeclaredConstructor().newInstance();
assertEquals(1, id.getTypeParameters().length);
assertEquals("FAU", id.getTypeParameters()[0].getName());
var id2 = id.getDeclaredField("id2");
assertEquals("Fun1$$LTPH$_$LTPH$_$", id2.getType().getName());
var lambda = id.getDeclaredMethod("lambda$0", Object.class);
assertEquals(Object.class, lambda.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
var id3 = id.getDeclaredMethod("id3", Object.class);
assertEquals(Object.class, id3.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class}, id3.getParameterTypes());
assertEquals(1, id3.getTypeParameters().length);
assertEquals("V", id3.getTypeParameters()[0].getName());
}
@Test
public void infTest() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "Inf.jav");
var instance = classFiles.get("Inf").getDeclaredConstructor().newInstance();
// TODO check generics
var inf = classFiles.get("Inf");
inf.getDeclaredConstructor().newInstance();
var m = inf.getDeclaredMethod("m", Object.class, Object.class, Object.class);
assertEquals(0, inf.getDeclaredFields().length);
assertEquals(void.class, m.getReturnType());
assertArrayEquals(new Class<?>[]{Object.class, Object.class, Object.class}, m.getParameterTypes());
assertEquals(5, m.getTypeParameters().length);
var zn = m.getTypeParameters()[0];
var zo = m.getTypeParameters()[1];
var q = m.getTypeParameters()[2];
var o = m.getTypeParameters()[3];
var zp = m.getTypeParameters()[4];
assertEquals("ZN", zn.getName());
assertEquals("ZO", zo.getName());
assertEquals("Q", q.getName());
assertEquals("O", o.getName());
assertEquals("ZP", zp.getName());
assertEquals(zo, zn.getBounds()[0]);
assertEquals(zp, zo.getBounds()[0]);
assertEquals(zn, q.getBounds()[0]);
assertEquals(zn, o.getBounds()[0]);
assertEquals(Object.class, zp.getBounds()[0]);
assertEquals(o, m.getGenericParameterTypes()[0]);
assertEquals(zn, m.getGenericParameterTypes()[1]);
assertEquals(q, m.getGenericParameterTypes()[2]);
}
@Test
@@ -1083,6 +1288,7 @@ public class TestComplete {
@Test
public void testPatternMatchingInterface() throws Exception {
ConsoleInterface.logLevel = LogLevel.INFO;
var classFiles = generateClassFiles(createClassLoader(), false, "Matcher.jav", "PatternMatchingInterface.jav");
var Intf = classFiles.get("Interface");
var clazz = classFiles.get("PatternMatchingInterface");
@@ -1699,6 +1905,7 @@ public class TestComplete {
@Test
public void testBug406() throws Exception {
ConsoleInterface.logLevel = LogLevel.INFO;
var classFiles = generateClassFiles(createClassLoader(), "Bug406.jav");
var clazz = classFiles.get("Bug406");
clazz.getDeclaredMethod("main", List.class).invoke(null, List.of());
+2
View File
@@ -5,6 +5,7 @@ import de.dhbwstuttgart.bytecode.Codegen;
import de.dhbwstuttgart.environment.DirectoryClassLoader;
import de.dhbwstuttgart.environment.IByteArrayClassLoader;
import de.dhbwstuttgart.parser.scope.JavaClassName;
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
import de.dhbwstuttgart.syntaxtree.visual.ASTPrinter;
import de.dhbwstuttgart.target.generate.ASTToTargetAST;
import de.dhbwstuttgart.target.tree.MethodParameter;
@@ -16,6 +17,7 @@ import de.dhbwstuttgart.target.tree.type.TargetFunNType;
import de.dhbwstuttgart.target.tree.type.TargetRefType;
import de.dhbwstuttgart.target.tree.type.TargetType;
import de.dhbwstuttgart.typeinference.result.ResultSet;
import de.dhbwstuttgart.typeinference.unify.PlaceholderRegistry;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;