aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-11 00:29:06 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-11 00:29:06 +0000
commit1b56846cfdf7e25408920bdeb4f46edb721a218f (patch)
treee8b5192b1d3708c7669068a4c4436482cd66a1d3 /src/main/java
parentd1b3124cf2ef0b8d88f7e996248779b08a519878 (diff)
Type check calls to positional structs
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java21
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java5
-rw-r--r--src/main/java/org/shedlang/compiler/types/StructTypeInfo.java26
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
+ );
}
}
}