aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-03 12:11:20 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-03 12:11:20 +0100
commit9a79e487595ac1fdbf4e9c69963440bd979aa107 (patch)
tree91e3099883de790e126d390672afb2085748b7c6 /src/main/java
parent79886c47c164aafb25c533ecc20cb93554fa2c08 (diff)
Define val type
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;
}