aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-31 22:13:28 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-31 22:13:28 +0100
commitee3d75f1f230ae05803db83ce387eb8b79bc1d95 (patch)
tree644233f3911d7dd5cf305949924f30b7650c20b3 /src/main/java
parent517f94350bd4dabe0b681b5da2febdbf76e37585 (diff)
Extract Variable to be top-level interface
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java10
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java10
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java15
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/Variable.java19
4 files changed, 30 insertions, 24 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java b/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java
index 53853305..c30c745a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/EnvironmentBuilder.java
@@ -11,9 +11,9 @@ import java.util.List;
public class EnvironmentBuilder {
public static final EnvironmentBuilder EMPTY = new EnvironmentBuilder(Empty.map());
- private PMap<String, TypeCheckerContext.Variable> environment;
+ private PMap<String, Variable> environment;
- private EnvironmentBuilder(PMap<String, TypeCheckerContext.Variable> environment) {
+ private EnvironmentBuilder(PMap<String, Variable> environment) {
this.environment = environment;
}
@@ -31,17 +31,17 @@ public class EnvironmentBuilder {
if (environment.containsKey(name)) {
throw new DuplicateVariableName(name, source);
}
- return new EnvironmentBuilder(environment.plus(name, new TypeCheckerContext.Variable.Undefined()));
+ return new EnvironmentBuilder(environment.plus(name, new Variable.Undefined()));
}
- public EnvironmentBuilder add(String name, TypeCheckerContext.Variable variable, Source source) {
+ public EnvironmentBuilder add(String name, Variable variable, Source source) {
if (environment.containsKey(name)) {
throw new DuplicateVariableName(name, source);
}
return new EnvironmentBuilder(environment.plus(name, variable));
}
- public PMap<String, TypeCheckerContext.Variable> build() {
+ public PMap<String, Variable> build() {
return environment;
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index ee35fa1f..5377f562 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -49,10 +49,10 @@ public class TypeChecker {
}
return switch (type.get()) {
- case TypeCheckerContext.Variable.Defined defined ->
+ case Variable.Defined defined ->
defined.type();
- case TypeCheckerContext.Variable.Undefined undefined ->
+ case Variable.Undefined undefined ->
throw new ReferenceBeforeDefinitionError(name, source);
};
}
@@ -64,10 +64,10 @@ public class TypeChecker {
}
return switch (type.get()) {
- case TypeCheckerContext.Variable.Defined defined ->
+ case Variable.Defined defined ->
defined.type();
- case TypeCheckerContext.Variable.Undefined undefined ->
+ case Variable.Undefined undefined ->
throw new ReferenceBeforeDefinitionError(name, source);
};
});
@@ -458,7 +458,7 @@ public class TypeChecker {
for (var param : typedParams.all()) {
bodyEnvironment = bodyEnvironment.add(
param.name(),
- TypeCheckerContext.defined(param.type().value()),
+ Variable.defined(param.type().value()),
param.source()
);
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
index d6a10d35..30778094 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
@@ -30,19 +30,6 @@ public class TypeCheckerContext {
))
);
- public sealed interface Variable {
- record Undefined() implements Variable {}
- record Defined(Type type) implements Variable {}
- }
-
- public static Variable defined(Type type) {
- return new Variable.Defined(type);
- }
-
- public static Variable undefined() {
- return new Variable.Undefined();
- }
-
private sealed interface StackElement {
boolean isBoundInElement(String name);
StackElement withFreeVariable(String name, Source referenceSource);
@@ -152,7 +139,7 @@ public class TypeCheckerContext {
public TypeCheckerContext enterNamespaceWithDefinedVariables(PMap<String, Type> variables) {
var environment = variables.entrySet().stream()
- .map(x -> Map.entry(x.getKey(), TypeCheckerContext.defined(x.getValue())))
+ .map(x -> Map.entry(x.getKey(), Variable.defined(x.getValue())))
.collect(PCollectors.toMap());
return enterNamespace(environment);
diff --git a/src/main/java/org/shedlang/compiler/typechecker/Variable.java b/src/main/java/org/shedlang/compiler/typechecker/Variable.java
new file mode 100644
index 00000000..7fd7ca23
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/Variable.java
@@ -0,0 +1,19 @@
+package org.shedlang.compiler.typechecker;
+
+import org.shedlang.compiler.types.Type;
+
+public sealed interface Variable {
+ static Variable defined(Type type) {
+ return new Variable.Defined(type);
+ }
+
+ static Variable undefined() {
+ return new Variable.Undefined();
+ }
+
+ record Undefined() implements Variable {
+ }
+
+ record Defined(Type type) implements Variable {
+ }
+}