From aa88533bb9809fd9cc597d0b6fc7676b35f1ede2 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 5 Nov 2023 19:57:34 +0000 Subject: Support accessing fields on effects --- .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 9 +++++++++ src/main/java/org/shedlang/compiler/types/FunctionType.java | 11 +++++++++-- .../org/shedlang/compiler/types/UserDefinedEffectInfo.java | 12 ++++++++++++ 3 files changed, 30 insertions(+), 2 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 f86ed78f..db81d7cc 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -540,6 +540,15 @@ public class TypeChecker { return namespaceTypeInfo.fieldType(fieldName) .orElseThrow(() -> new NoSuchFieldError(receiverTypeNamespace, fieldName, source)); + } else if ( + receiverType instanceof TypeLevelValueType receiverTypeTypeLevelValue && + receiverTypeTypeLevelValue.value() instanceof UserDefinedEffect effect + ) { + var effectInfo = context.userDefinedEffectInfo(effect, source); + + return effectInfo.fields().fieldType(fieldName) + .orElseThrow(() -> new NoSuchFieldError(receiverType, fieldName, source)) + .withEffect(effect); } else { throw new NoSuchFieldError(receiverType, fieldName, source); } diff --git a/src/main/java/org/shedlang/compiler/types/FunctionType.java b/src/main/java/org/shedlang/compiler/types/FunctionType.java index 285dadf8..e217fbd4 100644 --- a/src/main/java/org/shedlang/compiler/types/FunctionType.java +++ b/src/main/java/org/shedlang/compiler/types/FunctionType.java @@ -4,8 +4,6 @@ import org.pcollections.Empty; import org.pcollections.PVector; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import static org.shedlang.compiler.util.Iterables.forEachInterspersed; @@ -54,6 +52,15 @@ public record FunctionType( return description.toString(); } + public FunctionType withEffect(Effect effect) { + return new FunctionType( + this.positionalParams, + this.namedParams, + effect, + this.returnType + ); + } + public static Builder builder() { return new Builder(Empty.vector(), Empty.vector(), Effects.NONE, Types.UNIT); } diff --git a/src/main/java/org/shedlang/compiler/types/UserDefinedEffectInfo.java b/src/main/java/org/shedlang/compiler/types/UserDefinedEffectInfo.java index a36b85a6..1785d22b 100644 --- a/src/main/java/org/shedlang/compiler/types/UserDefinedEffectInfo.java +++ b/src/main/java/org/shedlang/compiler/types/UserDefinedEffectInfo.java @@ -1,5 +1,17 @@ package org.shedlang.compiler.types; public record UserDefinedEffectInfo(FieldsInfo fields) { + public static Builder builder() { + return new Builder(FieldsInfo.builder()); + } + public record Builder(FieldsInfo.Builder fields) { + public UserDefinedEffectInfo build() { + return new UserDefinedEffectInfo(fields.build()); + } + + public Builder addField(String name, FunctionType type) { + return new Builder(this.fields.addField(name, type)); + } + } } -- cgit v1.2.3