aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-22 13:16:44 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-22 13:16:44 +0100
commit5831a308f4d8f9e83821fffff67a2141cc76d26b (patch)
treeac57df32c229f745b4d38b88c29bb1a1896d5c47 /src/main/java
parent21c2c5075467151be765b4e77e59d876d258b0c1 (diff)
Parse visibility for vals
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedTargetNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java26
2 files changed, 22 insertions, 7 deletions
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<UntypedTargetNode> 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<TokenType> 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<TokenType> tokens) {
+ var isPublic = tokens.trySkip(TokenType.KEYWORD_PUB);
+ return isPublic ? Visibility.PUBLIC : Visibility.PRIVATE;
+ }
+
private static UntypedExpressionNode parseWhen(TokenIterator<TokenType> tokens) {
var start = tokens.position();