diff options
Diffstat (limited to 'src/main/java')
4 files changed, 34 insertions, 2 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 82fc3a8c..b1fcd49b 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.ast.typed; -public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedBlockReturnNode, TypedExpressionStatementNode, TypedFunctionReturnNode, TypedValNode { +public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedBlockReturnNode, TypedExpressionStatementNode, TypedFunctionReturnNode, TypedValNode, TypedVarNode { TypedFunctionStatementBehaviour behaviour(); } diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedVarNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedVarNode.java new file mode 100644 index 00000000..3c698b52 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedVarNode.java @@ -0,0 +1,14 @@ +package org.shedlang.compiler.ast.typed; + +import org.shedlang.compiler.sources.Source; + +public record TypedVarNode( + TypedTargetNode target, + TypedExpressionNode expression, + Source source +) implements TypedFunctionStatementNode { + @Override + public TypedFunctionStatementBehaviour behaviour() { + return TypedFunctionStatementBehaviour.CONTINUE; + } +} diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index 167983bb..2be8480d 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -212,6 +212,9 @@ public class StackCompiler { case TypedValNode val -> compileVal(val, context); + + case TypedVarNode var -> + throw new UnsupportedOperationException(); }; } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index e0be25eb..8cf38fc1 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -541,7 +541,7 @@ public class TypeChecker { typeCheckVal(val).typeCheckAllPhases(context); case UntypedVarNode var -> - throw new UnsupportedOperationException(); + typeCheckVar(var, context); }; } @@ -802,6 +802,21 @@ public class TypeChecker { return context.toResult(new TypedValNode(target, expression, untyped.source())); } + private static TypeCheckerResult<TypedVarNode> typeCheckVar( + UntypedVarNode untyped, + TypeCheckerContext context + ) { + var expressionResult = typeCheckExpression(untyped.expression(), context); + var expression = expressionResult.value(); + context = expressionResult.context(); + + var targetResult = typeCheckTarget(untyped.target(), expression.type(), context); + var target = targetResult.value(); + context = targetResult.context(); + + return context.toResult(new TypedVarNode(target, expression, untyped.source())); + } + private static TypeCheckerResult<TypedTargetNode> typeCheckTarget( UntypedTargetNode target, Type expressionType, |
