aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-26 17:18:50 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-26 17:18:50 +0000
commitd4d8c8bc13a4d2b11f87a474930349c17afab2b1 (patch)
tree1d03e0326b717ee1362a0742f33c71b0fe3731e8 /src/main/java
parentdf6ec9c9606184b472fc3d7278e2a50fb32c1479 (diff)
Parse type level args for calls
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 96b06c50..aed9d79d 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -202,7 +202,11 @@ public class Parser {
@Override
public Stream<TokenType> operatorTokenTypes() {
- return Stream.of(TokenType.SYMBOL_BANG, TokenType.SYMBOL_PAREN_OPEN);
+ return Stream.of(
+ TokenType.SYMBOL_BANG,
+ TokenType.SYMBOL_PAREN_OPEN,
+ TokenType.SYMBOL_SQUARE_OPEN
+ );
}
@Override
@@ -211,6 +215,8 @@ public class Parser {
var hasEffects = tokens.trySkip(TokenType.SYMBOL_BANG);
+ var typeLevelArgs = parseTypeLevelArgsOptional(tokens);
+
tokens.skip(TokenType.SYMBOL_PAREN_OPEN);
var args = parseArgs(tokens);
tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
@@ -220,7 +226,7 @@ public class Parser {
return new UntypedCallNode(
left,
- Optional.empty(),
+ typeLevelArgs,
args,
hasEffects,
source
@@ -1264,6 +1270,24 @@ public class Parser {
return new UntypedTupleTypeNode(elements, source);
}
+ private static Optional<List<UntypedTypeLevelExpressionNode>> parseTypeLevelArgsOptional(
+ TokenIterator<TokenType> tokens
+ ) {
+ if (tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) {
+ var params = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_SQUARE_CLOSE),
+ () -> parseTopLevelTypeLevelExpression(tokens),
+ () -> tokens.trySkip(TokenType.SYMBOL_COMMA)
+ );
+
+ tokens.skip(TokenType.SYMBOL_SQUARE_CLOSE);
+
+ return Optional.of(params);
+ } else {
+ return Optional.empty();
+ }
+ }
+
private static final Map<TokenType, OperationParser<TypeLevelOperatorPrecedence, UntypedTypeLevelExpressionNode>> TYPE_LEVEL_OPERATION_PARSERS = Stream.of(
new ConstructedTypeParser()
)