summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-11-01 21:16:49 +0000
committerMichael Williamson <mike@zwobble.org>2026-11-01 21:16:49 +0000
commit1390becc9814e78f94fa01299b1b04acadfbfe46 (patch)
tree9e8b1818b3e3a4e60a38026d994e30c4a9a7680e /src
parentc5fd3e34f18f0773d1283fc5ed06fb289053e162 (diff)
Check handling of non-type-level values
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/TypeSet.java7
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java28
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java2
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java2
5 files changed, 33 insertions, 8 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 a7fe03f..d73c245 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -642,7 +642,7 @@ public class TypeChecker {
// TODO: handle not a type-level value
if (!(type instanceof TypeLevelValueType(TypeLevelValue value))) {
- throw new UnexpectedTypeError(new TypeSet.MetaType(), type, source);
+ throw new UnexpectedTypeError(new TypeSet.TypeLevelValue(), type, source);
}
return value;
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeSet.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeSet.java
index c3896d9..3a64b85 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeSet.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeSet.java
@@ -23,4 +23,11 @@ public sealed interface TypeSet {
return "type constructor";
}
}
+
+ record TypeLevelValue() implements TypeSet {
+ @Override
+ public String describe() {
+ return "type-level value";
+ }
+ }
}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java
index 1c4d276..2d63eae 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java
@@ -2,18 +2,18 @@ package org.zwobble.hobgoblin.compiler.typechecker;
import org.junit.jupiter.api.Test;
import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReferenceNode;
+import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
import org.zwobble.hobgoblin.compiler.sources.NullSource;
-import org.zwobble.hobgoblin.compiler.types.DatabaseSchema;
-import org.zwobble.hobgoblin.compiler.types.NamespaceName;
-import org.zwobble.hobgoblin.compiler.types.Table;
-import org.zwobble.hobgoblin.compiler.types.Types;
+import org.zwobble.hobgoblin.compiler.typechecker.errors.UnexpectedTypeError;
+import org.zwobble.hobgoblin.compiler.types.*;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.equalTo;
public class TypeCheckerEvalExpressionTests {
@Test
- public void canEvaluateReference() {
+ public void whenVariableIsTypeLevelValueThenCanEvaluateReference() {
var untyped = UntypedReferenceNode.arbitrary()
.withName("authors")
.build();
@@ -28,4 +28,22 @@ public class TypeCheckerEvalExpressionTests {
assertThat(typed, equalTo(table));
}
+
+ @Test
+ public void whenVariableIsNotTypeLevelValueThenCannotEvaluateReference() {
+ var untyped = UntypedReferenceNode.arbitrary()
+ .withName("count")
+ .build();
+ var globalContext = TypeCheckerContextArb.globalContext();
+ var namespaceName = NamespaceName.of("App");
+ var namespaceContext = globalContext.enterNamespace(namespaceName);
+ namespaceContext.declare("count", NativeTypes.INT_32, NullSource.INSTANCE);
+
+ var error = assertThrows(
+ UnexpectedTypeError.class,
+ () -> TypeChecker.evalExpression(untyped, namespaceContext)
+ );
+
+ assertThat(error.expected(), equalTo(new TypeSet.TypeLevelValue()));
+ }
}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java
index 074d1df..713cd13 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java
@@ -27,7 +27,7 @@ public class TypeCheckerMetaTypeTests {
() -> TypeChecker.typeCheckMetaType(untyped, context)
);
- assertThat(error.expected(), equalTo(new TypeSet.MetaType()));
+ assertThat(error.expected(), equalTo(new TypeSet.TypeLevelValue()));
assertThat(error.actual(), equalTo(nativeType));
}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java
index 084be46..98f4f22 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java
@@ -40,7 +40,7 @@ public class TypeCheckerTypeLevelReferenceTests {
() -> TypeChecker.typeCheckTypeLevelExpression(untyped, context)
);
- assertThat(error.expected(), equalTo(new TypeSet.MetaType()));
+ assertThat(error.expected(), equalTo(new TypeSet.TypeLevelValue()));
assertThat(error.actual(), equalTo(nativeType));
}