summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-10 15:23:52 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-10 15:23:52 +0100
commit5648afd950141a582b4585be8a30b7b3f808e35a (patch)
treec61acb992d75e7b9e544837f11cc1b62af0a6c89 /src
parent193a62fa52e360ee76cca3d0f6bdbe2f6a69602a (diff)
Parse doc comment for struct definitions
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java28
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserStructDefinitionTests.java20
2 files changed, 45 insertions, 3 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
index 88b0c5c..49464b6 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -49,8 +49,10 @@ public class Parser {
static UntypedNamespaceStatementNode parseNamespaceStatement(
TokenIterator tokens
) {
+ var docComment = parseDocComment(tokens);
+
if (tokens.isNext(TokenType.KEYWORD_STRUCT)) {
- return parseStructDefinition(tokens);
+ return parseStructDefinition(tokens, docComment);
} else if (tokens.isNext(TokenType.KEYWORD_SUM)) {
return parseSumDefinition(tokens);
} else {
@@ -58,8 +60,28 @@ public class Parser {
}
}
+ private static String parseDocComment(TokenIterator tokens) {
+ var docComment = new StringBuilder();
+
+ while (tokens.isNext(TokenType.DOC_COMMENT)) {
+ var docCommentToken = tokens.next(TokenType.DOC_COMMENT);
+ var docCommentLine = docCommentToken.charSequence();
+
+ var firstCharIndex = 3;
+ while (docCommentLine.charAt(firstCharIndex) == ' ') {
+ firstCharIndex++;
+ }
+
+ var docCommentContents = docCommentLine.subSequence(firstCharIndex, docCommentLine.length());
+ docComment.append(docCommentContents);
+ }
+
+ return docComment.toString();
+ }
+
private static UntypedStructDefinitionNode parseStructDefinition(
- TokenIterator tokens
+ TokenIterator tokens,
+ String docComment
) {
var start = tokens.startPosition();
@@ -81,7 +103,7 @@ public class Parser {
return new UntypedStructDefinitionNode(
name.charSequence().toString(),
fields,
- "",
+ docComment,
source
);
}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserStructDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserStructDefinitionTests.java
index 9dae394..a0394ce 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserStructDefinitionTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserStructDefinitionTests.java
@@ -70,4 +70,24 @@ public class ParserStructDefinitionTests {
))
));
}
+
+ @Test
+ public void structWithDocComment() {
+ var source = """
+ /// A 2D point.
+ ///
+ /// Positive y is up.
+ struct Point {
+ }""";
+
+ var node = parseString(
+ source,
+ Parser::parseNamespaceStatement
+ );
+
+ assertThat(node, instanceOf(
+ UntypedStructDefinitionNode.class,
+ has("docComment", UntypedStructDefinitionNode::docComment, equalTo("A 2D point.\n\nPositive y is up.\n"))
+ ));
+ }
}