summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java24
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java7
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java23
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/DatabaseSchemaInfo.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/TableInfo.java7
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
+) {
+}