diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-06-19 17:34:46 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-06-19 17:34:46 +0100 |
| commit | f818776dba8bda2bf6e423da991190f3f4b4ff3f (patch) | |
| tree | 8a226b6ec4ca4b67e625d82310f677ca48771c28 /src/main | |
| parent | a31c0145beb998c9f83d61770ba03f9230610c87 (diff) | |
Handle relative import with invalid ancestor depth
Diffstat (limited to 'src/main')
4 files changed, 21 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java index 9dba876..f4c3add 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -84,7 +84,8 @@ public class HobgoblinCompiler { var importedNamespaceName = resolveNamespaceName( namespaceNode.namespaceName(), importNode.ancestorDepth(), - importNode.namespaceName() + importNode.namespaceName(), + importNode.source() ); if (!handledNamespaceNames.contains(importedNamespaceName)) { unhandledDependencies.add( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java index 28b709f..ec6187d 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java @@ -1,5 +1,6 @@ package org.zwobble.hobgoblin.compiler.typechecker; +import org.zwobble.hobgoblin.compiler.sources.Source; import org.zwobble.hobgoblin.compiler.types.NamespaceName; import java.util.ArrayList; @@ -11,13 +12,17 @@ public class NamespaceNameResolution { public static NamespaceName resolveNamespaceName( NamespaceName current, Optional<Integer> importedAncestorDepth, - NamespaceName importedNamespaceName + NamespaceName importedNamespaceName, + Source source ) { if (importedAncestorDepth.isEmpty()) { return importedNamespaceName; } - // TODO: handle invalid depth (too large). + if (importedAncestorDepth.get() > current.parts().size()) { + throw new RootNamespaceHasNoParentError(source); + } + // TODO: should always skip right-most part? For instance, within src/line.hob, does ./point reference src/point.hob or src/line/point.hob? var parts = new ArrayList<>(current.parts().subList(0, current.parts().size() - importedAncestorDepth.get())); parts.addAll(importedNamespaceName.parts()); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java new file mode 100644 index 0000000..f688274 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java @@ -0,0 +1,10 @@ +package org.zwobble.hobgoblin.compiler.typechecker; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; + +public class RootNamespaceHasNoParentError extends SourceError { + public RootNamespaceHasNoParentError(Source source) { + super("Root namespace has no parent", source); + } +} 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 abc4bec..e9e7e74 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -25,7 +25,8 @@ public class TypeChecker { var importedNamespace = resolveNamespaceName( untyped.namespaceName(), untypedImport.ancestorDepth(), - untypedImport.namespaceName() + untypedImport.namespaceName(), + untypedImport.source() ); var importedNamespaceFields = context.namespaceFields(importedNamespace); |
