From 4f211efe89c3d86073369fc4b609ec8498aa61db Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 19 Jun 2026 17:48:16 +0100 Subject: Handle unknown namespace in import type checking --- .../org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java | 4 +++- .../hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java | 5 ++--- .../hobgoblin/compiler/typechecker/UnknownNamespaceError.java | 7 +++++++ 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src/main') 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 78bdc97..384ef19 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -29,7 +29,9 @@ public class TypeChecker { untypedImport.source() ); - var importedNamespaceFields = context.namespaceFields(importedNamespace); + var importedNamespaceFields = context.namespaceFields(importedNamespace) + .orElseThrow(() -> new UnknownNamespaceError(importedNamespace, untypedImport.source())); + for (var importedName : untypedImport.importedNames()) { var fieldType = importedNamespaceFields.fieldType(importedName) .orElseThrow(() -> new UnknownNamespaceFieldError( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java index e50e424..ff6cd5e 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java @@ -43,8 +43,7 @@ public class TypeCheckerGlobalContext { this.namespaceFieldsOf.put(namespaceName, new Fields(fields)); } - public Fields namespaceFields(NamespaceName namespaceName) { - // TODO: better error handling - return Optional.ofNullable(namespaceFieldsOf.get(namespaceName)).orElseThrow(); + public Optional namespaceFields(NamespaceName namespaceName) { + return Optional.ofNullable(namespaceFieldsOf.get(namespaceName)); } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java index fb06f3b..1ca4ac7 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java @@ -5,7 +5,14 @@ import org.zwobble.hobgoblin.compiler.sources.Source; import org.zwobble.hobgoblin.compiler.types.NamespaceName; public class UnknownNamespaceError extends SourceError { + private final NamespaceName namespaceName; + public UnknownNamespaceError(NamespaceName namespaceName, Source source) { super("Unknown namespace: " + namespaceName, source); + this.namespaceName = namespaceName; + } + + public NamespaceName namespaceName() { + return namespaceName; } } -- cgit v1.2.3