summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-10-04 11:06:26 +0100
committerMichael Williamson <mike@zwobble.org>2026-10-04 11:06:26 +0100
commit78e75def13c9a0890f6a3880a95184fedc7ee13d (patch)
tree24007a6897470a455292a60c60f2ee70bc347723
parentbe4da80bead1f5d4879919f88acfa22a9e638c20 (diff)
Support empty database schema definition
-rw-r--r--examples/18-database/hobgoblin.json58
-rw-r--r--examples/18-database/src/data.hob17
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java19
3 files changed, 36 insertions, 8 deletions
diff --git a/examples/18-database/hobgoblin.json5 b/examples/18-database/hobgoblin.json5
new file mode 100644
index 0000000..3b36468
--- /dev/null
+++ b/examples/18-database/hobgoblin.json5
@@ -0,0 +1,8 @@
+{
+ outputs: {
+ langs: {
+ },
+ generators: [
+ ],
+ }
+}
diff --git a/examples/18-database/src/data.hob b/examples/18-database/src/data.hob
new file mode 100644
index 0000000..6ee3813
--- /dev/null
+++ b/examples/18-database/src/data.hob
@@ -0,0 +1,17 @@
+struct StructWithInt32 {
+ field a: Int32;
+ field b: Int32;
+}
+
+databaseSchema Data {
+// table structs: StructWithInt32;
+//
+// query fetchAllStructs() {
+// select(structs)
+// }
+//
+// query fetchStructsByA(a: Int32) {
+// select(structs)
+// .where(structs.a = a)
+// }
+}
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 e1c6854..8178d8d 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -36,8 +36,11 @@ public class TypeChecker {
var fields = new ArrayList<Field>();
for (var untypedStatement : untypedNamespace.body()) {
var type = declareNamespaceStatement(untypedStatement, namespaceContext);
- var field = new Field(untypedStatement.name(), type, untypedStatement.source());
- fields.add(field);
+
+ if (type.isPresent()) {
+ var field = new Field(untypedStatement.name(), type.get(), untypedStatement.source());
+ fields.add(field);
+ }
}
context.defineNamespace(untypedNamespace.namespaceName(), fields);
}
@@ -85,25 +88,25 @@ public class TypeChecker {
return typedNamespaceNodes;
}
- static Type declareNamespaceStatement(
+ static Optional<Type> declareNamespaceStatement(
UntypedNamespaceStatementNode untyped,
TypeCheckerNamespaceContext context
) {
return switch (untyped) {
case UntypedDatabaseSchemaDefinitionNode _ ->
- throw new UnsupportedOperationException("TODO");
+ Optional.empty();
case UntypedEnumDefinitionNode untypedEnumDefinitionNode ->
- declareEnumDefinitionNode(untyped, context);
+ Optional.of(declareEnumDefinitionNode(untyped, context));
case UntypedNativeTypeDefinitionNode untypedNativeTypeDefinition ->
- declareNativeTypeDefinition(untypedNativeTypeDefinition, context);
+ Optional.of(declareNativeTypeDefinition(untypedNativeTypeDefinition, context));
case UntypedStructDefinitionNode untypedStructDefinition ->
- declareStructDefinition(untypedStructDefinition, context);
+ Optional.of(declareStructDefinition(untypedStructDefinition, context));
case UntypedSumDefinitionNode untypedSumDefinition ->
- declareSumDefinition(untypedSumDefinition, context);
+ Optional.of(declareSumDefinition(untypedSumDefinition, context));
};
}