From 9a79e487595ac1fdbf4e9c69963440bd979aa107 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 3 Jul 2023 12:11:20 +0100 Subject: Define val type --- .../org/shedlang/compiler/typechecker/TypeChecker.java | 10 +++++++--- .../shedlang/compiler/typechecker/TypeCheckerContext.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 228f1fa0..1dd4b118 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -403,7 +403,7 @@ public class TypeChecker { var expression = expressionResult.value(); context = expressionResult.context(); - var targetResult = typeCheckTarget(val.target(), context); + var targetResult = typeCheckTarget(val.target(), expression.type(), context); var target = targetResult.value(); context = targetResult.context(); @@ -412,11 +412,15 @@ public class TypeChecker { private static TypeCheckerResult typeCheckTarget( UntypedTargetNode target, + Type expressionType, TypeCheckerContext context ) { return switch (target) { - case UntypedTargetNode.Variable variable -> - context.toResult(new TypedTargetNode.Variable(variable.name(), target.source())); + case UntypedTargetNode.Variable variable -> { + context = context.define(variable.name(), expressionType); + + yield context.toResult(new TypedTargetNode.Variable(variable.name(), target.source())); + } }; } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java index 71a02101..2cf99f9f 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java @@ -71,6 +71,20 @@ public class TypeCheckerContext { return Optional.ofNullable(environment.get(name)); } + public TypeCheckerContext define( + String name, + Type type + ) { + // TODO: check if already defined + return new TypeCheckerContext( + this.environment.plus(name, type), + this.effect, + this.boundVariables, + this.freeVariables, + this.namespaceTypeInfo + ); + } + public Effect effect() { return effect; } -- cgit v1.2.3