aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-20 20:02:13 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-20 20:02:13 +0000
commit5a9bf0b81e43a747fccd59dedaeb8432431e4e1a (patch)
tree58ebfdbf85ef63a743319c268cd83c56ae7d0f94 /src/main/java
parent33888c1bac8a1e58fae55f275a0d0eafd16144c5 (diff)
Store whether bound variable is mutable or not
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/BoundVariable.java8
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java7
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java14
3 files changed, 17 insertions, 12 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/BoundVariable.java b/src/main/java/org/shedlang/compiler/ast/typed/BoundVariable.java
index dcd2d113..f2c76c06 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/BoundVariable.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/BoundVariable.java
@@ -1,7 +1,11 @@
package org.shedlang.compiler.ast.typed;
-public record BoundVariable(String name) {
+public record BoundVariable(String name, boolean isMutable) {
public static BoundVariable immutable(String name) {
- return new BoundVariable(name);
+ return new BoundVariable(name, false);
+ }
+
+ public static BoundVariable mutable(String name) {
+ return new BoundVariable(name, true);
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java b/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java
index 85292f8c..6a5e32a2 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java
@@ -2,6 +2,7 @@ package org.shedlang.compiler.typechecker;
import org.pcollections.Empty;
import org.pcollections.PMap;
+import org.shedlang.compiler.ast.typed.BoundVariable;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.typechecker.errors.DuplicateVariableNameError;
@@ -46,7 +47,9 @@ public class EnvironmentBuilder {
return environment;
}
- public List<String> names() {
- return environment.keySet().stream().toList();
+ public List<BoundVariable> toBoundVariables() {
+ return environment.entrySet().stream()
+ .map(entry -> new BoundVariable(entry.getKey(), entry.getValue().isMutable()))
+ .toList();
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 1ea3b680..27210ec5 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -213,7 +213,7 @@ public class TypeChecker {
private static TypeCheckerResult<TypedBlockNode> typeCheckBlock(
UntypedBlockNode untyped,
- List<String> declaredVariableNames,
+ List<BoundVariable> declaredVariables,
TypeCheckerContext context
) {
var typedStatementsResult = context.mapWithContext(
@@ -225,9 +225,7 @@ public class TypeChecker {
var typed = new TypedBlockNode(
typedStatements,
- declaredVariableNames.stream()
- .map(BoundVariable::new)
- .toList(),
+ declaredVariables,
untyped.source()
);
@@ -246,7 +244,7 @@ public class TypeChecker {
context = context.enterBlock(bodyEnvironment.build());
- var typedBodyResult = typeCheckBlock(untyped, bodyEnvironment.names(), context);
+ var typedBodyResult = typeCheckBlock(untyped, bodyEnvironment.toBoundVariables(), context);
var typedBody = typedBodyResult.value();
context = typedBodyResult.context();
@@ -584,7 +582,7 @@ public class TypeChecker {
signature.returnTypeState()
);
- var bodyResult = typeCheckBlock(untyped, bodyEnvironment.names(), context);
+ var bodyResult = typeCheckBlock(untyped, bodyEnvironment.toBoundVariables(), context);
var typedBody = bodyResult.value();
context = bodyResult.context();
@@ -1684,7 +1682,7 @@ public class TypeChecker {
context = context.enterTryBody(bodyEnvironment.build(), typedHandledEffect.value());
- var typedBodyResult = typeCheckBlock(untyped.body(), bodyEnvironment.names(), context);
+ var typedBodyResult = typeCheckBlock(untyped.body(), bodyEnvironment.toBoundVariables(), context);
var typedBody = typedBodyResult.value();
context = typedBodyResult.context();
@@ -1907,7 +1905,7 @@ public class TypeChecker {
context = context.updateType(variableName.get(), typedCaseType.value(), untyped.source());
}
- var typedBodyResult = typeCheckBlock(untyped.body(), bodyEnvironment.names(), context);
+ var typedBodyResult = typeCheckBlock(untyped.body(), bodyEnvironment.toBoundVariables(), context);
var typedBody = typedBodyResult.value();
context = typedBodyResult.context();