diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-05-20 22:50:48 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-05-20 22:50:48 +0100 |
| commit | 98200aa8a6f9811978d45eb0446fcfbb52021811 (patch) | |
| tree | 86648bb8a716111e967e79b16e3a934551615ec3 /src | |
| parent | ceba20f77db23e8a8d0e913b54ec95930eb993e9 (diff) | |
Parse native type definitions
Diffstat (limited to 'src')
5 files changed, 70 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedNamespaceStatementNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedNamespaceStatementNode.java index cab5156..5cbe444 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedNamespaceStatementNode.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedNamespaceStatementNode.java @@ -1,4 +1,4 @@ package org.zwobble.hobgoblin.compiler.ast.untyped; -public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedStructDefinitionNode, UntypedSumDefinitionNode { +public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedNativeTypeDefinitionNode, UntypedStructDefinitionNode, UntypedSumDefinitionNode { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedNativeTypeDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedNativeTypeDefinitionNode.java new file mode 100644 index 0000000..bdf76f8 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedNativeTypeDefinitionNode.java @@ -0,0 +1,11 @@ +package org.zwobble.hobgoblin.compiler.ast.untyped; + +import org.zwobble.hobgoblin.compiler.ast.DocComment; +import org.zwobble.hobgoblin.compiler.sources.Source; + +public record UntypedNativeTypeDefinitionNode( + String name, + DocComment docComment, + Source source +) implements UntypedNamespaceStatementNode { +} 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 d2594ee..f995ef3 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java @@ -52,7 +52,9 @@ public class Parser { ) { var docComment = parseDocComment(tokens); - if (tokens.isNext(TokenType.KEYWORD_STRUCT)) { + if (tokens.isNext(TokenType.KEYWORD_NATIVE)) { + return parseNativeTypeDefinition(tokens, docComment); + } else if (tokens.isNext(TokenType.KEYWORD_STRUCT)) { return parseStructDefinition(tokens, docComment); } else if (tokens.isNext(TokenType.KEYWORD_SUM)) { return parseSumDefinition(tokens, docComment); @@ -61,6 +63,28 @@ public class Parser { } } + private static UntypedNativeTypeDefinitionNode parseNativeTypeDefinition( + TokenIterator tokens, + DocComment docComment + ) { + var start = tokens.startPosition(); + + tokens.skip(TokenType.KEYWORD_NATIVE); + var name = tokens.next(TokenType.IDENTIFIER); + tokens.skip(TokenType.SYMBOL_BRACE_OPEN); + + tokens.skip(TokenType.SYMBOL_BRACE_CLOSE); + + var end = tokens.endPosition(); + var source = createSource(start, end); + + return new UntypedNativeTypeDefinitionNode( + name.charSequence().toString(), + docComment, + source + ); + } + private static DocComment parseDocComment(TokenIterator tokens) { var docComment = new StringBuilder(); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java index da09714..29bcbf8 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -40,6 +40,9 @@ public class TypeChecker { TypeCheckerNamespaceContext context ) { switch (untyped) { + case UntypedNativeTypeDefinitionNode untypedNativeTypeDefinition -> + throw new UnsupportedOperationException("TODO"); + case UntypedStructDefinitionNode untypedStructDefinition -> declareStructDefinition(untypedStructDefinition, context); @@ -53,6 +56,9 @@ public class TypeChecker { TypeCheckerNamespaceContext context ) { return switch (untyped) { + case UntypedNativeTypeDefinitionNode untypedNativeTypeDefinition -> + throw new UnsupportedOperationException("TODO"); + case UntypedStructDefinitionNode untypedStructDefinition -> defineStructDefinition(untypedStructDefinition, context); diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNativeTypeDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNativeTypeDefinitionTests.java new file mode 100644 index 0000000..b8e014a --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserNativeTypeDefinitionTests.java @@ -0,0 +1,27 @@ +package org.zwobble.hobgoblin.compiler.parser; + +import org.junit.jupiter.api.Test; +import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedNativeTypeDefinitionNode; + +import static org.zwobble.hobgoblin.compiler.parser.ParserTesting.parseString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.*; + +public class ParserNativeTypeDefinitionTests { + @Test + public void nameIsParsed() { + var source = """ + native Point { + }"""; + + var node = parseString( + source, + Parser::parseNamespaceStatement + ); + + assertThat(node, instanceOf( + UntypedNativeTypeDefinitionNode.class, + has("name", UntypedNativeTypeDefinitionNode::name, equalTo("Point")) + )); + } +} |
