aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-03-03 10:33:47 +0000
committerMichael Williamson <mike@zwobble.org>2024-03-03 10:33:47 +0000
commit716a7e63392e01dff99111e41c6233655e76e466 (patch)
treede0a4c868cf4bfc6fdabac98231504ee0e19d0c7 /src/main/java
parentf48ecd33ee4430abe7ebb85652554d37d8dea29b (diff)
Add type-level args node for more specific source
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedCallNode.java4
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelArgsNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java9
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java13
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 ->