diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-31 22:13:28 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-31 22:13:28 +0100 |
| commit | ee3d75f1f230ae05803db83ce387eb8b79bc1d95 (patch) | |
| tree | 644233f3911d7dd5cf305949924f30b7650c20b3 /src/main/java | |
| parent | 517f94350bd4dabe0b681b5da2febdbf76e37585 (diff) | |
Extract Variable to be top-level interface
Diffstat (limited to 'src/main/java')
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 { + } +} |
