summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-04 23:12:31 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-04 23:12:31 +0100
commit42e002e600dab7ddfe1181dc1c2b331eda9557d7 (patch)
treec64d548650618a0e18a5005fa7331df1b2f96e91
parent444c252a1f345f392a9cb8238597ea7bcb96e6fa (diff)
Add left shift to Java AST
-rw-r--r--hobgoblin/src/output/lang/java/ast.hob1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java3
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperator.java1
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java13
4 files changed, 18 insertions, 0 deletions
diff --git a/hobgoblin/src/output/lang/java/ast.hob b/hobgoblin/src/output/lang/java/ast.hob
index 3b00b0e..57c406d 100644
--- a/hobgoblin/src/output/lang/java/ast.hob
+++ b/hobgoblin/src/output/lang/java/ast.hob
@@ -176,6 +176,7 @@ struct JavaBinaryOperation {
enum JavaBinaryOperator {
variant assign;
variant bitwiseAnd;
+ variant leftShift;
variant unsignedRightShift;
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java
index 95e3081..393447c 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java
@@ -52,6 +52,7 @@ public class JavaWriter implements AutoCloseable {
this.writer.write(switch (binaryOperation.operator()) {
case ASSIGN -> "=";
case BITWISE_AND -> "&";
+ case LEFT_SHIFT -> "<<";
case UNSIGNED_RIGHT_SHIFT -> ">>>";
});
this.writer.write(" ");
@@ -66,6 +67,7 @@ public class JavaWriter implements AutoCloseable {
return switch (operator) {
case ASSIGN -> false;
case BITWISE_AND -> true;
+ case LEFT_SHIFT -> true;
case UNSIGNED_RIGHT_SHIFT -> true;
};
}
@@ -344,6 +346,7 @@ public class JavaWriter implements AutoCloseable {
return switch (binaryOperation.operator()) {
case ASSIGN -> JavaPrecedence.ASSIGNMENT;
case BITWISE_AND -> JavaPrecedence.BITWISE_AND;
+ case LEFT_SHIFT -> JavaPrecedence.SHIFT;
case UNSIGNED_RIGHT_SHIFT -> JavaPrecedence.SHIFT;
};
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperator.java
index 44073fa..ba89103 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperator.java
@@ -8,6 +8,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
public enum JavaBinaryOperator {
ASSIGN,
BITWISE_AND,
+ LEFT_SHIFT,
UNSIGNED_RIGHT_SHIFT
// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperator body
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 25b2c9f..c487515 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
@@ -849,6 +849,19 @@ public class JavaWriterTests {
}
@Test
+ public void binaryOperationUnsignedLeftShift() throws IOException {
+ var java = JavaBinaryOperation.arbitrary()
+ .withOperator(JavaBinaryOperator.LEFT_SHIFT)
+ .withLeft(JavaRef.arbitrary().withName(JavaIdentifier.of("x")))
+ .withRight(JavaRef.arbitrary().withName(JavaIdentifier.of("y")))
+ .build();
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("x << y"));
+ }
+
+ @Test
public void binaryOperationUnsignedRightShift() throws IOException {
var java = JavaBinaryOperation.arbitrary()
.withOperator(JavaBinaryOperator.UNSIGNED_RIGHT_SHIFT)