From 8349f31ec76c330c12ebdd7e5fb1d036175030a7 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 28 Jul 2023 19:11:15 +0100 Subject: Store bound variable names in typed block node --- .../org/shedlang/compiler/ast/typed/TypedBlockNode.java | 6 ++++++ .../compiler/ast/typed/TypedFunctionDefinitionNode.java | 3 ++- .../compiler/typechecker/EnvironmentBuilder.java | 6 ++++++ .../org/shedlang/compiler/typechecker/TypeChecker.java | 16 +++++++++------- 4 files changed, 23 insertions(+), 8 deletions(-) (limited to 'src/main/java') 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 if expressions. + */ public record TypedBlockNode( List statements, + List 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 build() { return environment; } + + public List 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 typeCheckBlock( UntypedBlockNode untyped, + List 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(); -- cgit v1.2.3