diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index d7ee611d..9fb8a93b 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -914,16 +914,7 @@ public class Parser { var name = tokens.nextValue(TokenType.IDENTIFIER); - var typeLevelParams = Optional.<List<UntypedTypeLevelParamNode>>empty(); - if (tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) { - typeLevelParams = Optional.of(parseMany( - () -> tokens.isNext(TokenType.SYMBOL_SQUARE_CLOSE), - () -> parseTypeLevelParam(tokens), - () -> tokens.trySkip(TokenType.SYMBOL_COMMA) - )); - - tokens.skip(TokenType.SYMBOL_SQUARE_CLOSE); - } + var typeLevelParams = parseTypeLevelParamsOptional(tokens); tokens.skip(TokenType.SYMBOL_PAREN_OPEN); var fields = parseMany( @@ -1213,6 +1204,24 @@ public class Parser { return new UntypedTupleTypeNode(elements, source); } + private static Optional<List<UntypedTypeLevelParamNode>> parseTypeLevelParamsOptional( + TokenIterator<TokenType> tokens + ) { + if (tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) { + var params = parseMany( + () -> tokens.isNext(TokenType.SYMBOL_SQUARE_CLOSE), + () -> parseTypeLevelParam(tokens), + () -> tokens.trySkip(TokenType.SYMBOL_COMMA) + ); + + tokens.skip(TokenType.SYMBOL_SQUARE_CLOSE); + + return Optional.of(params); + } else { + return Optional.empty(); + } + } + private static UntypedTypeLevelParamNode parseTypeLevelParam(TokenIterator<TokenType> tokens) { var start = tokens.position(); |
