diff options
Diffstat (limited to 'src/main/java')
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); + } } |
