summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-10 20:56:56 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-10 20:56:56 +0100
commitacbe6e1325232f47f323e0207de74a049403d4bb (patch)
tree2c23acde5c9f631c41b710f21dd87e7f6a9d3c1c
parent2fa409c86fc3f4426c640c3715b3c15e8cd30a3c (diff)
Add add operator 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/JavaBinaryOperation.java2
-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
5 files changed, 19 insertions, 1 deletions
diff --git a/hobgoblin/src/output/lang/java/ast.hob b/hobgoblin/src/output/lang/java/ast.hob
index 5ec34a1..74611e6 100644
--- a/hobgoblin/src/output/lang/java/ast.hob
+++ b/hobgoblin/src/output/lang/java/ast.hob
@@ -187,6 +187,7 @@ struct JavaBinaryOperation {
}
enum JavaBinaryOperator {
+ variant add;
variant assign;
variant bitwiseAnd;
variant bitwiseOr;
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 18df14e..aa1f3c1 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
@@ -604,6 +604,7 @@ public class JavaWriter implements AutoCloseable {
private static JavaPrecedence precedence(JavaBinaryOperation binaryOperation) {
return switch (binaryOperation.operator()) {
+ case ADD -> JavaPrecedence.ADDITIVE;
case ASSIGN -> JavaPrecedence.ASSIGNMENT;
case BITWISE_AND -> JavaPrecedence.BITWISE_AND;
case BITWISE_OR -> JavaPrecedence.BITWISE_INCLUSIVE_OR;
@@ -626,6 +627,7 @@ public class JavaWriter implements AutoCloseable {
);
this.writer.write(" ");
this.writer.write(switch (binaryOperation.operator()) {
+ case ADD -> "+";
case ASSIGN -> "=";
case BITWISE_AND -> "&";
case BITWISE_OR -> "|";
@@ -645,6 +647,7 @@ public class JavaWriter implements AutoCloseable {
private boolean isLeftAssociative(JavaBinaryOperator operator) {
return switch (operator) {
+ case ADD -> true;
case ASSIGN -> false;
case BITWISE_AND -> true;
case BITWISE_OR -> true;
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperation.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperation.java
index cb1c0ef..e638b7f 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperation.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBinaryOperation.java
@@ -7,7 +7,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
public record JavaBinaryOperation(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperator operator, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression left, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression right) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression {
public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperation.Builder arbitrary() {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperation.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperator.ASSIGN, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBooleanLiteral.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBooleanLiteral.arbitrary().build());
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperation.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperator.ADD, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBooleanLiteral.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBooleanLiteral.arbitrary().build());
}
public record Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperator operator, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression left, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression right) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression.Builder {
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 4eaa2a5..e51ad40 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
@@ -6,6 +6,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperator imports
public enum JavaBinaryOperator {
+ ADD,
ASSIGN,
BITWISE_AND,
BITWISE_OR,
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 4daf608..b28f590 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
@@ -981,6 +981,19 @@ public class JavaWriterTests {
// === Binary operations ===
@Test
+ public void binaryOperationAdd() throws IOException {
+ var java = new JavaBinaryOperation(
+ JavaBinaryOperator.ADD,
+ new JavaRef(JavaIdentifier.of("x")),
+ new JavaIntegerLiteral(42)
+ );
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("x + 42"));
+ }
+
+ @Test
public void binaryOperationAssignment() throws IOException {
var java = new JavaBinaryOperation(
JavaBinaryOperator.ASSIGN,