aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-28 15:25:14 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-28 15:25:14 +0100
commit7aa75e85fad99f25b7db8af932f12201e019d420 (patch)
tree808e9ce8dbb17b5a204dbb73905e091d289817da /src/main/java
parent8511c3f02f4afbc32856e2169f083b6197d430a5 (diff)
Extract FieldsInfo
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java4
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java20
-rw-r--r--src/main/java/org/shedlang/compiler/types/FieldsInfo.java32
-rw-r--r--src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java16
-rw-r--r--src/main/java/org/shedlang/compiler/types/StructTypeInfo.java21
7 files changed, 74 insertions, 23 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java
index 4d6ece42..e5f645f2 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java
@@ -129,7 +129,7 @@ public class PatioCodeGenStructs {
return PatioDataLayouts.struct(Lists.repeat(
PatioDataLayouts.INT,
- structTypeInfo.fields().size()
+ structTypeInfo.fieldCount()
));
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 81917dfb..99c0729a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -322,7 +322,7 @@ public class TypeChecker {
) {
var structTypeInfo = context.structTypeInfo(structType, typedReceiver.source());
- var namedParams = structTypeInfo.fields().entryStream()
+ var namedParams = structTypeInfo.fields().stream()
.map(field -> {
var name = field.getKey();
var type = field.getValue();
@@ -872,7 +872,7 @@ public class TypeChecker {
var type = context.getLexicalState(StructType.class, untyped.name());
- context = context.addStructTypeInfo(type, new StructTypeInfo(fieldTypes));
+ context = context.addStructTypeInfo(type, new StructTypeInfo(new FieldsInfo(fieldTypes)));
var typedNode = new TypedStructDefinitionNode(
type,
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
index 2223309d..39968737 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
@@ -338,7 +338,7 @@ public class TypeCheckerContext {
NamespaceName namespaceName,
POrderedMap<String, Type> fields
) {
- var namespaceTypeInfo = new NamespaceTypeInfo(fields);
+ var namespaceTypeInfo = new NamespaceTypeInfo(new FieldsInfo(fields));
return new TypeCheckerContext(
this.namespaceTypeInfos.plus(namespaceName, namespaceTypeInfo),
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java
index 7cd03cb4..6aa6ac59 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java
@@ -21,6 +21,16 @@ public class TypeInfos {
this.structTypeInfos = structTypeInfos;
}
+ public TypeInfos addNamespaceTypeInfo(
+ NamespaceName namespaceName,
+ NamespaceTypeInfo namespaceTypeInfo
+ ) {
+ return new TypeInfos(
+ this.namespaceTypeInfos.plus(namespaceName, namespaceTypeInfo),
+ this.structTypeInfos
+ );
+ }
+
public NamespaceTypeInfo namespaceTypeInfo(NamespaceName namespaceName) {
// TODO: throw better error
var typeInfo = namespaceTypeInfos.get(namespaceName);
@@ -31,6 +41,16 @@ public class TypeInfos {
}
}
+ public TypeInfos addStructTypeInfo(
+ StructType type,
+ StructTypeInfo structTypeInfo
+ ) {
+ return new TypeInfos(
+ this.namespaceTypeInfos,
+ this.structTypeInfos.plus(type, structTypeInfo)
+ );
+ }
+
public StructTypeInfo structTypeInfo(StructType type) {
// TODO: throw better error
var typeInfo = structTypeInfos.get(type);
diff --git a/src/main/java/org/shedlang/compiler/types/FieldsInfo.java b/src/main/java/org/shedlang/compiler/types/FieldsInfo.java
new file mode 100644
index 00000000..7723b7dc
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/FieldsInfo.java
@@ -0,0 +1,32 @@
+package org.shedlang.compiler.types;
+
+import org.shedlang.compiler.util.POrderedMap;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+public record FieldsInfo(POrderedMap<String, Type> fields) {
+ public int fieldCount() {
+ return fields.size();
+ }
+
+ public int fieldIndex(String fieldName) {
+ var fieldIndex = fields.keys().indexOf(fieldName);
+
+ if (fieldIndex == -1) {
+ throw new NoSuchFieldInternalError(fieldName);
+ } else {
+ return fieldIndex;
+ }
+ }
+
+ public Optional<Type> fieldType(String fieldName) {
+ return fields.get(fieldName);
+ }
+
+ // TODO: better element type
+ public Stream<Map.Entry<String, Type>> stream() {
+ return fields.entryStream();
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java b/src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java
index 3c5fbc0b..d821f411 100644
--- a/src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java
+++ b/src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java
@@ -2,18 +2,16 @@ package org.shedlang.compiler.types;
import org.shedlang.compiler.util.POrderedMap;
-public record NamespaceTypeInfo(POrderedMap<String, Type> fields) {
+public record NamespaceTypeInfo(FieldsInfo fields) {
+ public static NamespaceTypeInfo fromFields(POrderedMap<String, Type> fields) {
+ return new NamespaceTypeInfo(new FieldsInfo(fields));
+ }
+
public int fieldCount() {
- return fields.size();
+ return fields.fieldCount();
}
public int fieldIndex(String fieldName) {
- var fieldIndex = fields.keys().indexOf(fieldName);
-
- if (fieldIndex == -1) {
- throw new NoSuchFieldInternalError(fieldName);
- } else {
- return fieldIndex;
- }
+ return fields.fieldIndex(fieldName);
}
}
diff --git a/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java b/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java
index 7a95a234..17436827 100644
--- a/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java
+++ b/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java
@@ -4,19 +4,20 @@ import org.shedlang.compiler.util.POrderedMap;
import java.util.Optional;
-public record StructTypeInfo(POrderedMap<String, Type> fields) {
+public record StructTypeInfo(FieldsInfo fields) {
+ public static StructTypeInfo fromFields(POrderedMap<String, Type> fields) {
+ return new StructTypeInfo(new FieldsInfo(fields));
+ }
+
+ public int fieldCount() {
+ return fields().fieldCount();
+ }
+
public Optional<Type> fieldType(String fieldName) {
- return this.fields.get(fieldName);
+ return fields.fieldType(fieldName);
}
public int fieldIndex(String fieldName) {
- // TODO: extract common field set from namespace type info
- var fieldIndex = fields.keys().indexOf(fieldName);
-
- if (fieldIndex == -1) {
- throw new NoSuchFieldInternalError(fieldName);
- } else {
- return fieldIndex;
- }
+ return fields.fieldIndex(fieldName);
}
}