aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-03 12:03:51 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-03 12:05:09 +0100
commit79886c47c164aafb25c533ecc20cb93554fa2c08 (patch)
tree090782aa2ca0d281d3e84444e8718d9baed6e9a3 /src/main/java
parent16120bc80e13a557a6065f08c1da24453920241a (diff)
Type-check components of val node
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedTargetNode.java7
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedValNode.java10
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java5
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java27
5 files changed, 48 insertions, 3 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java
index f57fd61c..8dfbd7cb 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.ast.typed;
-public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedExpressionStatementNode {
+public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedExpressionStatementNode, TypedValNode {
}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedTargetNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedTargetNode.java
new file mode 100644
index 00000000..7af7203f
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedTargetNode.java
@@ -0,0 +1,7 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+
+public sealed interface TypedTargetNode extends TypedNode {
+ record Variable(String name, Source source) implements TypedTargetNode {}
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedValNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedValNode.java
new file mode 100644
index 00000000..e543312f
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedValNode.java
@@ -0,0 +1,10 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.shedlang.compiler.sources.Source;
+
+public record TypedValNode(
+ TypedTargetNode target,
+ TypedExpressionNode expression,
+ Source source
+) implements TypedFunctionStatementNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
index 2301510d..7ff1338a 100644
--- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
+++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
@@ -96,7 +96,10 @@ public class StackCompiler {
public static PVector<Instruction> compileFunctionStatement(TypedFunctionStatementNode node) {
return switch (node) {
case TypedExpressionStatementNode expressionStatement ->
- compileExpressionStatement(expressionStatement);
+ compileExpressionStatement(expressionStatement);
+
+ case TypedValNode val ->
+ throw new UnsupportedOperationException("TODO");
};
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index c5cb4470..228f1fa0 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -261,7 +261,7 @@ public class TypeChecker {
typeCheckExpressionStatement(expressionStatement, context);
case UntypedValNode val ->
- throw new UnsupportedOperationException("TODO");
+ typeCheckVal(val, context);
};
}
@@ -394,4 +394,29 @@ public class TypeChecker {
untyped.source()
);
}
+
+ private static TypeCheckerResult<TypedFunctionStatementNode> typeCheckVal(
+ UntypedValNode val,
+ TypeCheckerContext context
+ ) {
+ var expressionResult = typeCheckExpression(val.expression(), context);
+ var expression = expressionResult.value();
+ context = expressionResult.context();
+
+ var targetResult = typeCheckTarget(val.target(), context);
+ var target = targetResult.value();
+ context = targetResult.context();
+
+ return context.toResult(new TypedValNode(target, expression, val.source()));
+ }
+
+ private static TypeCheckerResult<TypedTargetNode> typeCheckTarget(
+ UntypedTargetNode target,
+ TypeCheckerContext context
+ ) {
+ return switch (target) {
+ case UntypedTargetNode.Variable variable ->
+ context.toResult(new TypedTargetNode.Variable(variable.name(), target.source()));
+ };
+ }
}