diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-03 12:03:51 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-03 12:05:09 +0100 |
| commit | 79886c47c164aafb25c533ecc20cb93554fa2c08 (patch) | |
| tree | 090782aa2ca0d281d3e84444e8718d9baed6e9a3 /src/main/java | |
| parent | 16120bc80e13a557a6065f08c1da24453920241a (diff) | |
Type-check components of val node
Diffstat (limited to 'src/main/java')
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())); + }; + } } |
