From cfc081d9ae035f876f7f8e836ebf0811ec338c6b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 24 Jul 2026 20:15:07 +0100 Subject: Create separate errors package for type checker --- .../hobgoblin/compiler/HobgoblinCompiler.java | 2 +- .../typechecker/DuplicateVariableNameError.java | 17 ---------- .../typechecker/NamespaceNameResolution.java | 1 + .../typechecker/RootNamespaceHasNoParentError.java | 10 ------ .../typechecker/SubtypeIsMissingFieldError.java | 38 ---------------------- .../compiler/typechecker/TypeChecker.java | 1 + .../typechecker/TypeCheckerNamespaceContext.java | 1 + .../typechecker/UndeclaredVariableError.java | 17 ---------- .../typechecker/UndefinedVariableError.java | 17 ---------- .../compiler/typechecker/UnexpectedTypeError.java | 25 -------------- .../typechecker/UnknownNamespaceError.java | 18 ---------- .../typechecker/UnknownNamespaceFieldError.java | 24 -------------- .../errors/DuplicateVariableNameError.java | 17 ++++++++++ .../errors/RootNamespaceHasNoParentError.java | 10 ++++++ .../errors/SubtypeIsMissingFieldError.java | 38 ++++++++++++++++++++++ .../errors/UndeclaredVariableError.java | 17 ++++++++++ .../typechecker/errors/UndefinedVariableError.java | 17 ++++++++++ .../typechecker/errors/UnexpectedTypeError.java | 25 ++++++++++++++ .../typechecker/errors/UnknownNamespaceError.java | 18 ++++++++++ .../errors/UnknownNamespaceFieldError.java | 24 ++++++++++++++ 20 files changed, 170 insertions(+), 167 deletions(-) delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/DuplicateVariableNameError.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/SubtypeIsMissingFieldError.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndeclaredVariableError.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndefinedVariableError.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnexpectedTypeError.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java delete mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceFieldError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/DuplicateVariableNameError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/RootNamespaceHasNoParentError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/SubtypeIsMissingFieldError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndeclaredVariableError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndefinedVariableError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnexpectedTypeError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceError.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceFieldError.java (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java index d5bbf56..6c3a494 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -7,7 +7,7 @@ import org.zwobble.hobgoblin.compiler.config.ProjectConfig; import org.zwobble.hobgoblin.compiler.parser.Parser; import org.zwobble.hobgoblin.compiler.typechecker.TypeChecker; import org.zwobble.hobgoblin.compiler.typechecker.TypeCheckerGlobalContext; -import org.zwobble.hobgoblin.compiler.typechecker.UnknownNamespaceError; +import org.zwobble.hobgoblin.compiler.typechecker.errors.UnknownNamespaceError; import org.zwobble.hobgoblin.compiler.types.NamespaceName; import org.zwobble.sourcetext.SourceText; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/DuplicateVariableNameError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/DuplicateVariableNameError.java deleted file mode 100644 index 1fc79bf..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/DuplicateVariableNameError.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.zwobble.hobgoblin.compiler.typechecker; - -import org.zwobble.hobgoblin.compiler.errors.SourceError; -import org.zwobble.hobgoblin.compiler.sources.Source; - -public class DuplicateVariableNameError extends SourceError { - private final String name; - - public DuplicateVariableNameError(String name, Source source) { - super("A variable with the name " + name + " has already been declared", source); - this.name = name; - } - - public String name() { - return name; - } -} 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 e72e310..69d7abc 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/NamespaceNameResolution.java @@ -1,6 +1,7 @@ package org.zwobble.hobgoblin.compiler.typechecker; import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.typechecker.errors.RootNamespaceHasNoParentError; import org.zwobble.hobgoblin.compiler.types.NamespaceName; import java.util.ArrayList; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java deleted file mode 100644 index f688274..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/RootNamespaceHasNoParentError.java +++ /dev/null @@ -1,10 +0,0 @@ -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/SubtypeIsMissingFieldError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/SubtypeIsMissingFieldError.java deleted file mode 100644 index ce59593..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/SubtypeIsMissingFieldError.java +++ /dev/null @@ -1,38 +0,0 @@ -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.Type; - -public class SubtypeIsMissingFieldError extends SourceError { - private final Type supertype; - private final Type subtype; - private final String fieldName; - - public SubtypeIsMissingFieldError(Type supertype, Type subtype, String fieldName, Source source) { - super( - String.format( - "%s is a subtype of %s, but is missing field %s", - subtype.describe(), - supertype.describe(), - fieldName - ), - source - ); - this.supertype = supertype; - this.subtype = subtype; - this.fieldName = fieldName; - } - - public Type supertype() { - return supertype; - } - - public Type subtype() { - return subtype; - } - - public String fieldName() { - return fieldName; - } -} 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 793e1f6..d55c490 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -3,6 +3,7 @@ package org.zwobble.hobgoblin.compiler.typechecker; import org.zwobble.hobgoblin.compiler.ast.typed.*; import org.zwobble.hobgoblin.compiler.ast.untyped.*; import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.typechecker.errors.*; import org.zwobble.hobgoblin.compiler.types.*; import java.util.ArrayList; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java index 51e11d6..0a61de7 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java @@ -1,6 +1,7 @@ package org.zwobble.hobgoblin.compiler.typechecker; import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.typechecker.errors.DuplicateVariableNameError; import org.zwobble.hobgoblin.compiler.types.*; import java.util.HashMap; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndeclaredVariableError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndeclaredVariableError.java deleted file mode 100644 index c6130fa..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndeclaredVariableError.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.zwobble.hobgoblin.compiler.typechecker; - -import org.zwobble.hobgoblin.compiler.errors.SourceError; -import org.zwobble.hobgoblin.compiler.sources.Source; - -public class UndeclaredVariableError extends SourceError { - private final String variableName; - - public UndeclaredVariableError(String variableName, Source source) { - super("Undeclared variable: " + variableName, source); - this.variableName = variableName; - } - - public String variableName() { - return variableName; - } -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndefinedVariableError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndefinedVariableError.java deleted file mode 100644 index 95be5a6..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UndefinedVariableError.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.zwobble.hobgoblin.compiler.typechecker; - -import org.zwobble.hobgoblin.compiler.errors.SourceError; -import org.zwobble.hobgoblin.compiler.sources.Source; - -public class UndefinedVariableError extends SourceError { - private final String variableName; - - public UndefinedVariableError(String variableName, Source source) { - super("Variable has been declared but not defined: " + variableName, source); - this.variableName = variableName; - } - - public String variableName() { - return variableName; - } -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnexpectedTypeError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnexpectedTypeError.java deleted file mode 100644 index c2ca4b6..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnexpectedTypeError.java +++ /dev/null @@ -1,25 +0,0 @@ -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.Type; -import org.zwobble.hobgoblin.compiler.types.TypeSet; - -public class UnexpectedTypeError extends SourceError { - private final TypeSet expected; - private final Type actual; - - public UnexpectedTypeError(TypeSet expected, Type actual, Source source) { - super("Expected " + expected.describe() + " but was " + actual.describe(), source); - this.expected = expected; - this.actual = actual; - } - - public TypeSet expected() { - return expected; - } - - public Type actual() { - return actual; - } -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java deleted file mode 100644 index 1ca4ac7..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceError.java +++ /dev/null @@ -1,18 +0,0 @@ -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 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; - } -} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceFieldError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceFieldError.java deleted file mode 100644 index 52f8b0a..0000000 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/UnknownNamespaceFieldError.java +++ /dev/null @@ -1,24 +0,0 @@ -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/typechecker/errors/DuplicateVariableNameError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/DuplicateVariableNameError.java new file mode 100644 index 0000000..9c07095 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/DuplicateVariableNameError.java @@ -0,0 +1,17 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; + +public class DuplicateVariableNameError extends SourceError { + private final String name; + + public DuplicateVariableNameError(String name, Source source) { + super("A variable with the name " + name + " has already been declared", source); + this.name = name; + } + + public String name() { + return name; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/RootNamespaceHasNoParentError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/RootNamespaceHasNoParentError.java new file mode 100644 index 0000000..0036c37 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/RootNamespaceHasNoParentError.java @@ -0,0 +1,10 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +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/errors/SubtypeIsMissingFieldError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/SubtypeIsMissingFieldError.java new file mode 100644 index 0000000..0ec1000 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/SubtypeIsMissingFieldError.java @@ -0,0 +1,38 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.types.Type; + +public class SubtypeIsMissingFieldError extends SourceError { + private final Type supertype; + private final Type subtype; + private final String fieldName; + + public SubtypeIsMissingFieldError(Type supertype, Type subtype, String fieldName, Source source) { + super( + String.format( + "%s is a subtype of %s, but is missing field %s", + subtype.describe(), + supertype.describe(), + fieldName + ), + source + ); + this.supertype = supertype; + this.subtype = subtype; + this.fieldName = fieldName; + } + + public Type supertype() { + return supertype; + } + + public Type subtype() { + return subtype; + } + + public String fieldName() { + return fieldName; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndeclaredVariableError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndeclaredVariableError.java new file mode 100644 index 0000000..d3694d8 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndeclaredVariableError.java @@ -0,0 +1,17 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; + +public class UndeclaredVariableError extends SourceError { + private final String variableName; + + public UndeclaredVariableError(String variableName, Source source) { + super("Undeclared variable: " + variableName, source); + this.variableName = variableName; + } + + public String variableName() { + return variableName; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndefinedVariableError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndefinedVariableError.java new file mode 100644 index 0000000..556e35b --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UndefinedVariableError.java @@ -0,0 +1,17 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; + +public class UndefinedVariableError extends SourceError { + private final String variableName; + + public UndefinedVariableError(String variableName, Source source) { + super("Variable has been declared but not defined: " + variableName, source); + this.variableName = variableName; + } + + public String variableName() { + return variableName; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnexpectedTypeError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnexpectedTypeError.java new file mode 100644 index 0000000..9334663 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnexpectedTypeError.java @@ -0,0 +1,25 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.types.Type; +import org.zwobble.hobgoblin.compiler.types.TypeSet; + +public class UnexpectedTypeError extends SourceError { + private final TypeSet expected; + private final Type actual; + + public UnexpectedTypeError(TypeSet expected, Type actual, Source source) { + super("Expected " + expected.describe() + " but was " + actual.describe(), source); + this.expected = expected; + this.actual = actual; + } + + public TypeSet expected() { + return expected; + } + + public Type actual() { + return actual; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceError.java new file mode 100644 index 0000000..2d8329b --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceError.java @@ -0,0 +1,18 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +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; + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceFieldError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceFieldError.java new file mode 100644 index 0000000..a1f0df1 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/UnknownNamespaceFieldError.java @@ -0,0 +1,24 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +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; + } +} -- cgit v1.2.3