aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-28 19:11:15 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-28 19:11:15 +0100
commit8349f31ec76c330c12ebdd7e5fb1d036175030a7 (patch)
tree40f78b176282f33b691a0e20e89a0fab89188ff9 /src/main/java
parent65ab9014d79e2236208ab899710ee7ac1ba81aa1 (diff)
Store bound variable names in typed block node
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedBlockNode.java6
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java6
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java16
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();