diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-12-11 00:29:06 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-12-11 00:29:06 +0000 |
| commit | 1b56846cfdf7e25408920bdeb4f46edb721a218f (patch) | |
| tree | e8b5192b1d3708c7669068a4c4436482cd66a1d3 /src/main/java | |
| parent | d1b3124cf2ef0b8d88f7e996248779b08a519878 (diff) | |
Type check calls to positional structs
Diffstat (limited to 'src/main/java')
3 files changed, 41 insertions, 11 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 528829fc..8cec1f85 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -504,13 +504,21 @@ public class TypeChecker { Type structType, StructTypeInfo structTypeInfo ) { - var namedParams = structTypeInfo.fields().stream() - .map(field -> new NamedParam(field.name(), field.type())) - .toList(); + var positionalParams = structTypeInfo.fieldsArePositional() + ? structTypeInfo.fields().stream() + .map(field -> field.type()) + .toList() + : List.<Type>of(); + + var namedParams = structTypeInfo.fieldsArePositional() + ? List.<NamedParam>of() + : structTypeInfo.fields().stream() + .map(field -> new NamedParam(field.name(), field.type())) + .toList(); return new FunctionType( Optional.empty(), - List.of(), + positionalParams, namedParams, Effects.NONE, structType @@ -1671,7 +1679,10 @@ public class TypeChecker { context = context.addStructTypeInfo( typeOrConstructor.toType(), - new StructTypeInfo(fieldInfosBuilder.build()) + new StructTypeInfo( + fieldInfosBuilder.build(), + untyped.fieldsArePositional() + ) ); var typedNode = new TypedStructDefinitionNode( diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java index 4547c895..503e97a8 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java @@ -94,7 +94,10 @@ public class TypeInfos { ); } - return new StructTypeInfo(fieldsInfoBuilder.build()); + return new StructTypeInfo( + fieldsInfoBuilder.build(), + typeInfo.fieldsArePositional() + ); }); } diff --git a/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java b/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java index 1970b72e..a34a9c10 100644 --- a/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java +++ b/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java @@ -2,7 +2,10 @@ package org.shedlang.compiler.types; import java.util.Optional; -public record StructTypeInfo(FieldsInfo<Type> fields) { +public record StructTypeInfo( + FieldsInfo<Type> fields, + boolean fieldsArePositional +) { public int fieldCount() { return fields().fieldCount(); } @@ -16,16 +19,29 @@ public record StructTypeInfo(FieldsInfo<Type> fields) { } public static Builder builder() { - return new Builder(FieldsInfo.builder()); + return new Builder(FieldsInfo.builder(), false); } - public record Builder(FieldsInfo.Builder<Type> fields) { + public record Builder( + FieldsInfo.Builder<Type> fields, + boolean fieldsArePositional + ) { public StructTypeInfo build() { - return new StructTypeInfo(fields.build()); + return new StructTypeInfo(fields.build(), fieldsArePositional); } public Builder addField(String name, Type type) { - return new Builder(this.fields.addField(name, type)); + return new Builder( + this.fields.addField(name, type), + fieldsArePositional + ); + } + + public Builder withFieldsArePositional(boolean fieldsArePositional) { + return new Builder( + this.fields, + fieldsArePositional + ); } } } |
