diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-20 20:02:13 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-20 20:02:13 +0000 |
| commit | 5a9bf0b81e43a747fccd59dedaeb8432431e4e1a (patch) | |
| tree | 58ebfdbf85ef63a743319c268cd83c56ae7d0f94 /src/main/java | |
| parent | 33888c1bac8a1e58fae55f275a0d0eafd16144c5 (diff) | |
Store whether bound variable is mutable or not
Diffstat (limited to 'src/main/java')
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(); |
