summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-06-16 21:36:49 +0100
committerMichael Williamson <mike@zwobble.org>2026-06-16 21:36:49 +0100
commit9716e0f30b5db95b0fa7ca54908ec5fbf9f1e088 (patch)
tree2c76d7ec02180de8884c0378cb3f8261f9a46f4a /src/main/java
parent365d53ad8a7bf21602e37970a34b2de116a794b2 (diff)
Implement full namespace name resolution
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java25
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java12
2 files changed, 33 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java
new file mode 100644
index 0000000..f3f8d89
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java
@@ -0,0 +1,25 @@
+package org.zwobble.hobgoblin.compiler.typechecker;
+
+import org.zwobble.hobgoblin.compiler.types.NamespaceName;
+
+import java.util.ArrayList;
+import java.util.Optional;
+
+class NamespaceNameResolution {
+ private NamespaceNameResolution() {}
+
+ static NamespaceName resolveNamespaceName(
+ NamespaceName current,
+ Optional<Integer> importedAncestorDepth,
+ NamespaceName importedNamespaceName
+ ) {
+ if (importedAncestorDepth.isEmpty()) {
+ return importedNamespaceName;
+ }
+
+ // TODO: handle invalid depth (too large).
+ var parts = new ArrayList<>(current.parts().subList(0, current.parts().size() - importedAncestorDepth.get()));
+ parts.addAll(importedNamespaceName.parts());
+ return new NamespaceName(parts);
+ }
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
index 77b46bc..98b29a9 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -8,6 +8,8 @@ import org.zwobble.hobgoblin.compiler.types.*;
import java.util.ArrayList;
import java.util.List;
+import static org.zwobble.hobgoblin.compiler.typechecker.NamespaceNameResolution.resolveNamespaceName;
+
public class TypeChecker {
private TypeChecker() {
@@ -20,11 +22,13 @@ public class TypeChecker {
var namespaceContext = context.enterNamespace(untyped.namespaceName());
for (var untypedImport : untyped.imports()) {
- if (untypedImport.ancestorDepth().isPresent()) {
- throw new UnsupportedOperationException("TODO: relative imports");
- }
+ var importedNamespace = resolveNamespaceName(
+ untyped.namespaceName(),
+ untypedImport.ancestorDepth(),
+ untypedImport.namespaceName()
+ );
- var importedNamespaceFields = context.namespaceFields(untypedImport.namespaceName());
+ var importedNamespaceFields = context.namespaceFields(importedNamespace);
for (var importedName : untypedImport.importedNames()) {
namespaceContext.define(importedName, importedNamespaceFields.get(importedName));
}