diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-03-03 10:33:47 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-03-03 10:33:47 +0000 |
| commit | 716a7e63392e01dff99111e41c6233655e76e466 (patch) | |
| tree | de0a4c868cf4bfc6fdabac98231504ee0e19d0c7 /src/main/java | |
| parent | f48ecd33ee4430abe7ebb85652554d37d8dea29b (diff) | |
Add type-level args node for more specific source
Diffstat (limited to 'src/main/java')
4 files changed, 25 insertions, 12 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedCallNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedCallNode.java index 73219c47..d628384b 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedCallNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedCallNode.java @@ -8,7 +8,7 @@ import java.util.Optional; public record UntypedCallNode( UntypedExpressionNode receiver, - Optional<List<UntypedTypeLevelExpressionNode>> typeLevelArgs, + Optional<UntypedTypeLevelArgsNode> typeLevelArgs, UntypedArgsNode args, boolean hasEffects, Source source @@ -31,7 +31,7 @@ public record UntypedCallNode( public UntypedCallNode build() { return new UntypedCallNode( receiver, - typeLevelArgs, + typeLevelArgs.map(a -> new UntypedTypeLevelArgsNode(a, Sources.NULL)), args.build(), hasEffects, Sources.NULL diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelArgsNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelArgsNode.java new file mode 100644 index 00000000..cea684e5 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelArgsNode.java @@ -0,0 +1,11 @@ +package org.shedlang.compiler.ast.untyped; + +import org.shedlang.compiler.sources.Source; + +import java.util.List; + +public record UntypedTypeLevelArgsNode( + List<UntypedTypeLevelExpressionNode> args, + Source source +) implements UntypedNode { +} diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 45d3f1b1..caa94e87 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -1273,9 +1273,11 @@ public class Parser { return new UntypedTupleTypeNode(elements, source); } - private static Optional<List<UntypedTypeLevelExpressionNode>> parseTypeLevelArgsOptional( + private static Optional<UntypedTypeLevelArgsNode> parseTypeLevelArgsOptional( TokenIterator<TokenType> tokens ) { + var start = tokens.position(); + if (tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) { var params = parseMany( () -> tokens.isNext(TokenType.SYMBOL_SQUARE_CLOSE), @@ -1285,7 +1287,10 @@ public class Parser { tokens.skip(TokenType.SYMBOL_SQUARE_CLOSE); - return Optional.of(params); + var end = tokens.position(); + var source = start.to(end); + + return Optional.of(new UntypedTypeLevelArgsNode(params, source)); } else { return Optional.empty(); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index d9a52038..2cb726d4 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -385,7 +385,6 @@ public class TypeChecker { var typeLevelArgs = typeCheckTypeLevelArgs( untypedTypeLevelArgNodes, typeConstructor.params(), - untyped.source(), contextForReceiver ); specificReceiverType = Types.metaType( @@ -398,7 +397,6 @@ public class TypeChecker { var typeLevelArgs = typeCheckTypeLevelArgs( untypedTypeLevelArgNodes, initialReceiverType.typeLevelParams().get(), - untyped.source(), contextForReceiver ); specificReceiverType = initialReceiverType.applyTypeLevelArgs(typeLevelArgs); @@ -1883,16 +1881,15 @@ public class TypeChecker { } private static ArrayList<TypeLevelValue> typeCheckTypeLevelArgs( - List<UntypedTypeLevelExpressionNode> untyped, + UntypedTypeLevelArgsNode untyped, List<TypeLevelParam> typeLevelParams, - Source source, TypeCheckerContext context ) { - if (untyped.size() != typeLevelParams.size()) { + if (untyped.args().size() != typeLevelParams.size()) { throw new WrongNumberOfTypeLevelArgsError( typeLevelParams.size(), - untyped.size(), - source + untyped.args().size(), + untyped.source() ); } @@ -1902,7 +1899,7 @@ public class TypeChecker { for (var paramIndex = 0; paramIndex < typeLevelParams.size(); paramIndex++) { var typeLevelParam = typeLevelParams.get(paramIndex); - var argNode = untyped.get(paramIndex); + var argNode = untyped.args().get(paramIndex); var typeLevelArg = switch (typeLevelParam) { case EffectParam effectParam -> |
