aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-18 14:48:54 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-18 14:48:54 +0000
commit686fe85364d87aa995bf080ea934674a2ece35d9 (patch)
tree1f41fc295823b11d48e200c18bf8fbe0c30bae94 /src/test/java
parent240cf4b6b2c4135d9b6b9150426798f6cc8508df (diff)
Generate stack IR for effect field access
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/StackCompilerFieldAccessTests.java23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerFieldAccessTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerFieldAccessTests.java
index fee566cb..23d87b61 100644
--- a/src/test/java/org/shedlang/compiler/stackir/StackCompilerFieldAccessTests.java
+++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerFieldAccessTests.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.stackir;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.typed.Typed;
import org.shedlang.compiler.stackir.instructions.FieldLoadInstruction;
+import org.shedlang.compiler.types.Effects;
import org.shedlang.compiler.types.NamespaceName;
import org.shedlang.compiler.types.Types;
@@ -52,4 +53,26 @@ public class StackCompilerFieldAccessTests {
isFieldLoadInstruction(structType, "name")
));
}
+
+ @Test
+ public void userDefinedEffectFieldAccessIsCompiledToFieldLoad() {
+ var effect = Effects.userDefined(NamespaceName.of("Example", "Project"), "State");
+ var node = Typed.fieldAccess(
+ Typed.reference("State", Types.effectType(effect)),
+ "read",
+ Types.STRING
+ );
+ var context = StackCompiler.Context.EMPTY
+ .addShedVariable("State");
+
+ var result = StackCompiler.compileExpression(node, context);
+
+ assertThat(result.instructions(), isSequence(
+ isLocalLoadInstruction("State__0"),
+ isFieldLoadInstruction(
+ new FieldLoadInstruction.Receiver.Effect(effect),
+ "read"
+ )
+ ));
+ }
}