diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-28 19:11:15 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-28 19:11:15 +0100 |
| commit | 8349f31ec76c330c12ebdd7e5fb1d036175030a7 (patch) | |
| tree | 40f78b176282f33b691a0e20e89a0fab89188ff9 /src/main/java | |
| parent | 65ab9014d79e2236208ab899710ee7ac1ba81aa1 (diff) | |
Store bound variable names in typed block node
Diffstat (limited to 'src/main/java')
4 files changed, 23 insertions, 8 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedBlockNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedBlockNode.java index 5c0c8435..9753f974 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedBlockNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedBlockNode.java @@ -7,8 +7,14 @@ import org.shedlang.compiler.util.Lists; import java.util.List; +/** + * @param boundVariableNames The names of variables that are bound in the + * block's scope, not including any children scopes + * such as the bodies of <code>if</code> expressions. + */ public record TypedBlockNode( List<? extends TypedFunctionStatementNode> statements, + List<String> boundVariableNames, Source source ) implements TypedNode { public TypedFunctionStatementBehaviour behaviour() { diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java index 2b14e345..b450158b 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java @@ -6,6 +6,7 @@ import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.*; +import java.util.List; import java.util.Optional; public record TypedFunctionDefinitionNode( @@ -76,7 +77,7 @@ public record TypedFunctionDefinitionNode( effect, returnType, freeVariables.build(), - new TypedBlockNode(body, Sources.NULL), + new TypedBlockNode(body, List.of(), Sources.NULL), Sources.NULL ); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java b/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java index 79c0a25e..53853305 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java +++ b/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java @@ -6,6 +6,8 @@ import org.shedlang.compiler.ast.untyped.UntypedVariableDeclarationNode; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.typechecker.errors.DuplicateVariableName; +import java.util.List; + public class EnvironmentBuilder { public static final EnvironmentBuilder EMPTY = new EnvironmentBuilder(Empty.map()); @@ -42,4 +44,8 @@ public class EnvironmentBuilder { public PMap<String, TypeCheckerContext.Variable> build() { return environment; } + + public List<String> names() { + return environment.keySet().stream().toList(); + } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 4ec4d5dc..bd02d88b 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -10,10 +10,7 @@ import org.shedlang.compiler.types.*; import org.shedlang.compiler.util.P; import org.shedlang.compiler.util.PCollectors; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -186,6 +183,7 @@ public class TypeChecker { private static TypeCheckerResult<TypedBlockNode> typeCheckBlock( UntypedBlockNode untyped, + List<String> declaredVariableNames, TypeCheckerContext context ) { var typedStatementsResult = context.mapWithContext( @@ -195,7 +193,11 @@ public class TypeChecker { var typedStatements = typedStatementsResult.value(); context = typedStatementsResult.context(); - var typed = new TypedBlockNode(typedStatements, untyped.source()); + var typed = new TypedBlockNode( + typedStatements, + declaredVariableNames, + untyped.source() + ); return context.toResult(typed); } @@ -212,7 +214,7 @@ public class TypeChecker { context = context.enterBlock(bodyEnvironment.build()); - var typedBodyResult = typeCheckBlock(untyped, context); + var typedBodyResult = typeCheckBlock(untyped, bodyEnvironment.names(), context); var typedBody = typedBodyResult.value(); context = typedBodyResult.context(); @@ -450,7 +452,7 @@ public class TypeChecker { functionType.returnType() ); - var bodyResult = typeCheckBlock(untyped.body(), context); + var bodyResult = typeCheckBlock(untyped.body(), bodyEnvironment.names(), context); var typedBody = bodyResult.value(); context = bodyResult.context(); |
