summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java7
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java1
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java44
4 files changed, 53 insertions, 0 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 0c4b8b8..8f6bd48 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
@@ -142,6 +142,7 @@ public class JavaTypesGenerator implements Generator {
sumDefinition.variants().stream()
.map(variant -> generateTypeRef(variant.type(), context))
.toList(),
+ List.of(),
JavaCustomArea.type(generateTypeRef(sumDefinition.type(), context), "body"),
sumDefinition.docComment()
)
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 3e1a266..3cf58ce 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
@@ -171,6 +171,13 @@ public class JavaWriter implements AutoCloseable {
this.writer.write("{");
this.writer.indent();
+
+ for (var bodyDeclaration: interfaceDeclaration.body()) {
+ writer.newLine();
+ writeClassBodyDeclaration(bodyDeclaration);
+ writer.newLine();
+ }
+
this.writer.newLine();
this.writeCustomArea(interfaceDeclaration.customArea());
this.writer.dedent();
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
index c1c0fc5..d0bd0a1 100644
--- 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
@@ -7,6 +7,7 @@ import java.util.List;
public record JavaInterfaceDeclaration(
String name,
List<JavaTypeRef> permitsTypes,
+ List<JavaClassBodyDeclaration> body,
JavaCustomArea customArea,
DocComment docComment
) implements JavaTypeDeclaration {
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 2006b50..a53b20f 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
@@ -98,6 +98,7 @@ public class JavaWriterTests {
var java = new JavaInterfaceDeclaration(
"Shape",
List.of(),
+ List.of(),
new JavaCustomArea(JavaTypeRef.topLevel(List.of(), "Shape"), "body"),
DocComment.EMPTY
);
@@ -120,6 +121,7 @@ public class JavaWriterTests {
JavaTypeRef.topLevel(List.of("abc", "def"), "One"),
JavaTypeRef.topLevel(List.of("abc", "def"), "Two")
),
+ List.of(),
new JavaCustomArea(JavaTypeRef.topLevel(List.of(), "Shape"), "body"),
DocComment.EMPTY
);
@@ -139,6 +141,7 @@ public class JavaWriterTests {
var java = new JavaInterfaceDeclaration(
"Shape",
List.of(),
+ List.of(),
new JavaCustomArea(JavaTypeRef.topLevel(List.of(), "Shape"), "body"),
new DocComment("A 2D shape.")
);
@@ -155,6 +158,47 @@ public class JavaWriterTests {
}
@Test
+ public void interfaceDeclarationWithBody() throws IOException {
+ var java = new JavaInterfaceDeclaration(
+ "Shape",
+ List.of(),
+ List.of(
+ new JavaMethodDeclaration(
+ "a",
+ JavaMethodKind.STATIC,
+ JavaTypeRef.VOID,
+ List.of(),
+ JavaBlock.EMPTY
+ ),
+ new JavaMethodDeclaration(
+ "b",
+ JavaMethodKind.STATIC,
+ JavaTypeRef.VOID,
+ List.of(),
+ JavaBlock.EMPTY
+ )
+ ),
+ new JavaCustomArea(JavaTypeRef.topLevel(List.of(), "Shape"), "body"),
+ DocComment.EMPTY
+ );
+
+ var string = write(writer -> writer.writeTypeDeclaration(java));
+
+ assertThat(string, equalTo("""
+ public sealed interface Shape {
+ public static void a() {
+ }
+
+ public static void b() {
+ }
+
+ // Custom area start: Shape body
+ // Custom area end: Shape body
+ }"""
+ ));
+ }
+
+ @Test
public void emptyRecordDeclaration() throws IOException {
var java = new JavaRecordDeclaration(
"Point",