diff options
Diffstat (limited to 'src/main/java/org/zwobble')
4 files changed, 46 insertions, 9 deletions
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 43e35b4..98d4c12 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,10 +8,7 @@ import org.zwobble.hobgoblin.compiler.builtins.BuiltinTypes; 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.JavaRecordComponent; -import org.zwobble.hobgoblin.compiler.output.java.ast.JavaRecordDeclaration; -import org.zwobble.hobgoblin.compiler.output.java.ast.JavaCompilationUnit; -import org.zwobble.hobgoblin.compiler.output.java.ast.JavaTypeRef; +import org.zwobble.hobgoblin.compiler.output.java.ast.*; import org.zwobble.hobgoblin.compiler.types.*; import java.io.File; @@ -90,6 +87,17 @@ public class JavaTypesGenerator implements Generator { } case TypedSumDefinitionNode sumDefinition -> { + var javaCompilationUnit = new JavaCompilationUnit( + packageParts, + new JavaInterfaceDeclaration( + sumDefinition.name(), + sumDefinition.variants().stream() + .map(variant -> generateTypeRef(variant.type())) + .toList() + ) + ); + + javaCompilationUnits.add(javaCompilationUnit); } } } 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 index 1de6950..17ff590 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/JavaWriter.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/JavaWriter.java @@ -1,10 +1,7 @@ package org.zwobble.hobgoblin.compiler.output.java; import org.zwobble.hobgoblin.compiler.output.CodeWriter; -import org.zwobble.hobgoblin.compiler.output.java.ast.JavaCompilationUnit; -import org.zwobble.hobgoblin.compiler.output.java.ast.JavaRecordDeclaration; -import org.zwobble.hobgoblin.compiler.output.java.ast.JavaTypeDeclaration; -import org.zwobble.hobgoblin.compiler.output.java.ast.JavaTypeRef; +import org.zwobble.hobgoblin.compiler.output.java.ast.*; import java.io.IOException; @@ -32,12 +29,35 @@ public class JavaWriter implements AutoCloseable { 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()); 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 new file mode 100644 index 0000000..212fdbe --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaInterfaceDeclaration.java @@ -0,0 +1,9 @@ +package org.zwobble.hobgoblin.compiler.output.java.ast; + +import java.util.List; + +public record JavaInterfaceDeclaration( + String name, + List<JavaTypeRef> permitsTypes +) 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 index cffb58b..1c2884e 100644 --- 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 @@ -1,5 +1,5 @@ package org.zwobble.hobgoblin.compiler.output.java.ast; -public sealed interface JavaTypeDeclaration permits JavaRecordDeclaration { +public sealed interface JavaTypeDeclaration permits JavaInterfaceDeclaration, JavaRecordDeclaration { String name(); } |
