aboutsummaryrefslogtreecommitdiff
path: root/src/test/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/test/java
parent5dbc2fc31b033cd1b9c51fea4326003a216bb686 (diff)
Support accessing fields on effects
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java44
1 files changed, 41 insertions, 3 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java
index ffd9b7af..8b5c6371 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java
@@ -4,9 +4,7 @@ import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.untyped.Untyped;
import org.shedlang.compiler.typechecker.errors.MissingStructTypeInfoError;
import org.shedlang.compiler.typechecker.errors.NoSuchFieldError;
-import org.shedlang.compiler.types.NamespaceName;
-import org.shedlang.compiler.types.StructTypeInfo;
-import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.types.*;
import org.shedlang.compiler.util.P;
import java.util.Map;
@@ -72,6 +70,46 @@ public class TypeCheckerFieldAccessTests {
}
@Test
+ public void canAccessFieldOnEffect() {
+ var untyped = Untyped.fieldAccess(
+ Untyped.reference("Effect"),
+ "mark"
+ );
+ var effect = Effects.userDefined(NamespaceName.of("Example"), "Effect");
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(Map.entry("Effect", Types.effectType(effect))))
+ .addUserDefinedEffectInfo(
+ effect,
+ UserDefinedEffectInfo.builder()
+ .addField(
+ "mark",
+ FunctionType.builder()
+ .addPositionalParam(Types.BOOL)
+ .addNamedParam("x", Types.INT)
+ .withReturnType(Types.STRING)
+ .build()
+ )
+ .build()
+ );
+
+ var typed = typeCheckExpression(untyped, context);
+
+ assertThat(
+ typed.value(),
+ isTypedFieldAccessNode(
+ isTypedReferenceNode("Effect", Types.effectType(effect)),
+ "mark",
+ FunctionType.builder()
+ .addPositionalParam(Types.BOOL)
+ .addNamedParam("x", Types.INT)
+ .withEffect(effect)
+ .withReturnType(Types.STRING)
+ .build()
+ )
+ );
+ }
+
+ @Test
public void whenReceiverIsTypeWithoutFieldsThenErrorIsThrown() {
var untyped = Untyped.fieldAccess(
Untyped.reference("user"),