From 5831a308f4d8f9e83821fffff67a2141cc76d26b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 22 Oct 2023 13:16:44 +0100 Subject: Parse visibility for vals --- .../compiler/ast/untyped/UntypedTargetNode.java | 3 ++- .../java/org/shedlang/compiler/parser/Parser.java | 26 +++++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java index 1d4cbe7e..5a11cb4b 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.ast.untyped; import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.types.Visibility; import java.util.List; @@ -8,6 +9,6 @@ public sealed interface UntypedTargetNode extends UntypedNode { record Ignore(Source source) implements UntypedTargetNode {} record Reassign(String name, Source source) implements UntypedTargetNode {} record Tuple(List elements, Source source) implements UntypedTargetNode {} - record Val(String name, Source source) implements UntypedTargetNode, UntypedVariableDeclarationNode {} + record Val(String name, Visibility visibility, Source source) implements UntypedTargetNode, UntypedVariableDeclarationNode {} record Var(String name, Source source) implements UntypedTargetNode, UntypedVariableDeclarationNode {} } diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index abc15441..b66fccb1 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -280,8 +280,7 @@ public class Parser { private static UntypedNamespaceStatementNode parseFunctionDefinition(TokenIterator tokens) { var start = tokens.position(); - var isPublic = tokens.trySkip(TokenType.KEYWORD_PUB); - var visibility = isPublic ? Visibility.PUBLIC : Visibility.PRIVATE; + var visibility = parseVisibility(tokens); tokens.skip(TokenType.KEYWORD_FUN); var name = tokens.nextValue(TokenType.IDENTIFIER); @@ -506,8 +505,16 @@ public class Parser { parseFunctionDefinition(tokens); case KEYWORD_PUB -> - // TODO: handle other public things - parseFunctionDefinition(tokens); + switch (tokens.peek(1).tokenType()) { + case KEYWORD_FUN -> + parseFunctionDefinition(tokens); + + case KEYWORD_VAL -> + parseAssign(tokens); + + default -> + throw new UnexpectedTokenException("namespace statement", tokens.peek()); + }; case KEYWORD_STRUCT -> parseStructDefinition(tokens); @@ -754,7 +761,9 @@ public class Parser { yield new UntypedTargetNode.Reassign(name, source); } - case KEYWORD_VAL -> { + case KEYWORD_VAL, KEYWORD_PUB -> { + var visibility = parseVisibility(tokens); + tokens.skip(TokenType.KEYWORD_VAL); var name = tokens.nextValue(TokenType.IDENTIFIER); @@ -762,7 +771,7 @@ public class Parser { var end = tokens.position(); var source = start.to(end); - yield new UntypedTargetNode.Val(name, source); + yield new UntypedTargetNode.Val(name, visibility, source); } case KEYWORD_VAR -> { @@ -860,6 +869,11 @@ public class Parser { return new UntypedTypeLevelReferenceNode(name, source); } + private static Visibility parseVisibility(TokenIterator tokens) { + var isPublic = tokens.trySkip(TokenType.KEYWORD_PUB); + return isPublic ? Visibility.PUBLIC : Visibility.PRIVATE; + } + private static UntypedExpressionNode parseWhen(TokenIterator tokens) { var start = tokens.position(); -- cgit v1.2.3