summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-10-31 10:38:04 +0000
committerMichael Williamson <mike@zwobble.org>2026-10-31 10:38:34 +0000
commitda5f2e83708371b1497665c7d0ee8f382898247c (patch)
treef21f27e34278b2bdae61f3bbc49775e80f63c3c1 /src/main/java
parent6efdb8a8aaa87d5497de989b4f8e4ee26d2bdd54 (diff)
Evaluate reference in query body
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedQueryDefinitionNode.java16
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java52
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/Table.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
6 files changed, 84 insertions, 6 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedQueryDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedQueryDefinitionNode.java
index abfe470..2c3f518 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedQueryDefinitionNode.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedQueryDefinitionNode.java
@@ -7,32 +7,38 @@ package org.zwobble.hobgoblin.compiler.ast.typed;
public record TypedQueryDefinitionNode(
String name,
+ org.zwobble.hobgoblin.compiler.types.Table table,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
org.zwobble.hobgoblin.compiler.sources.Source source
) implements org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceStatementNode {
public static org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder arbitrary() {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder("", org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder("", org.zwobble.hobgoblin.compiler.types.HobgoblinNativeTypes.arbitraryTable(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
}
public record Builder(
String name,
+ org.zwobble.hobgoblin.compiler.types.Table table,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
org.zwobble.hobgoblin.compiler.sources.Source source
) implements org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceStatementNode.Builder {
public org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode build() {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode(name, table, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder withName(String name) {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder(name, table, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder withTable(org.zwobble.hobgoblin.compiler.types.Table table) {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder(name, table, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder(name, table, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder withSource(org.zwobble.hobgoblin.compiler.sources.Source source) {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder(name, table, docComment, source);
}
// Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedQueryDefinitionNode.Builder body
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 10dfc20..32acc82 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -22,6 +22,8 @@ public class TypeChecker {
private TypeChecker() {
}
+ // == Namespaces ==
+
public static List<TypedNamespaceNode> typeCheckNamespaces(
List<UntypedNamespaceNode> untypedNamespaces,
TypeCheckerGlobalContext context
@@ -90,6 +92,8 @@ public class TypeChecker {
return typedNamespaceNodes;
}
+ // == Namespace statements ==
+
static Optional<Type> declareNamespaceStatement(
UntypedNamespaceStatementNode untyped,
TypeCheckerNamespaceContext context
@@ -282,8 +286,12 @@ public class TypeChecker {
UntypedQueryDefinitionNode untyped,
TypeCheckerNamespaceContext context
) {
+ var value = evalStatements(untyped.statements(), context);
+ var table = (Table) value;
+
return new TypedQueryDefinitionNode(
untyped.name(),
+ table,
untyped.docComment(),
untyped.source()
);
@@ -497,6 +505,8 @@ public class TypeChecker {
}
}
+ // == Database schema statements ==
+
static TypedDatabaseSchemaStatementNode typeCheckDatabaseSchemaStatement(
UntypedDatabaseSchemaStatementNode statement,
DatabaseSchemaInfo databaseSchemaInfo,
@@ -545,6 +555,8 @@ public class TypeChecker {
);
}
+ // == Type-level expressions ==
+
static TypedTypeLevelExpressionNode<? extends TypeLevelValue> typeCheckTypeLevelExpression(
UntypedTypeLevelExpressionNode untyped,
TypeCheckerNamespaceContext context
@@ -650,4 +662,44 @@ public class TypeChecker {
);
}
}
+
+ // == Statements ==
+
+ private static TypeLevelValue evalStatements(
+ List<UntypedStatementNode> statements,
+ TypeCheckerNamespaceContext context
+ ) {
+ for (var statement : statements) {
+ switch (statement) {
+ case UntypedReturnNode untypedReturn -> {
+ // TODO: test multiple returns.
+ return evalExpression(untypedReturn.expression(), context);
+ }
+ }
+ }
+
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ // == Expressions ==
+
+ private static TypeLevelValue evalExpression(
+ UntypedExpressionNode expression,
+ TypeCheckerNamespaceContext context
+ ) {
+ switch (expression) {
+ case UntypedCallNode _ -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+ case UntypedFunctionExpressionNode _ -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+ case UntypedMemberAccessNode _ -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+ case UntypedReferenceNode reference -> {
+ return lookupTypeLevelValue(reference.name(), reference.source(), context);
+ }
+ }
+ }
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java
index 96efbd2..186557e 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java
@@ -40,4 +40,12 @@ public class HobgoblinNativeTypes {
public static Field arbitraryField() {
return new Field("", arbitraryType(), NullSource.INSTANCE);
}
+
+ public static DatabaseSchema arbitraryDatabaseSchema() {
+ return new DatabaseSchema(arbitraryNamespaceName(), "");
+ }
+
+ public static Table arbitraryTable() {
+ return new Table(arbitraryDatabaseSchema(), "");
+ }
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/Table.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/Table.java
new file mode 100644
index 0000000..a33e226
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/Table.java
@@ -0,0 +1,8 @@
+package org.zwobble.hobgoblin.compiler.types;
+
+public record Table(DatabaseSchema databaseSchema, String name) implements TypeLevelValue {
+ @Override
+ public String describe() {
+ return databaseSchema.describe() + "." + 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 8208521..8d12c2e 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 DatabaseSchema, Type, TypeConstructor {
+public sealed interface TypeLevelValue permits DatabaseSchema, Table, 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 a914081..0d321a0 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java
@@ -30,4 +30,8 @@ public class Types {
public static Type databaseSchema(DatabaseSchema databaseSchema) {
return new TypeLevelValueType(databaseSchema);
}
+
+ public static Type table(Table table) {
+ return new TypeLevelValueType(table);
+ }
}