Compare commits

...
10 Commits
Author SHA1 Message Date
pl@gohorb.ba-horb.de 3b0c419a1a Merge branch 'master' of https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 1m23s
SonarQube Scan / SonarQube Trigger (pull_request) Failing after 1m40s
2026-11-12 10:51:05 +01:00
pl@gohorb.ba-horb.de 67d9be8878 modified: resources/bytecode/javFiles/LazyList.jav
modified:   resources/bytecode/javFiles/Primzahlen.jav
	modified:   src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java
	modified:   src/main/java/de/dhbwstuttgart/syntaxtree/statement/Block.java
	modified:   src/main/java/de/dhbwstuttgart/syntaxtree/visual/OutputGenerator.java
	modified:   src/main/java/de/dhbwstuttgart/typeinference/unify/distributeVariance.java
	modified:   src/test/java/TestComplete.java
2026-11-12 10:49:35 +01:00
dholle e1b9766a53 Merge pull request 'Fix various issues with static methods, fixes #416' (#433) from fix-416 into master
SonarQube Scan / SonarQube Trigger (push) Successful in 2m38s
Reviewed-on: #433
2026-11-11 16:51:45 +00:00
dholle 35e8dda6bd Fix various issues with static methods, fixes #416
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 2m7s
SonarQube Scan / SonarQube Trigger (pull_request) Canceled after 16m22s
2026-11-11 17:32:58 +01:00
dholle bf22cf246e Merge pull request 'Fix #411 by setting functional interface property properly' (#431) from fix-411 into master
SonarQube Scan / SonarQube Trigger (push) Successful in 3m27s
Reviewed-on: #431
2026-11-11 15:43:24 +00:00
dholle 034cdf2e0b Merge branch 'master' into fix-411
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 1m34s
SonarQube Scan / SonarQube Trigger (pull_request) Successful in 3m27s
2026-11-11 16:37:23 +01:00
dholle 95ee84cb99 Fix #411 by setting functional interface property properly
SonarQube Scan / SonarQube Trigger (pull_request) Successful in 2m34s
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 1m31s
2026-11-11 16:29:30 +01:00
dholle 3fc098b155 Merge pull request 'Fix #412 by handling default correctly' (#430) from fix-412 into master
SonarQube Scan / SonarQube Trigger (push) Successful in 2m29s
Reviewed-on: #430
2026-11-11 14:20:19 +00:00
pl@gohorb.ba-horb.de 272d9fa586 Merge branch 'master' of https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore 2026-09-25 15:46:44 +02:00
pl@gohorb.ba-horb.de 32a01c500a DEBUG 2026-09-25 15:46:27 +02:00
13 changed files with 74 additions and 17 deletions

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
import java.lang.Integer;
public interface Bug411 {
default f() {
return 1;
}
}
+9
View File
@@ -0,0 +1,9 @@
import java.lang.Integer;
sealed interface L<T> permits Cons, Nil {}
public record Cons<T>(T head, L<T> tail) implements L<T> {}
public record Nil<T>() implements L<T> {}
public class Bug416 {
public static <T> len(Cons(h, t)) { return 1 + len(t); }
public static <T> len(Nil()) { return 0; }
}
+7 -4
View File
@@ -13,15 +13,15 @@ public sealed interface LazyList permits Empty, Cons {
public Integer fst(); public Integer fst();
public LazyList rest(); public LazyList rest();
} }
/*
public class Filter { public class Filter {
/*public LazyList filter(Fun1$$<Integer, Boolean> p, LazyList l) { public LazyList filter(Fun1$$<Integer, Boolean> p, LazyList l) {
return switch(l) { return switch(l) {
case Empty e -> e; case Empty e -> e;
case Cons(Integer x, Supplier<LazyList> l1) -> case Cons(Integer x, Supplier<LazyList> l1) ->
p.apply(x) ? new Cons(x, () -> filter(p, l1.get())) : filter(p, l1.get()); p.apply(x) ? new Cons(x, () -> filter(p, l1.get())) : filter(p, l1.get());
}; };
}*/ }
public LazyList filter(Fun1$$<Integer, Boolean> p, Empty()@l) { public LazyList filter(Fun1$$<Integer, Boolean> p, Empty()@l) {
return l; return l;
} }
@@ -31,6 +31,8 @@ public class Filter {
} }
} }
*/
//Der Konstruktor Cons muss lazy sein, deshalb hier Supplier<...> //Der Konstruktor Cons muss lazy sein, deshalb hier Supplier<...>
record Cons(Integer x, Fun0$$<LazyList> l) implements LazyList { record Cons(Integer x, Fun0$$<LazyList> l) implements LazyList {
public Integer fst() { return this.x; } public Integer fst() { return this.x; }
@@ -45,7 +47,7 @@ record Empty() implements LazyList {
public LazyList rest() { return null; } public LazyList rest() { return null; }
} }
/*
class Main { class Main {
static LazyList Count(int i) { return new Cons(i, () -> Count(i+1)); } static LazyList Count(int i) { return new Cons(i, () -> Count(i+1)); }
@@ -54,3 +56,4 @@ class Main {
System.out.println(Count(1).rest().fst()); System.out.println(Count(1).rest().fst());
} }
} }
*/
+8 -7
View File
@@ -7,9 +7,10 @@ import java.io.PrintStream;
import LazyList; import LazyList;
import Cons; import Cons;
import Empty; import Empty;
import Filter; //import Filter;
public class Primzahlen { public class Primzahlen {
/*
static LazyList from(Integer i) { return new Cons(i, () -> from(i+1)); } static LazyList from(Integer i) { return new Cons(i, () -> from(i+1)); }
/*LazyList filter(Fun1$$<Integer, Boolean> p, LazyList l) { /*LazyList filter(Fun1$$<Integer, Boolean> p, LazyList l) {
@@ -18,7 +19,7 @@ public class Primzahlen {
case Cons(Integer x, Fun0$$<LazyList> l1) -> case Cons(Integer x, Fun0$$<LazyList> l1) ->
p.apply(x) ? new Cons(x, () -> filter(p, l1.apply())) : filter(p, l1.apply()); p.apply(x) ? new Cons(x, () -> filter(p, l1.apply())) : filter(p, l1.apply());
}; };
}*/ }
LazyList dropMul(Integer x, LazyList xs) { LazyList dropMul(Integer x, LazyList xs) {
return new Filter().filter(y -> (y % x != 0), xs); return new Filter().filter(y -> (y % x != 0), xs);
@@ -40,13 +41,13 @@ public class Primzahlen {
new Cons(x, () -> take(n-1, l1.apply())); new Cons(x, () -> take(n-1, l1.apply()));
}; };
}; };
*/
public static void main(args) { public static void main(args) {
System.out.println(new Cons(1, () -> new Cons(2, () -> new Empty())).fst()); //System.out.println(new Cons(1, () -> new Cons(2, () -> new Empty())).fst());
var l = new Cons(1, () -> new Cons(2, () -> new Cons(2, () -> new Empty()))); var l = new Cons(1, () -> new Cons(2, () -> new Cons(2, () -> new Empty())));
System.out.println(l); //System.out.println(l);
var filtered = new Filter().filter(x -> x == 2, l); //var filtered = new Filter().filter(x -> x == 2, l);
System.out.println(filtered); //ystem.out.println(filtered);
//System.out.println(from(1).rest().fst()); //System.out.println(from(1).rest().fst());
//Primzahlen pz = new Primzahlen(); //Primzahlen pz = new Primzahlen();
//System.out.println(pz.take(10, pz.from(2))); //System.out.println(pz.take(10, pz.from(2)));
@@ -1780,7 +1780,7 @@ public class Codegen {
if (parent != null) { if (parent != null) {
state.scope.parent = parent.scope; state.scope.parent = parent.scope;
} }
var offset = 1; var offset = method.isStatic() ? 0 : 1;
for (var param : method.signature().parameters()) { for (var param : method.signature().parameters()) {
state.createVariable(param.pattern().name(), param.pattern().type()); state.createVariable(param.pattern().name(), param.pattern().type());
} }
@@ -15,6 +15,7 @@ import de.dhbwstuttgart.typeinference.constraints.Pair;
import de.dhbwstuttgart.typeinference.unify.PlaceholderRegistry; import de.dhbwstuttgart.typeinference.unify.PlaceholderRegistry;
import de.dhbwstuttgart.typeinference.unify.model.*; import de.dhbwstuttgart.typeinference.unify.model.*;
import java.lang.reflect.Modifier;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -54,7 +55,8 @@ public class FCGenerator {
private static Boolean isFunctionalInterface(ClassOrInterface cly) { private static Boolean isFunctionalInterface(ClassOrInterface cly) {
return (cly.isInterface() && (cly.isFunctionalInterface() || cly.getMethods().size() == 1)); // TODO isFunctionalInterface should be set properly, we shouldn't need to check it again
return (cly.isInterface() && (cly.isFunctionalInterface() || cly.getMethods().size() == 1 && Modifier.isAbstract(cly.getMethods().getFirst().modifier)));
} }
private static Pair genImplFunType(ClassOrInterface cly, RefTypeOrTPHOrWildcardOrGeneric fIType, HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> gtvs) { private static Pair genImplFunType(ClassOrInterface cly, RefTypeOrTPHOrWildcardOrGeneric fIType, HashMap<String, RefTypeOrTPHOrWildcardOrGeneric> gtvs) {
@@ -1111,7 +1111,7 @@ public class StatementGenerator {
if (expression.lambdaBody().expression() != null) { if (expression.lambdaBody().expression() != null) {
List<Statement> statements = new ArrayList<>(); List<Statement> statements = new ArrayList<>();
statements.add(new Return(lambdaGenerator.convert(expression.lambdaBody().expression()), expression.lambdaBody().expression().getStart())); statements.add(new Return(lambdaGenerator.convert(expression.lambdaBody().expression()), expression.lambdaBody().expression().getStart()));
block = new Block(statements, expression.lambdaBody().getStart()); block = new Block(statements, expression.lambdaBody().getStart(), -1);
} else { } else {
block = lambdaGenerator.convert(expression.lambdaBody().block(), true); block = lambdaGenerator.convert(expression.lambdaBody().block(), true);
} }
@@ -409,8 +409,9 @@ public class SyntaxTreeGenerator {
} }
} }
boolean isFunctonalInterfce = methods.size() == 1 && Modifier.isAbstract(methods.getFirst().modifier);
var staticCtor = Optional.of(this.generateStaticConstructor(ctx.identifier().getText(), staticFieldInitializations, genericParams, ctx.getStart())); var staticCtor = Optional.of(this.generateStaticConstructor(ctx.identifier().getText(), staticFieldInitializations, genericParams, ctx.getStart()));
return new ClassOrInterface(modifiers, name, fields, Optional.empty(), staticCtor, methods, new ArrayList<>(), genericParams, superClass, true, methods.size() == 1 ? true : false, extendedInterfaces, permittedSubtypes, ctx.getStart(), fileName); return new ClassOrInterface(modifiers, name, fields, Optional.empty(), staticCtor, methods, new ArrayList<>(), genericParams, superClass, true, isFunctonalInterfce, extendedInterfaces, permittedSubtypes, ctx.getStart(), fileName);
} }
private GenericDeclarationList createEmptyGenericDeclarationList(Token classNameIdentifier) { private GenericDeclarationList createEmptyGenericDeclarationList(Token classNameIdentifier) {
@@ -14,6 +14,11 @@ public class Block extends Statement {
this.statements = statements; this.statements = statements;
} }
public Block(List<Statement> statements, Token offset, int variance) {
super(TypePlaceholder.fresh(offset, variance, true), offset);
this.statements = statements;
}
public List<Statement> statements = new ArrayList<>(); public List<Statement> statements = new ArrayList<>();
public List<Statement> getStatements() { public List<Statement> getStatements() {
@@ -188,8 +188,10 @@ public class OutputGenerator implements ASTVisitor {
@Override @Override
public void visit(LambdaExpression lambdaExpression) { public void visit(LambdaExpression lambdaExpression) {
lambdaExpression.params.accept(this); out.append("(");
lambdaExpression.params.accept(this);
out.append(" -> "); out.append(" -> ");
out.append("(");
lambdaExpression.methodBody.accept(this); lambdaExpression.methodBody.accept(this);
} }
@@ -29,6 +29,7 @@ import org.objectweb.asm.Opcodes;
import java.lang.classfile.Opcode; import java.lang.classfile.Opcode;
import java.lang.reflect.AccessFlag; import java.lang.reflect.AccessFlag;
import java.lang.reflect.Modifier;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -630,7 +631,7 @@ public class ASTToTargetAST {
mParams, mParams,
classType, classType,
method.name(), method.name(),
false, false, method.isPrivate() method.isStatic(), false, method.isPrivate()
); );
if (method.signature().returnType() != null) { if (method.signature().returnType() != null) {
caseBody = new TargetReturn(caseBody); caseBody = new TargetReturn(caseBody);
@@ -39,6 +39,7 @@ public class distributeVariance extends visitUnifyTypeVisitor<Integer> {
List<UnifyType> param = new ArrayList<>(funnty.getTypeParams().get().length); List<UnifyType> param = new ArrayList<>(funnty.getTypeParams().get().length);
param.addAll(Arrays.asList(funnty.getTypeParams().get())); param.addAll(Arrays.asList(funnty.getTypeParams().get()));
UnifyType resultType = param.remove(param.size()-1); UnifyType resultType = param.remove(param.size()-1);
ht = (ht == 0)? 1 : 0; //bei ht = 0 wird ht auf die Standardwerte für Functionstypes gesetzt
int htInverse = inverseVariance(ht); int htInverse = inverseVariance(ht);
param = param.stream() param = param.stream()
.map(x -> x.accept(this, htInverse)) .map(x -> x.accept(this, htInverse))
+25
View File
@@ -257,6 +257,7 @@ public class TestComplete {
@Test @Test
//@Disabled("This is too complex") //@Disabled("This is too complex")
public void matrixTest() throws Exception { public void matrixTest() throws Exception {
//ConsoleInterface.logLevel = LogLevel.DEBUG;
var classFiles = generateClassFiles(createClassLoader(), "Matrix.jav"); var classFiles = generateClassFiles(createClassLoader(), "Matrix.jav");
var matrix = classFiles.get("Matrix"); var matrix = classFiles.get("Matrix");
@@ -1359,6 +1360,7 @@ public class TestComplete {
@Disabled("See #405") @Disabled("See #405")
@Test @Test
public void testLazy() throws Exception { public void testLazy() throws Exception {
ConsoleInterface.logLevel = LogLevel.DEBUG;
var classFiles = generateClassFiles(createClassLoader(), false, "LazyList.jav", "Primzahlen.jav"); var classFiles = generateClassFiles(createClassLoader(), false, "LazyList.jav", "Primzahlen.jav");
var clazz = classFiles.get("Primzahlen"); var clazz = classFiles.get("Primzahlen");
var main = clazz.getDeclaredMethod("main", List.class); var main = clazz.getDeclaredMethod("main", List.class);
@@ -1760,6 +1762,12 @@ public class TestComplete {
assertEquals("many", name.invoke(instance, 2)); assertEquals("many", name.invoke(instance, 2));
} }
@Test
public void testBug411() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "Bug411.jav");
var clazz = classFiles.get("Bug411");
}
@Test @Test
public void testBug412() throws Exception { public void testBug412() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "Bug412.jav"); var classFiles = generateClassFiles(createClassLoader(), "Bug412.jav");
@@ -1769,4 +1777,21 @@ public class TestComplete {
assertEquals(10, m.invoke(instance, 1)); assertEquals(10, m.invoke(instance, 1));
assertEquals(20, m.invoke(instance, 2)); assertEquals(20, m.invoke(instance, 2));
} }
@Test
public void testBug416() throws Exception {
var classFiles = generateClassFiles(createClassLoader(), "Bug416.jav");
var clazz = classFiles.get("Bug416");
var L = classFiles.get("L");
var Cons = classFiles.get("Cons");
var Nil = classFiles.get("Nil");
var consCtor = Cons.getDeclaredConstructor(Object.class, L);
var nilCtor = Nil.getDeclaredConstructor();
var list = consCtor.newInstance(1, consCtor.newInstance(2, consCtor.newInstance(3, nilCtor.newInstance())));
var len = clazz.getDeclaredMethod("len", L);
assertEquals(3, len.invoke(null, list));
}
} }