From ce4347dd96c5f224c78fb113192678309c8e81ee Mon Sep 17 00:00:00 2001 From: Daniel Holle Date: Tue, 6 Aug 2024 12:42:09 +0200 Subject: [PATCH 1/2] Fix Y Test #341 --- resources/bytecode/javFiles/Y.jav | 40 +++++-------------- .../StatementGenerator.java | 2 + src/test/java/TestComplete.java | 6 ++- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/resources/bytecode/javFiles/Y.jav b/resources/bytecode/javFiles/Y.jav index 0c14b498..b2e65047 100644 --- a/resources/bytecode/javFiles/Y.jav +++ b/resources/bytecode/javFiles/Y.jav @@ -2,41 +2,21 @@ import java.lang.Integer; public class Y { y; - //factorial; - public Y() { - y = f -> t -> f.apply(y.apply(f)).apply(t); - //factorial = y.apply(f -> n -> { if (n == 0) return 1; else return n * f.apply(n - 1); }); - } - /* - getY() { - return y; - } - */ -} -/* -class fac1 { - factorial; - - fac1() { - var y; - y = new Y().getY(); - factorial = y.apply(f -> n -> { if (n == 0) return 1; else return n * f.apply(n - 1); }); + y = f -> t -> f.apply(y.apply(f)).apply(t); } } -ergibt Parse-Error -class fac1 { - factorial; - - fac1() { +public class Fac1 { + public factorial; + public Fac1() { var y; - y = new Y<>().y; + var tmp = new Y<>(); // TODO Having new Y<>().y on one line doesn't work, see FIXME in StatementGenerator + y = tmp.y; factorial = y.apply(f -> n -> { if (n == 0) return 1; else return n * f.apply(n - 1); }); } - public static void main(String args[]) { - System.out.println(new fac1().factorial.apply(3)); + + public fac(v) { + return factorial.apply(v); } - -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java index f4587b6b..573b53f2 100644 --- a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java +++ b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java @@ -697,6 +697,7 @@ public class StatementGenerator { if (!Objects.isNull(expr.methodCall())) { return convert(expr.methodCall(), expr.expression(), offset); } else if (!Objects.isNull(expr.identifier())) { + // FIXME This is not the right way of handling any of this return generateLocalOrFieldVarOrClassName(expr.getText(), offset); } else { // Für alle anderen Optionen, wie Feldzugriff, Aufrufe von super oder explizite @@ -779,6 +780,7 @@ public class StatementGenerator { * @return */ private Expression generateLocalOrFieldVarOrClassName(String expression, Token offset) { + // FIXME Why does this take a String argument??? String[] parts = expression.split("\\."); if (parts.length < 2) { // Check for localVar: diff --git a/src/test/java/TestComplete.java b/src/test/java/TestComplete.java index c4599e02..3b1e5392 100644 --- a/src/test/java/TestComplete.java +++ b/src/test/java/TestComplete.java @@ -602,7 +602,11 @@ public class TestComplete { @Test public void yTest() throws Exception { var classFiles = generateClassFiles(new ByteArrayClassLoader(), "Y.jav"); - var instance = classFiles.get("Y").getDeclaredConstructor().newInstance(); + + var fac1 = classFiles.get("Fac1"); + var instance = fac1.getDeclaredConstructor().newInstance(); + var fac = fac1.getDeclaredMethod("fac", Integer.class); + assertEquals(fac.invoke(instance, 10), 3628800); } @Test From f0b9bea23ef9b7930127f91379a0f8151042d9fd Mon Sep 17 00:00:00 2001 From: Daniel Holle Date: Wed, 7 Aug 2024 13:33:40 +0200 Subject: [PATCH 2/2] Fix #343 (le null check) --- resources/bytecode/javFiles/Bug343.jav | 2 ++ .../parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java | 5 ++++- src/test/java/TestComplete.java | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 resources/bytecode/javFiles/Bug343.jav diff --git a/resources/bytecode/javFiles/Bug343.jav b/resources/bytecode/javFiles/Bug343.jav new file mode 100644 index 00000000..3fa99067 --- /dev/null +++ b/resources/bytecode/javFiles/Bug343.jav @@ -0,0 +1,2 @@ +public record Bug343() { +} \ No newline at end of file diff --git a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java index de36c9f0..6d33464a 100644 --- a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java +++ b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java @@ -254,7 +254,10 @@ public class SyntaxTreeGenerator { List implementedInterfaces = new ArrayList<>(); List constructorParameters = new ArrayList<>(); List constructorStatements = new ArrayList<>(); - for (RecordComponentContext component : recordDeclaration.recordHeader().recordComponentList().recordComponent()) { + + List components = recordDeclaration.recordHeader().recordComponentList() != null ? + recordDeclaration.recordHeader().recordComponentList().recordComponent(): List.of(); + for (RecordComponentContext component : components) { int fieldmodifiers = allmodifiers.get("private") + allmodifiers.get("final"); String fieldname = component.identifier().getText(); Token fieldoffset = component.getStart(); diff --git a/src/test/java/TestComplete.java b/src/test/java/TestComplete.java index c4599e02..f3a7c638 100644 --- a/src/test/java/TestComplete.java +++ b/src/test/java/TestComplete.java @@ -1147,4 +1147,11 @@ public class TestComplete { var clazz = classFiles.get("Bug338"); var instance = clazz.getDeclaredConstructor().newInstance(); } + + @Test + public void testBug343() throws Exception { + var classFiles = generateClassFiles(new ByteArrayClassLoader(), "Bug343.jav"); + var clazz = classFiles.get("Bug343"); + var instance = clazz.getDeclaredConstructor().newInstance(); + } }