aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-22 12:51:37 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-22 12:51:37 +0100
commit21c2c5075467151be765b4e77e59d876d258b0c1 (patch)
tree9761b85d05c4562a0f726c8b2d097f95b0eb4494 /src/main/java
parent6076b1efa2bf16d1c746e250aa269da401289431 (diff)
Parse visibility of functions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java17
-rw-r--r--src/main/java/org/shedlang/compiler/types/Visibility.java6
3 files changed, 30 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
index ab29001d..65e4f84c 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
@@ -4,11 +4,13 @@ import org.pcollections.Empty;
import org.pcollections.PVector;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.types.Visibility;
import java.util.Optional;
public record UntypedFunctionDefinitionNode(
String name,
+ Visibility visibility,
UntypedParamsNode params,
Optional<UntypedTypeLevelExpressionNode> effect,
UntypedTypeLevelExpressionNode returnType,
@@ -18,6 +20,7 @@ public record UntypedFunctionDefinitionNode(
public static Builder builder() {
return new Builder(
"f",
+ Visibility.PRIVATE,
Empty.vector(),
Empty.vector(),
Optional.empty(),
@@ -28,6 +31,7 @@ public record UntypedFunctionDefinitionNode(
public record Builder(
String name,
+ Visibility visibility,
PVector<UntypedParamNode> positionalParams,
PVector<UntypedParamNode> namedParams,
Optional<UntypedTypeLevelExpressionNode> effect,
@@ -37,6 +41,7 @@ public record UntypedFunctionDefinitionNode(
public UntypedFunctionDefinitionNode build() {
return new UntypedFunctionDefinitionNode(
name,
+ visibility,
new UntypedParamsNode(positionalParams, namedParams, Sources.NULL),
effect,
returnType,
@@ -48,6 +53,7 @@ public record UntypedFunctionDefinitionNode(
public Builder withName(String name) {
return new Builder(
name,
+ this.visibility,
this.positionalParams,
this.namedParams,
this.effect,
@@ -59,6 +65,7 @@ public record UntypedFunctionDefinitionNode(
public Builder addPositionalParam(String name, UntypedTypeLevelExpressionNode type) {
return new Builder(
this.name,
+ this.visibility,
this.positionalParams.plus(new UntypedParamNode(name, type, Sources.NULL)),
this.namedParams,
this.effect,
@@ -70,6 +77,7 @@ public record UntypedFunctionDefinitionNode(
public Builder addNamedParam(String name, UntypedTypeLevelExpressionNode type) {
return new Builder(
this.name,
+ this.visibility,
this.positionalParams,
this.namedParams.plus(new UntypedParamNode(name, type, Sources.NULL)),
this.effect,
@@ -81,6 +89,7 @@ public record UntypedFunctionDefinitionNode(
public Builder withEffect(UntypedTypeLevelExpressionNode effect) {
return new Builder(
this.name,
+ this.visibility,
this.positionalParams,
this.namedParams,
Optional.of(effect),
@@ -92,6 +101,7 @@ public record UntypedFunctionDefinitionNode(
public Builder withReturnType(UntypedTypeLevelExpressionNode returnType) {
return new Builder(
this.name,
+ this.visibility,
this.positionalParams,
this.namedParams,
this.effect,
@@ -103,6 +113,7 @@ public record UntypedFunctionDefinitionNode(
public Builder addStatement(UntypedFunctionStatementNode statement) {
return new Builder(
this.name,
+ this.visibility,
this.positionalParams,
this.namedParams,
this.effect,
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 2122c97c..abc15441 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -5,6 +5,7 @@ import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.tokeniser.TokenIterator;
import org.shedlang.compiler.tokeniser.UnexpectedTokenException;
import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.Visibility;
import java.math.BigInteger;
import java.util.ArrayList;
@@ -279,6 +280,9 @@ 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;
+
tokens.skip(TokenType.KEYWORD_FUN);
var name = tokens.nextValue(TokenType.IDENTIFIER);
@@ -303,6 +307,7 @@ public class Parser {
return new UntypedFunctionDefinitionNode(
name,
+ visibility,
params,
effect,
returnType,
@@ -500,6 +505,10 @@ public class Parser {
case KEYWORD_FUN ->
parseFunctionDefinition(tokens);
+ case KEYWORD_PUB ->
+ // TODO: handle other public things
+ parseFunctionDefinition(tokens);
+
case KEYWORD_STRUCT ->
parseStructDefinition(tokens);
@@ -554,13 +563,13 @@ public class Parser {
return switch (tokens.peek().tokenType()) {
case IDENTIFIER -> parseReference(tokens);
-
+
case INT -> parseInt(tokens);
-
+
case KEYWORD_IF -> parseIf(tokens);
case KEYWORD_FALSE, KEYWORD_TRUE -> parseBoolLiteral(tokens);
-
+
case KEYWORD_WHEN -> parseWhen(tokens);
case STRING -> parseStringLiteral(tokens);
@@ -700,7 +709,7 @@ public class Parser {
NamespaceName namespaceName
) {
var start = tokens.position();
-
+
var imports = parseMany(
() -> !tokens.isNext(TokenType.KEYWORD_IMPORT),
() -> parseImport(tokens),
diff --git a/src/main/java/org/shedlang/compiler/types/Visibility.java b/src/main/java/org/shedlang/compiler/types/Visibility.java
new file mode 100644
index 00000000..a098ee13
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/Visibility.java
@@ -0,0 +1,6 @@
+package org.shedlang.compiler.types;
+
+public enum Visibility {
+ PUBLIC,
+ PRIVATE
+}