diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-28 15:25:14 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-28 15:25:14 +0100 |
| commit | 7aa75e85fad99f25b7db8af932f12201e019d420 (patch) | |
| tree | 808e9ce8dbb17b5a204dbb73905e091d289817da /src/main/java | |
| parent | 8511c3f02f4afbc32856e2169f083b6197d430a5 (diff) | |
Extract FieldsInfo
Diffstat (limited to 'src/main/java')
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); } } |
