diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-20 18:55:42 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-20 18:55:55 +0100 |
| commit | 8c9b4c92c1493d96d4bb2a5b88bf9e98e3a584e2 (patch) | |
| tree | 876266a4f385d8c373538d74aa243949d7ae21fc /src/main/java | |
| parent | ef4b9d4241777933cfba1a7140597a36c8d93638 (diff) | |
Support import of namespaces in type checker
Diffstat (limited to 'src/main/java')
4 files changed, 17 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java index 4a2f68c3..164feb6f 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java @@ -27,6 +27,10 @@ public record UntypedNamespaceNode( return new UntypedNamespaceNode(namespaceName, imports, body, Sources.NULL); } + public Builder addImport(UntypedImportNode import_) { + return new Builder(namespaceName, imports.plus(import_), body); + } + public Builder addStatement(UntypedNamespaceStatementNode statement) { return new Builder(namespaceName, imports, body.plus(statement)); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index e429d246..9157356d 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -672,6 +672,14 @@ public class TypeChecker { ) { var namespaceEnvironment = EnvironmentBuilder.EMPTY; + for (var import_ : untyped.imports()) { + namespaceEnvironment = namespaceEnvironment.add( + import_.namespaceName().parts().getLast(), + Variable.defined(new NamespaceType(import_.namespaceName()), VariableType.IMPORT), + import_.source() + ); + } + for (var statement : untyped.body()) { var declaredVariables = DeclaredVariables.forNamespaceStatement(statement, P.vector()); namespaceEnvironment = namespaceEnvironment.addUndefined(declaredVariables); diff --git a/src/main/java/org/shedlang/compiler/typechecker/VariableType.java b/src/main/java/org/shedlang/compiler/typechecker/VariableType.java index 7b6b646e..64652060 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/VariableType.java +++ b/src/main/java/org/shedlang/compiler/typechecker/VariableType.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.typechecker; public enum VariableType { CONSTANT, + IMPORT, PARAM, VAL, VAR, diff --git a/src/main/java/org/shedlang/compiler/types/Types.java b/src/main/java/org/shedlang/compiler/types/Types.java index 3e5e1b39..c349e27e 100644 --- a/src/main/java/org/shedlang/compiler/types/Types.java +++ b/src/main/java/org/shedlang/compiler/types/Types.java @@ -14,6 +14,10 @@ public class Types { public static final Type TOP = TopType.INSTANCE; public static final Type UNIT = UnitType.INSTANCE; + public static Type namespace(NamespaceName namespaceName) { + return new NamespaceType(namespaceName); + } + public static StructType struct(NamespaceName namespaceName, String name) { return new StructType(namespaceName, name); } |
