diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-05-10 15:35:21 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-05-10 15:35:21 +0100 |
| commit | fe9d820d35bd3759d390593fc08ec241fbb21680 (patch) | |
| tree | 2d087d84133eb52fa16dc0479e05825d60f96161 /src | |
| parent | 4ecf8383268b2698bf4f81390da26898a6a5797f (diff) | |
Use docs comments in java-types output
Diffstat (limited to 'src')
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()); |
