summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java15
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassDeclaration.java3
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java3
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRecordDeclaration.java3
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java86
6 files changed, 103 insertions, 13 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 3e12b8c..062fc9b 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
@@ -94,7 +94,8 @@ public class JavaTypesGenerator implements Generator {
field.name()
))
.toList(),
- javaClassToImplementsType.getOrDefault(structDefinition.name(), List.of())
+ javaClassToImplementsType.getOrDefault(structDefinition.name(), List.of()),
+ structDefinition.docComment()
)
);
@@ -108,7 +109,8 @@ public class JavaTypesGenerator implements Generator {
sumDefinition.name(),
sumDefinition.variants().stream()
.map(variant -> generateTypeRef(variant.type()))
- .toList()
+ .toList(),
+ 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 c866ecd..fed544d 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
@@ -44,7 +44,18 @@ public class JavaWriter implements AutoCloseable {
}
}
+ private void writeDocComment(String docComment) throws IOException {
+ Iterable<String> lines = docComment.lines()::iterator;
+ for (var line : lines) {
+ this.writer.write("/// ");
+ this.writer.write(line);
+ this.writer.write("\n");
+ }
+ }
+
private void writeClassDeclaration(JavaClassDeclaration classDeclaration) throws IOException {
+ writeDocComment(classDeclaration.docComment());
+
this.writer.write("public class ");
this.writer.write(classDeclaration.name());
this.writer.write(" {");
@@ -83,6 +94,8 @@ public class JavaWriter implements AutoCloseable {
}
private void writeInterfaceDeclaration(JavaInterfaceDeclaration interfaceDeclaration) throws IOException {
+ writeDocComment(interfaceDeclaration.docComment());
+
this.writer.write("public sealed interface ");
this.writer.write(interfaceDeclaration.name());
this.writer.write(" ");
@@ -103,6 +116,8 @@ public class JavaWriter implements AutoCloseable {
}
private void writeRecordDeclaration(JavaRecordDeclaration recordDeclaration) throws IOException {
+ writeDocComment(recordDeclaration.docComment());
+
this.writer.write("public record ");
this.writer.write(recordDeclaration.name());
this.writer.write("(");
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassDeclaration.java
index e7556a6..298e31f 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassDeclaration.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassDeclaration.java
@@ -4,6 +4,7 @@ import java.util.List;
public record JavaClassDeclaration(
String name,
- List<JavaClassBodyDeclaration> body
+ List<JavaClassBodyDeclaration> body,
+ String docComment
) implements JavaTypeDeclaration {
}
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 dfa20e9..2fe3a8d 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
@@ -4,6 +4,7 @@ import java.util.List;
public record JavaInterfaceDeclaration(
String name,
- List<JavaTypeRef> permitsTypes
+ List<JavaTypeRef> permitsTypes,
+ String docComment
) implements JavaTypeDeclaration {
}
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
index 7dcda27..10b80a5 100644
--- 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
@@ -5,6 +5,7 @@ import java.util.List;
public record JavaRecordDeclaration(
String name,
List<JavaRecordComponent> components,
- List<JavaTypeRef> implementsTypes
+ List<JavaTypeRef> implementsTypes,
+ String 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 0f2313a..36e7202 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
@@ -2,10 +2,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.java;
import org.junit.jupiter.api.Test;
import org.zwobble.hobgoblin.compiler.output.CodeWriter;
-import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassDeclaration;
-import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration;
-import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration;
-import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef;
+import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*;
import java.io.IOException;
import java.io.StringWriter;
@@ -19,7 +16,8 @@ public class JavaWriterTests {
public void emptyClassDeclaration() throws IOException {
var java = new JavaClassDeclaration(
"Rectangle",
- List.of()
+ List.of(),
+ ""
);
var string = write(writer -> writer.writeTypeDeclaration(java));
@@ -43,7 +41,8 @@ public class JavaWriterTests {
"b",
JavaTypeRef.VOID
)
- )
+ ),
+ ""
);
var string = write(writer -> writer.writeTypeDeclaration(java));
@@ -60,10 +59,28 @@ public class JavaWriterTests {
}
@Test
+ public void classDeclarationWithDocComment() throws IOException {
+ var java = new JavaClassDeclaration(
+ "Point",
+ List.of(),
+ "A 2D point."
+ );
+
+ var string = write(writer -> writer.writeTypeDeclaration(java));
+
+ assertThat(string, equalTo("""
+ /// A 2D point.
+ public class Point {
+ }"""
+ ));
+ }
+
+ @Test
public void emptyInterfaceDeclaration() throws IOException {
var java = new JavaInterfaceDeclaration(
"Shape",
- List.of()
+ List.of(),
+ ""
);
var string = write(writer -> writer.writeTypeDeclaration(java));
@@ -81,7 +98,8 @@ public class JavaWriterTests {
List.of(
new JavaTypeRef(List.of("abc", "def"), "One", List.of()),
new JavaTypeRef(List.of("abc", "def"), "Two", List.of())
- )
+ ),
+ ""
);
var string = write(writer -> writer.writeTypeDeclaration(java));
@@ -93,6 +111,58 @@ public class JavaWriterTests {
}
@Test
+ public void interfaceDeclarationWithDocComment() throws IOException {
+ var java = new JavaInterfaceDeclaration(
+ "Shape",
+ List.of(),
+ "A 2D shape."
+ );
+
+ var string = write(writer -> writer.writeTypeDeclaration(java));
+
+ assertThat(string, equalTo("""
+ /// A 2D shape.
+ public sealed interface Shape {
+ }"""
+ ));
+ }
+
+ @Test
+ public void emptyRecordDeclaration() throws IOException {
+ var java = new JavaRecordDeclaration(
+ "Point",
+ List.of(),
+ List.of(),
+ ""
+ );
+
+ var string = write(writer -> writer.writeTypeDeclaration(java));
+
+ assertThat(string, equalTo("""
+ public record Point() {
+ }"""
+ ));
+ }
+
+ @Test
+ public void recordDeclarationWithDocComment() throws IOException {
+ var java = new JavaRecordDeclaration(
+ "Point",
+ List.of(),
+ List.of(),
+ "A 2D point."
+ );
+
+ var string = write(writer -> writer.writeTypeDeclaration(java));
+
+ assertThat(string, equalTo("""
+ /// A 2D point.
+ public record Point() {
+ }"""
+ ));
+ }
+
+ @Test
public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException {
var java = new JavaTypeRef(List.of("abc", "def"), "One", List.of());