aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java10
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java14
2 files changed, 21 insertions, 3 deletions
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<TypedTargetNode> 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;
}