diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-10-25 14:00:14 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-10-25 14:00:14 +0000 |
| commit | 91bc5df9cc0a6f7ef4fb63c301a0a8ad1f571a31 (patch) | |
| tree | d0677a6fbf5b131a2d8b2dbd3f59a37838a914ed /src/main/java | |
| parent | ed546c3f79ffe43e849134843645461580aa41f4 (diff) | |
Store information about database tables
Diffstat (limited to 'src/main/java')
6 files changed, 65 insertions, 4 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 e00ffb6..311cf0e 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -9,6 +9,7 @@ import org.zwobble.hobgoblin.compiler.typechecker.errors.NoSuchFieldError; import org.zwobble.hobgoblin.compiler.types.*; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -158,11 +159,20 @@ public class TypeChecker { UntypedDatabaseSchemaDefinitionNode untyped, TypeCheckerNamespaceContext context ) { + var databaseSchemaInfo = new DatabaseSchemaInfo(new LinkedHashMap<>()); + + var typedBody = untyped.body().stream() + .map(statement -> typeCheckDatabaseSchemaStatement(statement, databaseSchemaInfo, context)) + .toList(); + + context.defineDatabaseSchema( + new DatabaseSchema(context.namespaceName(), untyped.name()), + databaseSchemaInfo + ); + return new TypedDatabaseSchemaDefinitionNode( untyped.name(), - untyped.body().stream() - .map(statement -> typeCheckDatabaseSchemaStatement(statement, context)) - .toList(), + typedBody, untyped.docComment(), untyped.source() ); @@ -478,16 +488,18 @@ public class TypeChecker { static TypedDatabaseSchemaStatementNode typeCheckDatabaseSchemaStatement( UntypedDatabaseSchemaStatementNode statement, + DatabaseSchemaInfo databaseSchemaInfo, TypeCheckerNamespaceContext context ) { return switch (statement) { case UntypedTableDefinitionNode untypedTableDefinition -> - typeCheckTableDefinition(untypedTableDefinition, context); + typeCheckTableDefinition(untypedTableDefinition, databaseSchemaInfo, context); }; } private static TypedTableDefinitionNode typeCheckTableDefinition( UntypedTableDefinitionNode untyped, + DatabaseSchemaInfo databaseSchemaInfo, TypeCheckerNamespaceContext context ) { var rowTypeTypedNode = typeCheckMetaType(untyped.rowType(), context); @@ -509,6 +521,10 @@ public class TypeChecker { throw new NoSuchFieldError(rowType, untyped.primaryKey(), untyped.source()); } + var tableInfo = new TableInfo(rowType, primaryKeyField.get()); + + databaseSchemaInfo.tables().put(untyped.name(), tableInfo); + return new TypedTableDefinitionNode( untyped.name(), rowType, diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java index ce7153f..b18769d 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java @@ -57,6 +57,13 @@ public class TypeCheckerNamespaceContext { return Optional.ofNullable(this.variables.get(name)); } + public void defineDatabaseSchema( + DatabaseSchema databaseSchema, + DatabaseSchemaInfo databaseSchemaInfo + ) { + this.typesInfo.defineDatabaseSchema(databaseSchema, databaseSchemaInfo); + } + public void defineEnumType(EnumType enumType, List<EnumVariant> enumVariants) { this.typesInfo.defineEnumType(enumType, enumVariants); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java index d13d2c6..e05ddc3 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java @@ -8,6 +8,8 @@ import java.util.Optional; public interface TypesInfo { TypesInfo EMPTY = TypesInfoInMemory.empty(); + DatabaseSchemaInfo databaseSchemaInfo(DatabaseSchema databaseSchema); + boolean isDefined(SimpleStructType type); Optional<List<Field>> fieldsOf(SimpleStructType structType); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java index 67d5c3b..011b7e5 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java @@ -11,10 +11,13 @@ public class TypesInfoInMemory implements TypesInfo { new HashMap<>(), new HashMap<>(), new HashMap<>(), + new HashMap<>(), new HashMap<>() ); } + private final Map<DatabaseSchema, DatabaseSchemaInfo> databaseSchemaInfo; + private final Map<EnumType, List<EnumVariant>> enumVariants; private final Map<Type, Optional<List<Field>>> structFields; @@ -23,17 +26,37 @@ public class TypesInfoInMemory implements TypesInfo { private final Map<SimpleStructType, List<SumType>> variantToSums; private TypesInfoInMemory( + Map<DatabaseSchema, DatabaseSchemaInfo> databaseSchemaInfo, Map<EnumType, List<EnumVariant>> enumVariants, Map<Type, Optional<List<Field>>> structFields, Map<SumType, SumTypeInfo> sumTypeInfos, Map<SimpleStructType, List<SumType>> variantToSums ) { + this.databaseSchemaInfo = databaseSchemaInfo; this.enumVariants = enumVariants; this.structFields = structFields; this.sumTypeInfos = sumTypeInfos; this.variantToSums = variantToSums; } + public void defineDatabaseSchema( + DatabaseSchema databaseSchema, + DatabaseSchemaInfo databaseSchemaInfo + ) { + this.databaseSchemaInfo.put(databaseSchema, databaseSchemaInfo); + } + + @Override + public DatabaseSchemaInfo databaseSchemaInfo(DatabaseSchema databaseSchema) { + var info = this.databaseSchemaInfo.get(databaseSchema); + if (info == null) { + // TODO: better error + throw new UnsupportedOperationException("TODO"); + } else { + return info; + } + } + public void defineEnumType(EnumType enumType, List<EnumVariant> enumVariants) { this.enumVariants.put(enumType, enumVariants); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchemaInfo.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchemaInfo.java new file mode 100644 index 0000000..5ba5712 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchemaInfo.java @@ -0,0 +1,6 @@ +package org.zwobble.hobgoblin.compiler.types; + +import java.util.SequencedMap; + +public record DatabaseSchemaInfo(SequencedMap<String, TableInfo> tables) { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/TableInfo.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/TableInfo.java new file mode 100644 index 0000000..6632e51 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/TableInfo.java @@ -0,0 +1,7 @@ +package org.zwobble.hobgoblin.compiler.types; + +public record TableInfo( + SimpleStructType rowType, + Field primaryKey +) { +} |
