Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f7e4fc1e4 | |||
| 433dcf83c2 |
@@ -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) {
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user