From 59585296b03b0957efdf8304d57c6547148e8d0a Mon Sep 17 00:00:00 2001 From: Daniel Holle Date: Mon, 4 Mar 2024 11:30:36 +0100 Subject: [PATCH] Fix single expressions not converting to blocks. Fixes #123 --- resources/bytecode/javFiles/Bug123.jav | 13 +++++++++++++ .../SyntaxTreeGenerator/StatementGenerator.java | 1 - .../target/generate/ASTToTargetAST.java | 7 +++++++ .../generate/StatementToTargetExpression.java | 6 +++--- src/test/java/TestComplete.java | 7 +++++++ 5 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 resources/bytecode/javFiles/Bug123.jav diff --git a/resources/bytecode/javFiles/Bug123.jav b/resources/bytecode/javFiles/Bug123.jav new file mode 100644 index 00000000..24cca90e --- /dev/null +++ b/resources/bytecode/javFiles/Bug123.jav @@ -0,0 +1,13 @@ +import java.lang.Boolean; +import java.lang.Integer; + +class Bug123 { + Boolean works(){ + if(true) return true; + else return false; + } + void fails(){ + Boolean a = true; + if(true) a = false; + } +} diff --git a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java index 27f0bf6b..000526b3 100644 --- a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java +++ b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/StatementGenerator.java @@ -633,7 +633,6 @@ public class StatementGenerator { /* *************** + Expression Conversions: */ - private Expression convert(Java17Parser.ExpressionContext expression) { switch (expression) { case PrimaryExpression2Context primary: diff --git a/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java b/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java index a7e82f51..86b227b4 100644 --- a/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java +++ b/src/main/java/de/dhbwstuttgart/target/generate/ASTToTargetAST.java @@ -380,6 +380,13 @@ public class ASTToTargetAST { return new TargetBlock(block.statements.stream().map(this::convert).toList()); } + protected TargetBlock convertWrapInBlock(Expression expression) { + var res = convert(expression); + if (!(res instanceof TargetBlock)) + return new TargetBlock(List.of(res)); + return (TargetBlock) res; + } + protected TargetExpression convert(Expression expr) { var converter = new StatementToTargetExpression(this); expr.accept(converter); diff --git a/src/main/java/de/dhbwstuttgart/target/generate/StatementToTargetExpression.java b/src/main/java/de/dhbwstuttgart/target/generate/StatementToTargetExpression.java index 9117a8d6..22554417 100644 --- a/src/main/java/de/dhbwstuttgart/target/generate/StatementToTargetExpression.java +++ b/src/main/java/de/dhbwstuttgart/target/generate/StatementToTargetExpression.java @@ -145,18 +145,18 @@ public class StatementToTargetExpression implements ASTVisitor { forStmt.initializer.stream().map(converter::convert).toList(), forStmt.condition != null ? converter.convert(forStmt.condition) : null, forStmt.loopExpr.stream().map(converter::convert).toList(), - converter.convert(forStmt.block) + converter.convertWrapInBlock(forStmt.block) ); } @Override public void visit(ForEachStmt forEachStmt) { - result = new TargetForEach(converter.convert(forEachStmt.statement), converter.convert(forEachStmt.expression), converter.convert(forEachStmt.block)); + result = new TargetForEach(converter.convert(forEachStmt.statement), converter.convert(forEachStmt.expression), converter.convertWrapInBlock(forEachStmt.block)); } @Override public void visit(IfStmt ifStmt) { - result = new TargetIf(converter.convert(ifStmt.expr), converter.convert(ifStmt.then_block), ifStmt.else_block != null ? converter.convert(ifStmt.else_block) : null); + result = new TargetIf(converter.convert(ifStmt.expr), converter.convertWrapInBlock(ifStmt.then_block), ifStmt.else_block != null ? converter.convertWrapInBlock(ifStmt.else_block) : null); } @Override diff --git a/src/test/java/TestComplete.java b/src/test/java/TestComplete.java index 4de13307..e188ee37 100644 --- a/src/test/java/TestComplete.java +++ b/src/test/java/TestComplete.java @@ -848,4 +848,11 @@ public class TestComplete { var clazz = classFiles.get("Bug122"); var instance = clazz.getDeclaredConstructor().newInstance(); } + + @Test + public void testBug123() throws Exception { + var classFiles = generateClassFiles(new ByteArrayClassLoader(), "Bug123.jav"); + var clazz = classFiles.get("Bug123"); + var instance = clazz.getDeclaredConstructor().newInstance(); + } }