summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-10-25 12:27:02 +0000
committerMichael Williamson <mike@zwobble.org>2026-10-25 12:27:02 +0000
commited546c3f79ffe43e849134843645461580aa41f4 (patch)
tree7b8a9528a2a42e363b58974a62e16d4d42ae5c3a /src/main/java
parent6d211928a40953bbebbee574fa5e8928a3ea687b (diff)
Declare database schema
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java19
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchema.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/TypeLevelValue.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java4
4 files changed, 30 insertions, 3 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 345c78c..e00ffb6 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -94,8 +94,11 @@ public class TypeChecker {
TypeCheckerNamespaceContext context
) {
return switch (untyped) {
- case UntypedDatabaseSchemaDefinitionNode _ ->
- Optional.empty();
+ case UntypedDatabaseSchemaDefinitionNode untypedDatabaseSchemaDefinition ->
+ Optional.of(declareDatabaseSchemaDefinition(
+ untypedDatabaseSchemaDefinition,
+ context
+ ));
case UntypedEnumDefinitionNode untypedEnumDefinitionNode ->
Optional.of(declareEnumDefinitionNode(untyped, context));
@@ -139,6 +142,18 @@ public class TypeChecker {
};
}
+ private static Type declareDatabaseSchemaDefinition(
+ UntypedDatabaseSchemaDefinitionNode untyped,
+ TypeCheckerNamespaceContext context
+ ) {
+ var databaseSchema = new DatabaseSchema(context.namespaceName(), untyped.name());
+ var type = Types.databaseSchema(databaseSchema);
+
+ context.declare(untyped.name(), type, untyped.source());
+
+ return type;
+ }
+
private static TypedNamespaceStatementNode defineDatabaseSchemaDefinition(
UntypedDatabaseSchemaDefinitionNode untyped,
TypeCheckerNamespaceContext context
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchema.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchema.java
new file mode 100644
index 0000000..e57d587
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchema.java
@@ -0,0 +1,8 @@
+package org.zwobble.hobgoblin.compiler.types;
+
+public record DatabaseSchema(NamespaceName namespaceName, String name) implements TypeLevelValue {
+ @Override
+ public String describe() {
+ return namespaceName.toString() + "." + name;
+ }
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeLevelValue.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeLevelValue.java
index cf62eb1..8208521 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeLevelValue.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeLevelValue.java
@@ -1,5 +1,5 @@
package org.zwobble.hobgoblin.compiler.types;
-public sealed interface TypeLevelValue permits Type, TypeConstructor {
+public sealed interface TypeLevelValue permits DatabaseSchema, Type, TypeConstructor {
String describe();
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java
index cfbb5ba..a914081 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java
@@ -26,4 +26,8 @@ public class Types {
public static Type metaType(TypeConstructor<?> constructor) {
return new TypeLevelValueType(constructor);
}
+
+ public static Type databaseSchema(DatabaseSchema databaseSchema) {
+ return new TypeLevelValueType(databaseSchema);
+ }
}