aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 19:57:34 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 19:57:34 +0000
commitaa88533bb9809fd9cc597d0b6fc7676b35f1ede2 (patch)
tree843af26ca8596219c65d05129c47d4afe4971ac9 /src/main/java
parent5dbc2fc31b033cd1b9c51fea4326003a216bb686 (diff)
Support accessing fields on effects
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java9
-rw-r--r--src/main/java/org/shedlang/compiler/types/FunctionType.java11
-rw-r--r--src/main/java/org/shedlang/compiler/types/UserDefinedEffectInfo.java12
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));
+ }
+ }
}