From 5a9bf0b81e43a747fccd59dedaeb8432431e4e1a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 20 Nov 2023 20:02:13 +0000 Subject: Store whether bound variable is mutable or not --- .../org/shedlang/compiler/ast/typed/BoundVariable.java | 8 ++++++-- .../shedlang/compiler/typechecker/EnvironmentBuilder.java | 7 +++++-- .../org/shedlang/compiler/typechecker/TypeChecker.java | 14 ++++++-------- 3 files changed, 17 insertions(+), 12 deletions(-) (limited to 'src/main/java') 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 names() { - return environment.keySet().stream().toList(); + public List 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 typeCheckBlock( UntypedBlockNode untyped, - List declaredVariableNames, + List 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(); -- cgit v1.2.3