From f818776dba8bda2bf6e423da991190f3f4b4ff3f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 19 Jun 2026 17:34:46 +0100 Subject: Handle relative import with invalid ancestor depth --- .../java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java | 3 ++- .../compiler/typechecker/NamespaceNameResolution.java | 9 +++++++-- .../compiler/typechecker/RootNamespaceHasNoParentError.java | 10 ++++++++++ .../zwobble/hobgoblin/compiler/typechecker/TypeChecker.java | 3 ++- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java (limited to 'src/main') 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 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); -- cgit v1.2.3