aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-20 18:55:42 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-20 18:55:55 +0100
commit8c9b4c92c1493d96d4bb2a5b88bf9e98e3a584e2 (patch)
tree876266a4f385d8c373538d74aa243949d7ae21fc /src/main/java
parentef4b9d4241777933cfba1a7140597a36c8d93638 (diff)
Support import of namespaces in type checker
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java4
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java8
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/VariableType.java1
-rw-r--r--src/main/java/org/shedlang/compiler/types/Types.java4
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);
}