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/test/java | |
| parent | 5dbc2fc31b033cd1b9c51fea4326003a216bb686 (diff) | |
Support accessing fields on effects
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java | 44 |
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"), |
