From 5d15eac0f3fd7656f9b78c5796d936182572c297 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 4 Jul 2026 23:29:50 +0100 Subject: Add bitwise or to Java AST --- hobgoblin/src/output/lang/java/ast.hob | 1 + .../compiler/output/lang/java/JavaWriter.java | 3 +++ .../output/lang/java/ast/JavaBinaryOperator.java | 1 + .../output/lang/java/ast/JavaMethodDeclaration.java | 20 -------------------- .../compiler/output/lang/java/JavaWriterTests.java | 13 +++++++++++++ 5 files changed, 18 insertions(+), 20 deletions(-) diff --git a/hobgoblin/src/output/lang/java/ast.hob b/hobgoblin/src/output/lang/java/ast.hob index e5ae982..77f2db7 100644 --- a/hobgoblin/src/output/lang/java/ast.hob +++ b/hobgoblin/src/output/lang/java/ast.hob @@ -177,6 +177,7 @@ struct JavaBinaryOperation { enum JavaBinaryOperator { variant assign; variant bitwiseAnd; + variant bitwiseOr; 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 253b469..6bb86d4 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 BITWISE_OR -> "|"; case LEFT_SHIFT -> "<<"; case UNSIGNED_RIGHT_SHIFT -> ">>>"; }); @@ -67,6 +68,7 @@ public class JavaWriter implements AutoCloseable { return switch (operator) { case ASSIGN -> false; case BITWISE_AND -> true; + case BITWISE_OR -> true; case LEFT_SHIFT -> true; case UNSIGNED_RIGHT_SHIFT -> true; }; @@ -346,6 +348,7 @@ public class JavaWriter implements AutoCloseable { return switch (binaryOperation.operator()) { case ASSIGN -> JavaPrecedence.ASSIGNMENT; case BITWISE_AND -> JavaPrecedence.BITWISE_AND; + case BITWISE_OR -> JavaPrecedence.BITWISE_INCLUSIVE_OR; 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 ba89103..162fefd 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, + BITWISE_OR, LEFT_SHIFT, UNSIGNED_RIGHT_SHIFT diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java index fff2413..00b8af9 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java @@ -5,9 +5,6 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration imports // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration imports -import java.util.List; -import java.util.Optional; - public record JavaMethodDeclaration(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaVisibility visibility, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodKind kind, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef returnType, java.util.List params, java.util.List throws_, java.util.Optional body) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration { public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder arbitrary() { return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaVisibility.PUBLIC, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodKind.STATIC, org.zwobble.hobgoblin.compiler.output.lang.java.ast.HobgoblinNativeAst.arbitraryJavaTypeRef(), java.util.List.of(), java.util.List.of(), java.util.Optional.empty()); @@ -81,23 +78,6 @@ public record JavaMethodDeclaration(org.zwobble.hobgoblin.compiler.output.lang.j } // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration body - public static Builder builder( - JavaIdentifier name, - JavaVisibility visibility, - JavaMethodKind kind, - JavaTypeRef returnType - ) { - return new Builder( - name, - visibility, - kind, - returnType, - List.of(), - List.of(), - Optional.empty() - ); - } - public JavaMethodDeclaration( JavaIdentifier name, JavaVisibility visibility, 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 53e946f..75a255a 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 @@ -897,6 +897,19 @@ public class JavaWriterTests { assertThat(string, equalTo("x & y")); } + @Test + public void binaryOperationBitwiseOr() throws IOException { + var java = JavaBinaryOperation.arbitrary() + .withOperator(JavaBinaryOperator.BITWISE_OR) + .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 fieldAccess() throws IOException { var java = new JavaFieldAccess( -- cgit v1.2.3