diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-05-17 10:30:04 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-05-17 10:30:04 +0100 |
| commit | 9acc7ef12df3f475bbf5f57c0e22d4be16639452 (patch) | |
| tree | 3d99f88d440b75a86340f254655fd840f6307fa0 /src/main | |
| parent | f5f84bd0d834d440cc2bf3f38bdee9d6ecf4518b (diff) | |
Add Java return statement node
Diffstat (limited to 'src/main')
6 files changed, 85 insertions, 21 deletions
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 1a5fe29..2b2cb58 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 @@ -45,6 +45,22 @@ public class JavaWriter implements AutoCloseable { } } + void writeBlock(JavaBlock block) throws IOException { + writeWithSeparator( + block.statements(), + this::writeBlockStatement, + () -> this.writer.newLine() + ); + } + + void writeBlockStatement(JavaBlockStatement statement) throws IOException { + switch (statement) { + case JavaReturn returnStatement -> { + writeReturnStatement(returnStatement); + } + } + } + private void writeDocComment(DocComment docComment) throws IOException { for (var line : docComment.lines()) { this.writer.write("/// "); @@ -83,26 +99,16 @@ public class JavaWriter implements AutoCloseable { } } - void writeMethodDeclaration(JavaMethodDeclaration method) throws IOException { - this.writer.write("public "); - writeTypeRef(method.returnType()); - this.writer.write(" "); - this.writer.write(method.name()); - this.writer.write("("); - - writeWithSeparator( - method.params(), - param -> { - writeTypeRef(param.type()); - writer.write(" "); - writer.write(param.name()); - }, - () -> writer.write(", ") - ); + void writeExpression(JavaExpression expression) throws IOException { + switch (expression) { + case JavaIntegerLiteral integerLiteral -> { + writeIntegerLiteral(integerLiteral); + } + } + } - this.writer.write(") {"); - this.writer.newLine(); - this.writer.write("}"); + private void writeIntegerLiteral(JavaIntegerLiteral integerLiteral) throws IOException { + this.writer.write(Long.toString(integerLiteral.value())); } private void writeInterfaceDeclaration(JavaInterfaceDeclaration interfaceDeclaration) throws IOException { @@ -127,6 +133,36 @@ public class JavaWriter implements AutoCloseable { this.writer.write("}"); } + void writeMethodDeclaration(JavaMethodDeclaration method) throws IOException { + this.writer.write("public "); + writeTypeRef(method.returnType()); + this.writer.write(" "); + this.writer.write(method.name()); + this.writer.write("("); + + writeWithSeparator( + method.params(), + param -> { + writeTypeRef(param.type()); + writer.write(" "); + writer.write(param.name()); + }, + () -> writer.write(", ") + ); + + this.writer.write(") {"); + this.writer.indent(); + + if (!method.body().isEmpty()) { + this.writer.newLine(); + writeBlock(method.body()); + } + + this.writer.dedent(); + this.writer.newLine(); + this.writer.write("}"); + } + private void writeRecordDeclaration(JavaRecordDeclaration recordDeclaration) throws IOException { writeDocComment(recordDeclaration.docComment()); @@ -173,6 +209,12 @@ public class JavaWriter implements AutoCloseable { this.writer.write("}"); } + private void writeReturnStatement(JavaReturn returnStatement) throws IOException { + this.writer.write("return "); + writeExpression(returnStatement.value()); + this.writer.write(";"); + } + void writeTypeRef(JavaTypeRef type) throws IOException { for (var part : type.packageName()) { writer.write(part); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBlock.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBlock.java index 7ebbe29..f758831 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBlock.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBlock.java @@ -1,5 +1,11 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; -public record JavaBlock() { - public static final JavaBlock EMPTY = new JavaBlock(); +import java.util.List; + +public record JavaBlock(List<JavaBlockStatement> statements) { + public static final JavaBlock EMPTY = new JavaBlock(List.of()); + + public boolean isEmpty() { + return this.statements.isEmpty(); + } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBlockStatement.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBlockStatement.java new file mode 100644 index 0000000..1ee5511 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaBlockStatement.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public sealed interface JavaBlockStatement permits JavaReturn { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java new file mode 100644 index 0000000..0aa202c --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public sealed interface JavaExpression permits JavaIntegerLiteral { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaIntegerLiteral.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaIntegerLiteral.java new file mode 100644 index 0000000..0f0342d --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaIntegerLiteral.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public record JavaIntegerLiteral(long value) implements JavaExpression { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaReturn.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaReturn.java new file mode 100644 index 0000000..f297f33 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaReturn.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public record JavaReturn(JavaExpression value) implements JavaBlockStatement { +} |
