diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-04 22:55:19 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-04 22:55:19 +0100 |
| commit | 444c252a1f345f392a9cb8238597ea7bcb96e6fa (patch) | |
| tree | 80e5394713a3ae3cb689dc0e685dd048475692be /src/test/java/org | |
| parent | aad987d6a5f8360af1d20316e2fbed56f418796c (diff) | |
Handle parenthesized sub expressions in Java AST
Diffstat (limited to 'src/test/java/org')
| -rw-r--r-- | src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java | 90 |
1 files changed, 77 insertions, 13 deletions
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java index e1e43ad..25b2c9f 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java @@ -794,7 +794,7 @@ public class JavaWriterTests { public void falseLiteral() throws IOException { var java = new JavaBooleanLiteral(false); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("false")); } @@ -803,7 +803,7 @@ public class JavaWriterTests { public void trueLiteral() throws IOException { var java = new JavaBooleanLiteral(true); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("true")); } @@ -812,7 +812,7 @@ public class JavaWriterTests { public void integerLiteral() throws IOException { var java = new JavaIntegerLiteral(42); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("42")); } @@ -821,7 +821,7 @@ public class JavaWriterTests { public void nullLiteral() throws IOException { var java = new JavaNullLiteral(); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("null")); } @@ -830,7 +830,7 @@ public class JavaWriterTests { public void stringLiteral() throws IOException { var java = new JavaStringLiteral("hello"); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("\"hello\"")); } @@ -843,7 +843,7 @@ public class JavaWriterTests { new JavaIntegerLiteral(42) ); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("x = 42")); } @@ -856,7 +856,7 @@ public class JavaWriterTests { .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("y"))) .build(); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("x >>> y")); } @@ -869,7 +869,7 @@ public class JavaWriterTests { .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("y"))) .build(); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("x & y")); } @@ -881,7 +881,7 @@ public class JavaWriterTests { JavaIdentifier.of("two") ); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("one.two")); } @@ -893,7 +893,7 @@ public class JavaWriterTests { JavaIdentifier.of("three") ); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("one.Two.three")); } @@ -905,7 +905,7 @@ public class JavaWriterTests { JavaIdentifier.of("three") ); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("one.Two::three")); } @@ -917,7 +917,7 @@ public class JavaWriterTests { List.of(new JavaIntegerLiteral(1), new JavaIntegerLiteral(2)) ); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("new one.Two(1, 2)")); } @@ -926,12 +926,76 @@ public class JavaWriterTests { public void ref() throws IOException { var java = new JavaRef(JavaIdentifier.of("x")); - var string = write(writer -> writer.writeExpression(java)); + var string = write(writer -> writer.writeTopLevelExpression(java)); assertThat(string, equalTo("x")); } @Test + public void whenSubExpressionHasLowerPrecedenceThenSubExpressionIsParenthesized() throws IOException { + var java = JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.BITWISE_AND) + .withLeft( + JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.ASSIGN) + .withLeft(JavaRef.arbitrary().withName(JavaIdentifier.of("x"))) + .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("y"))) + ) + .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("z"))) + .build(); + + var string = write(writer -> writer.writeTopLevelExpression(java)); + + assertThat(string, equalTo("(x = y) & z")); + } + + @Test + public void whenSubExpressionsOfLeftAssociativeBinaryOperationHaveSamePrecedenceThenRightExpressionIsParenthesized() throws IOException { + var java = JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.BITWISE_AND) + .withLeft( + JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.BITWISE_AND) + .withLeft(JavaRef.arbitrary().withName(JavaIdentifier.of("a"))) + .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("b"))) + ) + .withRight( + JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.BITWISE_AND) + .withLeft(JavaRef.arbitrary().withName(JavaIdentifier.of("c"))) + .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("d"))) + ) + .build(); + + var string = write(writer -> writer.writeTopLevelExpression(java)); + + assertThat(string, equalTo("a & b & (c & d)")); + } + + @Test + public void whenSubExpressionsOfRightAssociativeBinaryOperationHaveSamePrecedenceThenLeftExpressionIsParenthesized() throws IOException { + var java = JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.ASSIGN) + .withLeft( + JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.ASSIGN) + .withLeft(JavaRef.arbitrary().withName(JavaIdentifier.of("a"))) + .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("b"))) + ) + .withRight( + JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.ASSIGN) + .withLeft(JavaRef.arbitrary().withName(JavaIdentifier.of("c"))) + .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("d"))) + ) + .build(); + + var string = write(writer -> writer.writeTopLevelExpression(java)); + + assertThat(string, equalTo("(a = b) = c = d")); + } + + @Test public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException { var java = JavaTypeRef.topLevel( JavaPackageName.of("abc", "def"), |
