diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-05 19:57:34 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-05 19:57:34 +0000 |
| commit | aa88533bb9809fd9cc597d0b6fc7676b35f1ede2 (patch) | |
| tree | 843af26ca8596219c65d05129c47d4afe4971ac9 /src/main/java | |
| parent | 5dbc2fc31b033cd1b9c51fea4326003a216bb686 (diff) | |
Support accessing fields on effects
Diffstat (limited to 'src/main/java')
3 files changed, 30 insertions, 2 deletions
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<FunctionType> fields) { + public static Builder builder() { + return new Builder(FieldsInfo.builder()); + } + public record Builder(FieldsInfo.Builder<FunctionType> fields) { + public UserDefinedEffectInfo build() { + return new UserDefinedEffectInfo(fields.build()); + } + + public Builder addField(String name, FunctionType type) { + return new Builder(this.fields.addField(name, type)); + } + } } |
