diff options
Diffstat (limited to 'src/main/java')
3 files changed, 34 insertions, 5 deletions
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 e9e7e74..78bdc97 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -31,7 +31,13 @@ public class TypeChecker { var importedNamespaceFields = context.namespaceFields(importedNamespace); for (var importedName : untypedImport.importedNames()) { - namespaceContext.declare(importedName, importedNamespaceFields.get(importedName)); + var fieldType = importedNamespaceFields.fieldType(importedName) + .orElseThrow(() -> new UnknownNamespaceFieldError( + importedName, + importedNamespace, + untypedImport.source() + )); + namespaceContext.declare(importedName, fieldType); } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceFieldError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceFieldError.java new file mode 100644 index 0000000..52f8b0a --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceFieldError.java @@ -0,0 +1,24 @@ +package org.zwobble.hobgoblin.compiler.typechecker; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.types.NamespaceName; + +public class UnknownNamespaceFieldError extends SourceError { + private final String fieldName; + private final NamespaceName namespaceName; + + public UnknownNamespaceFieldError(String fieldName, NamespaceName namespaceName, Source source) { + super("Unknown field " + fieldName + " on " + namespaceName, source); + this.fieldName = fieldName; + this.namespaceName = namespaceName; + } + + public String fieldName() { + return fieldName; + } + + public NamespaceName namespaceName() { + return namespaceName; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/Fields.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/Fields.java index 4fc364e..013a844 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/types/Fields.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/Fields.java @@ -1,6 +1,7 @@ package org.zwobble.hobgoblin.compiler.types; import java.util.List; +import java.util.Optional; public class Fields { private final List<Field> fields; @@ -9,12 +10,10 @@ public class Fields { this.fields = fields; } - public Type get(String name) { + public Optional<Type> fieldType(String name) { return fields.stream() .filter(field -> field.name().equals(name)) .findFirst() - // TODO: better error handling - .orElseThrow() - .type(); + .map(field -> field.type()); } } |
