From f0a8f1b93c12506f40903093f90a70d2a8a99f4f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 May 2026 11:17:31 +0100 Subject: Create separate lang package --- .../generators/javatypes/JavaTypesGenerator.java | 4 +- .../hobgoblin/compiler/output/java/JavaWriter.java | 130 --------------------- .../output/java/ast/JavaCompilationUnit.java | 9 -- .../output/java/ast/JavaInterfaceDeclaration.java | 9 -- .../output/java/ast/JavaRecordComponent.java | 4 - .../output/java/ast/JavaRecordDeclaration.java | 10 -- .../output/java/ast/JavaTypeDeclaration.java | 5 - .../compiler/output/java/ast/JavaTypeRef.java | 6 - .../compiler/output/lang/java/JavaWriter.java | 130 +++++++++++++++++++++ .../output/lang/java/ast/JavaCompilationUnit.java | 9 ++ .../lang/java/ast/JavaInterfaceDeclaration.java | 9 ++ .../output/lang/java/ast/JavaRecordComponent.java | 4 + .../lang/java/ast/JavaRecordDeclaration.java | 10 ++ .../output/lang/java/ast/JavaTypeDeclaration.java | 5 + .../compiler/output/lang/java/ast/JavaTypeRef.java | 6 + 15 files changed, 175 insertions(+), 175 deletions(-) delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/java/JavaWriter.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaCompilationUnit.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaInterfaceDeclaration.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordComponent.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordDeclaration.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeRef.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordComponent.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordDeclaration.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java (limited to 'src') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index 4c06e8e..8fa60a7 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -8,8 +8,8 @@ import org.zwobble.hobgoblin.compiler.builtins.BuiltinTypes; import org.zwobble.hobgoblin.compiler.config.OutputConfig; import org.zwobble.hobgoblin.compiler.output.CodeWriter; import org.zwobble.hobgoblin.compiler.output.generators.Generator; -import org.zwobble.hobgoblin.compiler.output.java.JavaWriter; -import org.zwobble.hobgoblin.compiler.output.java.ast.*; +import org.zwobble.hobgoblin.compiler.output.lang.java.JavaWriter; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; import org.zwobble.hobgoblin.compiler.types.*; import org.zwobble.json5.values.Json5Object; import org.zwobble.json5.values.Json5String; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/JavaWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/JavaWriter.java deleted file mode 100644 index 17ff590..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/JavaWriter.java +++ /dev/null @@ -1,130 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.java; - -import org.zwobble.hobgoblin.compiler.output.CodeWriter; -import org.zwobble.hobgoblin.compiler.output.java.ast.*; - -import java.io.IOException; - -public class JavaWriter implements AutoCloseable { - private final CodeWriter writer; - - public JavaWriter(CodeWriter writer) { - this.writer = writer; - } - - @Override - public void close() throws Exception { - this.writer.close(); - } - - public void writeCompilationUnit(JavaCompilationUnit compilationUnit) throws IOException { - this.writer.write("package "); - this.writer.write(String.join(".", compilationUnit.packageName())); - this.writer.write(";"); - this.writer.newLine(); - this.writer.newLine(); - - writeTypeDeclaration(compilationUnit.typeDeclaration()); - } - - private void writeTypeDeclaration(JavaTypeDeclaration typeDeclaration) throws IOException { - switch (typeDeclaration) { - case JavaInterfaceDeclaration interfaceDeclaration -> { - writeInterfaceDeclaration(interfaceDeclaration); - } - - case JavaRecordDeclaration recordDeclaration -> { - writeRecordDeclaration(recordDeclaration); - } - } - } - - private void writeInterfaceDeclaration(JavaInterfaceDeclaration interfaceDeclaration) throws IOException { - this.writer.write("public sealed interface "); - this.writer.write(interfaceDeclaration.name()); - this.writer.write(" "); - - writer.write("permits "); - writeWithSeparator( - interfaceDeclaration.permitsTypes(), - this::writeTypeRef, - () -> writer.write(", ") - ); - writer.write(" "); - - this.writer.write("{"); - this.writer.newLine(); - this.writer.write("}"); - this.writer.newLine(); - } - - private void writeRecordDeclaration(JavaRecordDeclaration recordDeclaration) throws IOException { - this.writer.write("public record "); - this.writer.write(recordDeclaration.name()); - this.writer.write("("); - - writeWithSeparator( - recordDeclaration.components(), - component -> { - writeTypeRef(component.type()); - writer.write(" "); - writer.write(component.name()); - }, - () -> writer.write(", ") - ); - - writer.write(") "); - - if (!recordDeclaration.implementsTypes().isEmpty()) { - this.writer.write("implements "); - writeWithSeparator( - recordDeclaration.implementsTypes(), - this::writeTypeRef, - () -> writer.write(", ") - ); - writer.write(" "); - } - - this.writer.write("{"); - this.writer.newLine(); - - this.writer.write("}"); - this.writer.newLine(); - } - - private void writeTypeRef(JavaTypeRef type) throws IOException { - for (var part : type.packageName()) { - writer.write(part); - writer.write("."); - } - - writer.write(type.name()); - } - - private void writeWithSeparator( - Iterable iterable, - WriteElement writeElement, - WriteSeparator writeSeparator - ) throws IOException { - var isFirst = true; - for (var element : iterable) { - if (!isFirst) { - writeSeparator.write(); - } - - writeElement.write(element); - - if (isFirst) { - isFirst = false; - } - } - } - - interface WriteElement { - void write(T element) throws IOException; - } - - interface WriteSeparator { - void write() throws IOException; - } -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaCompilationUnit.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaCompilationUnit.java deleted file mode 100644 index 91cff3f..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaCompilationUnit.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.java.ast; - -import java.util.List; - -public record JavaCompilationUnit( - List packageName, - JavaTypeDeclaration typeDeclaration -) { -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaInterfaceDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaInterfaceDeclaration.java deleted file mode 100644 index 212fdbe..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaInterfaceDeclaration.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.java.ast; - -import java.util.List; - -public record JavaInterfaceDeclaration( - String name, - List permitsTypes -) implements JavaTypeDeclaration { -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordComponent.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordComponent.java deleted file mode 100644 index 6954753..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordComponent.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.java.ast; - -public record JavaRecordComponent(JavaTypeRef type, String name) { -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordDeclaration.java deleted file mode 100644 index 7398eb9..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaRecordDeclaration.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.java.ast; - -import java.util.List; - -public record JavaRecordDeclaration( - String name, - List components, - List implementsTypes -) implements JavaTypeDeclaration { -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java deleted file mode 100644 index 1c2884e..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.java.ast; - -public sealed interface JavaTypeDeclaration permits JavaInterfaceDeclaration, JavaRecordDeclaration { - String name(); -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeRef.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeRef.java deleted file mode 100644 index b657162..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeRef.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.zwobble.hobgoblin.compiler.output.java.ast; - -import java.util.List; - -public record JavaTypeRef(List packageName, String name) { -} 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 new file mode 100644 index 0000000..664c322 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java @@ -0,0 +1,130 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java; + +import org.zwobble.hobgoblin.compiler.output.CodeWriter; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; + +import java.io.IOException; + +public class JavaWriter implements AutoCloseable { + private final CodeWriter writer; + + public JavaWriter(CodeWriter writer) { + this.writer = writer; + } + + @Override + public void close() throws Exception { + this.writer.close(); + } + + public void writeCompilationUnit(JavaCompilationUnit compilationUnit) throws IOException { + this.writer.write("package "); + this.writer.write(String.join(".", compilationUnit.packageName())); + this.writer.write(";"); + this.writer.newLine(); + this.writer.newLine(); + + writeTypeDeclaration(compilationUnit.typeDeclaration()); + } + + private void writeTypeDeclaration(JavaTypeDeclaration typeDeclaration) throws IOException { + switch (typeDeclaration) { + case JavaInterfaceDeclaration interfaceDeclaration -> { + writeInterfaceDeclaration(interfaceDeclaration); + } + + case JavaRecordDeclaration recordDeclaration -> { + writeRecordDeclaration(recordDeclaration); + } + } + } + + private void writeInterfaceDeclaration(JavaInterfaceDeclaration interfaceDeclaration) throws IOException { + this.writer.write("public sealed interface "); + this.writer.write(interfaceDeclaration.name()); + this.writer.write(" "); + + writer.write("permits "); + writeWithSeparator( + interfaceDeclaration.permitsTypes(), + this::writeTypeRef, + () -> writer.write(", ") + ); + writer.write(" "); + + this.writer.write("{"); + this.writer.newLine(); + this.writer.write("}"); + this.writer.newLine(); + } + + private void writeRecordDeclaration(JavaRecordDeclaration recordDeclaration) throws IOException { + this.writer.write("public record "); + this.writer.write(recordDeclaration.name()); + this.writer.write("("); + + writeWithSeparator( + recordDeclaration.components(), + component -> { + writeTypeRef(component.type()); + writer.write(" "); + writer.write(component.name()); + }, + () -> writer.write(", ") + ); + + writer.write(") "); + + if (!recordDeclaration.implementsTypes().isEmpty()) { + this.writer.write("implements "); + writeWithSeparator( + recordDeclaration.implementsTypes(), + this::writeTypeRef, + () -> writer.write(", ") + ); + writer.write(" "); + } + + this.writer.write("{"); + this.writer.newLine(); + + this.writer.write("}"); + this.writer.newLine(); + } + + private void writeTypeRef(JavaTypeRef type) throws IOException { + for (var part : type.packageName()) { + writer.write(part); + writer.write("."); + } + + writer.write(type.name()); + } + + private void writeWithSeparator( + Iterable iterable, + WriteElement writeElement, + WriteSeparator writeSeparator + ) throws IOException { + var isFirst = true; + for (var element : iterable) { + if (!isFirst) { + writeSeparator.write(); + } + + writeElement.write(element); + + if (isFirst) { + isFirst = false; + } + } + } + + interface WriteElement { + void write(T element) throws IOException; + } + + interface WriteSeparator { + void write() throws IOException; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java new file mode 100644 index 0000000..ebcb316 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java @@ -0,0 +1,9 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +import java.util.List; + +public record JavaCompilationUnit( + List packageName, + JavaTypeDeclaration typeDeclaration +) { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java new file mode 100644 index 0000000..dfa20e9 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java @@ -0,0 +1,9 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +import java.util.List; + +public record JavaInterfaceDeclaration( + String name, + List permitsTypes +) implements JavaTypeDeclaration { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordComponent.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordComponent.java new file mode 100644 index 0000000..ba95357 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordComponent.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public record JavaRecordComponent(JavaTypeRef type, String name) { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordDeclaration.java new file mode 100644 index 0000000..7dcda27 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordDeclaration.java @@ -0,0 +1,10 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +import java.util.List; + +public record JavaRecordDeclaration( + String name, + List components, + List implementsTypes +) implements JavaTypeDeclaration { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java new file mode 100644 index 0000000..5cf5161 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java @@ -0,0 +1,5 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public sealed interface JavaTypeDeclaration permits JavaInterfaceDeclaration, JavaRecordDeclaration { + String name(); +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java new file mode 100644 index 0000000..fafa7af --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java @@ -0,0 +1,6 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +import java.util.List; + +public record JavaTypeRef(List packageName, String name) { +} -- cgit v1.2.3