Compare commits

...

2 Commits

Author SHA1 Message Date
dholle 2f7e4fc1e4 WIP
SonarQube Scan / SonarQube Trigger (push) Failing after 1m51s
2026-04-30 14:28:35 +02:00
dholle 433dcf83c2 Small bug fix
SonarQube Scan / SonarQube Trigger (push) Failing after 2m33s
2026-04-29 07:54:47 +02:00
13 changed files with 86 additions and 31 deletions
+10
View File
@@ -0,0 +1,10 @@
import java.lang.String;
public class Bug389 {
public swap(f) {
return x -> y -> f.apply(y).apply(x);
}
public swap(f) {
return x -> y -> z -> f.apply(z).apply(x).apply(y);
}
}
@@ -0,0 +1,12 @@
import Bug389;
import java.util.List;
import java.lang.String;
import java.lang.Integer;
public class Bug389Main {
public static main(args) {
var func = x -> y -> z -> x + y + z;
var swap = new Bug389();
swap.swap(func).apply(1).apply(2).apply(3);
}
}
@@ -1,14 +1,13 @@
sealed interface List<T> permits Cons, Empty {}
public record Cons<T>(T a, List<T> l) implements List<T> {}
public record Empty<T>() implements List<T> {}
public record Tuple<T1, T2>(T1 a, T2 b) {}
import Cons;
import Empty;
import List;
import Pair;
public class PatternMatching {
public zip(Cons(x, xs), Cons(y, ys)) {
return new Cons(new Tuple(x, y), zip(xs, ys));
return new Cons<>(new Pair<>(x, y), zip(xs, ys));
}
public zip(Empty x, Empty y) { return new Empty(); }
public zip(Empty x, Empty y) { return new Empty<>(); }
/*public zip(Empty x, Cons y) { return new Empty(); }
public zip(Cons x, Empty y) { return new Empty(); }
@@ -2,18 +2,24 @@ import java.lang.Object;
import List;
import Cons;
import Empty;
import Tuple;
import Pair;
public class PatternMatchingJava {
public zip(a, b) {
public <A, B> Cons<Pair<A, B>> zip(Cons<A> a, Cons<B> b) {
switch (a) {
case Cons(x, Cons xs) -> {
switch (b) {
case Cons(y, Cons ys) -> { return new Cons<>(new Tuple<>(x, y), zip(xs, ys)); }
case Cons(y, Empty()) -> { return new Empty<>(); }
case Cons(y, Cons ys) -> { return new Cons<>(new Pair<>(x, y), zip(xs, ys)); }
};
}
case Cons(x, Empty xs) -> {
switch (b) {
case Cons(y, Empty ys) -> { return new Cons<>(new Pair<>(x, y), zip(xs, ys)); }
};
}
case Cons(x, Empty()) -> { return new Empty<>(); }
};
}
public <A, B> Empty<Pair<A, B>> zip(Empty<A> a, Empty<B>) {
return new Empty<>();
}
}
@@ -1,5 +1,5 @@
sealed interface List<T> permits Cons, Empty {}
public sealed interface List<T> permits Cons, Empty {}
public record Cons<T>(T a, List<T> l) implements List<T> {}
public record Empty<T>() implements List<T> {}
public record Tuple<T1, T2>(T1 a, T2 b) {}
public record Pair<T1, T2>(T1 a, T2 b) {}
@@ -4,6 +4,7 @@ import de.dhbwstuttgart.core.JavaTXCompiler;
import de.dhbwstuttgart.exceptions.NotImplementedException;
import de.dhbwstuttgart.parser.scope.JavaClassName;
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
import de.dhbwstuttgart.syntaxtree.Pattern;
import de.dhbwstuttgart.target.generate.ASTToTargetAST;
import de.dhbwstuttgart.target.tree.*;
import de.dhbwstuttgart.target.tree.expression.*;
@@ -700,7 +700,7 @@ public class StatementGenerator {
case ConditionalassignexpressionContext condassign:
return convert(condassign);
default:
throw new NotImplementedException();
throw new NotImplementedException(expression.getClass().toString());
}
}
@@ -64,6 +64,8 @@ public class TypeGenerator {
switch (typeContext.primitiveType().getText()) {
case "boolean":
return new RefType(ASTFactory.createClass(Boolean.class).getClassName(), typeContext.getStart());
case "char":
return new RefType(ASTFactory.createClass(Character.class).getClassName(), typeContext.getStart());
case "int":
return new RefType(ASTFactory.createClass(Integer.class).getClassName(), typeContext.getStart());
case "double":
@@ -71,7 +73,7 @@ public class TypeGenerator {
case "float":
return new RefType(ASTFactory.createClass(Float.class).getClassName(), typeContext.getStart());
default:
throw new NotImplementedException();
throw new NotImplementedException(typeContext.primitiveType().getText());
}
} else if (!typeContext.LBRACK().isEmpty()) { // ArrayType über eckige Klammer prüfen
// JavaTXParser.logger.info(unannTypeContext.getText());
@@ -229,9 +229,6 @@ public class ASTFactory {
public static Method createMethod(java.lang.reflect.Method jreMethod, String signature, java.lang.Class inClass, Boolean isInherited, Boolean isImplemented) {
String name = jreMethod.getName();
RefTypeOrTPHOrWildcardOrGeneric returnType;
if (inClass.getName().equals("Swap")){
System.out.println();
}
Type jreRetType;
if (jreMethod.getGenericReturnType() != null) {
jreRetType = jreMethod.getGenericReturnType();
@@ -28,6 +28,7 @@ public class MethodCall extends Statement
//sind Tphs, repraesentieren im Resultset die Signatur der aufgerufenen Methoden, letztes Element ist der Returntyp
public final ArrayList<TypePlaceholder> signature;
public int modifiers;
public MethodCall(RefTypeOrTPHOrWildcardOrGeneric retType, Receiver receiver, String methodName, ArgumentList argumentList,
RefTypeOrTPHOrWildcardOrGeneric receiverType, ArrayList<TypePlaceholder> signature, Token offset){
@@ -65,6 +65,10 @@ public class ASTToTargetAST {
public Generics(JavaTXCompiler compiler, ResultSet set) {
this(new JavaGenerics(compiler, set), new TxGenerics(compiler, set));
}
public static Generics nullGenerics() {
return new Generics(null, new ResultSet(Set.of()));
}
}
public IByteArrayClassLoader classLoader;
@@ -94,10 +98,15 @@ public class ASTToTargetAST {
tphsInMethods.put(currentMethod, set);
}
public static Optional<Method> findMethod(ClassOrInterface owner, String name, List<TargetType> argumentList, JavaTXCompiler compiler) {
return findMethod(owner, name, argumentList, Generics.nullGenerics().javaGenerics(), compiler);
}
public static Optional<Method> findMethod(ClassOrInterface owner, String name, List<TargetType> argumentList, IGenerics 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().getFormalparalist().stream().map(p -> generics.getTargetType(p.getType())).toList(), argumentList)).findFirst();
if (owner.getClassName().toString().equals("java.lang.Object")) break;
owner = compiler.getClass(owner.getSuperClass().getName());
}
@@ -105,16 +114,16 @@ public class ASTToTargetAST {
}
Optional<Constructor> findConstructor(ClassOrInterface owner, List<TargetType> argumentList, IGenerics generics) {
return owner.getConstructors().stream().filter(c -> parameterEquals(c.getParameterList(), argumentList, generics)).findFirst();
return owner.getConstructors().stream().filter(c ->
parameterEquals(c.getParameterList().getFormalparalist().stream().map(p -> generics.getTargetType(p.getType())).toList(), argumentList)).findFirst();
}
static boolean parameterEquals(ParameterList parameterList, List<TargetType> arguments, IGenerics generics) {
var pars = parameterList.getFormalparalist();
static boolean parameterEquals(List<TargetType> pars, List<TargetType> arguments) {
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 = pars.get(i);
var type2 = arguments.get(i);
if (type1 instanceof TargetGenericType)
return true;
@@ -380,9 +389,15 @@ public class ASTToTargetAST {
else return new TargetClass(input.getModifiers(), input.getClassName(), convert(input.getSuperClass(), generics.javaGenerics, compiler), javaGenerics, txGenerics, superInterfaces, constructors, staticConstructor, fields, methods);
}
@Deprecated
public List<MethodParameter> convert(ParameterList input) {
return convert(input, all.getFirst().javaGenerics);
var res = new ArrayList<MethodParameter>();
for (var i = 0; i < input.getFormalparalist().size(); i++) {
var param = input.getFormalparalist().get(i);
var pattern = (TargetPattern) convert(param, Generics.nullGenerics().javaGenerics);
if (pattern instanceof TargetComplexPattern) pattern = pattern.withName("__var" + i);
res.add(new MethodParameter(pattern));
}
return res;
}
public List<MethodParameter> convert(ParameterList input, IGenerics generics) {
@@ -701,6 +716,7 @@ public class ASTToTargetAST {
var txMethodGenerics = collectMethodGenerics(currentClass, generics.txGenerics(), txGenerics, method);
var javaSignature = new TargetMethod.Signature(javaMethodGenerics, params, returnType);
System.out.println(javaSignature.getDescriptor());
var txSignature = new TargetMethod.Signature(txMethodGenerics, txParams, convert(method.getReturnType(), generics.txGenerics, compiler));
signatures.add(new Signature(javaSignature, txSignature, generics));
@@ -754,7 +770,7 @@ public class ASTToTargetAST {
for (var i = 0; i < tspec.params().size(); i++) {
var param = tspec.params().get(i);
if (param instanceof TargetSpecializedType fn) {
collectArguments(tspec, newParams);
collectArguments(fn, newParams);
} else {
newParams.add(param);
}
@@ -216,6 +216,10 @@ public class StatementToTargetExpression implements ASTVisitor {
return ASTToTargetAST.findMethod(converter.compiler.getClass(className), name, args, generics, compiler);
}
Optional<Method> findMethod(JavaClassName className, String name, List<TargetType> args, JavaTXCompiler compiler) {
return ASTToTargetAST.findMethod(converter.compiler.getClass(className), name, args, compiler);
}
@Override
public void visit(MethodCall methodCall) {
var receiverType = converter.convert(methodCall.receiver.getType(), generics);
@@ -246,7 +250,7 @@ public class StatementToTargetExpression implements ASTVisitor {
} else if (!isFunNType) {
receiverClass = converter.compiler.getClass(receiverName);
if (receiverClass == null) throw new DebugException("Class " + receiverName + " does not exist!");
foundMethod = findMethod(receiverName, methodCall.name, signature, generics, converter.compiler).orElseThrow();
foundMethod = findMethod(receiverName, methodCall.name, signature, converter.compiler).orElseThrow();
}
if (!isFunNType) {
+8 -1
View File
@@ -959,6 +959,7 @@ public class TestComplete {
@Test
public void testPatternMatchingZip() throws Exception {
ConsoleInterface.logLevel = Logger.LogLevel.DEBUG;
var classFiles = generateClassFiles(createClassLoader(), "PatternMatching.jav");
var clazz = classFiles.get("PatternMatching");
var instance = clazz.getDeclaredConstructor().newInstance();
@@ -966,7 +967,6 @@ public class TestComplete {
@Test
public void testPatternMatchingZipJava() throws Exception {
ConsoleInterface.logLevel = Logger.LogLevel.DEBUG;
var classFiles = generateClassFiles(createClassLoader(), false, "PatternMatchingJava.jav", "PatternMatchingJava2.jav");
var clazz = classFiles.get("PatternMatchingJava");
var instance = clazz.getDeclaredConstructor().newInstance();
@@ -1536,6 +1536,13 @@ public class TestComplete {
// TODO This logs output that we should validate
}
@Test
public void testBug389() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), false, "Bug389.jav", "Bug389Main.jav");
var clazz = classFiles.get("Bug389Main");
clazz.getDeclaredMethod("main", List.class).invoke(null, List.of());
}
@Test
public void testBug390() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "Bug390.jav");