From 1b56846cfdf7e25408920bdeb4f46edb721a218f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 11 Dec 2024 00:29:06 +0000 Subject: Type check calls to positional structs --- .../shedlang/compiler/typechecker/TypeChecker.java | 21 ++++++++++++----- .../shedlang/compiler/typechecker/TypeInfos.java | 5 ++++- .../shedlang/compiler/types/StructTypeInfo.java | 26 +++++++++++++++++----- 3 files changed, 41 insertions(+), 11 deletions(-) (limited to 'src/main/java') 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.of(); + + var namedParams = structTypeInfo.fieldsArePositional() + ? List.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 fields) { +public record StructTypeInfo( + FieldsInfo fields, + boolean fieldsArePositional +) { public int fieldCount() { return fields().fieldCount(); } @@ -16,16 +19,29 @@ public record StructTypeInfo(FieldsInfo fields) { } public static Builder builder() { - return new Builder(FieldsInfo.builder()); + return new Builder(FieldsInfo.builder(), false); } - public record Builder(FieldsInfo.Builder fields) { + public record Builder( + FieldsInfo.Builder 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 + ); } } } -- cgit v1.2.3