diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-05-10 15:23:52 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-05-10 15:23:52 +0100 |
| commit | 5648afd950141a582b4585be8a30b7b3f808e35a (patch) | |
| tree | c61acb992d75e7b9e544837f11cc1b62af0a6c89 /src | |
| parent | 193a62fa52e360ee76cca3d0f6bdbe2f6a69602a (diff) | |
Parse doc comment for struct definitions
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java | 28 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserStructDefinitionTests.java | 20 |
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")) + )); + } } |
