aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-22 10:36:51 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-22 10:36:51 +0000
commita38bd5d597471e2ee434271fa7a82b835e828062 (patch)
tree7d2203893cc8cb14f7811c37808954c2fcc279f3 /src/test/java
parent35b78f02a0808e420e0f040f44c649b7354cd49d (diff)
Handle params in method references
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java57
1 files changed, 50 insertions, 7 deletions
diff --git a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java
index 79453d76..d2a0e5ce 100644
--- a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java
+++ b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java
@@ -5,10 +5,7 @@ import org.shedlang.compiler.ast.typed.Typed;
import org.shedlang.compiler.shid.instructions.ShidDefineFunction;
import org.shedlang.compiler.shid.instructions.ShidFieldLoad;
import org.shedlang.compiler.shid.instructions.ShidMatchers;
-import org.shedlang.compiler.types.Effects;
-import org.shedlang.compiler.types.NamespaceName;
-import org.shedlang.compiler.types.TypeParam;
-import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.types.*;
import java.util.List;
@@ -60,13 +57,15 @@ public class ShidCodeGenMemberAccessTests {
}
@Test
- public void structMethodAccessIsCompiledToDefineFunctionInstruction() {
+ public void structMethodAccessZeroParamsIsCompiledToDefineFunctionInstruction() {
var namespaceName = NamespaceName.of("Example", "Project");
var structType = Types.struct(namespaceName, "User");
var node = Typed.methodAccess(
Typed.reference("user", structType),
"name",
- Types.STRING
+ FunctionType.builder()
+ .withReturnType(Types.STRING)
+ .build()
);
var context = ShidCodeGen.Context.EMPTY
.addShedVal("user");
@@ -74,7 +73,6 @@ public class ShidCodeGenMemberAccessTests {
var result = ShidCodeGen.compileExpression(node, context);
// TODO: optimise calls
- // TODO: handle params
assertThat(result.instructions(), isSequence(
isShidLocalLoad("user__0"),
isShidLocalStore("receiver__0"),
@@ -97,6 +95,51 @@ public class ShidCodeGenMemberAccessTests {
}
@Test
+ public void structMethodAccessMultipleParamsIsCompiledToDefineFunctionInstruction() {
+ var namespaceName = NamespaceName.of("Example", "Project");
+ var structType = Types.struct(namespaceName, "User");
+ var node = Typed.methodAccess(
+ Typed.reference("user", structType),
+ "name",
+ FunctionType.builder()
+ .addPositionalParam(Types.BOOL)
+ .addNamedParam("b", Types.INT)
+ .withReturnType(Types.STRING)
+ .build()
+ );
+ var context = ShidCodeGen.Context.EMPTY
+ .addShedVal("user");
+
+ var result = ShidCodeGen.compileExpression(node, context);
+
+ assertThat(result.instructions(), isSequence(
+ isShidLocalLoad("user__0"),
+ isShidLocalStore("receiver__0"),
+ instanceOf(
+ ShidDefineFunction.class,
+ has("name", x -> x.name(), equalTo("name")),
+ has("positionalParams", x -> x.positionalParams(), isSequence(
+ isShidDefineFunctionParam("arg0__0")
+ )),
+ has("namedParams", x -> x.namedParams(), isSequence(
+ isShidDefineFunctionParam("b__0")
+ )),
+ has("freeVariables", x -> x.freeVariables(), containsExactly(
+ has("user", x -> x.name(), equalTo("receiver__0"))
+ )),
+ has("body", x -> x.body(), isShidBlock(isSequence(
+ isShidMethodLoad(structType, "name"),
+ isShidLocalLoad("receiver__0"),
+ isShidLocalLoad("arg0__0"),
+ isShidLocalLoad("b__0"),
+ isShidCall(2, List.of("b")),
+ isShidReturn()
+ )))
+ )
+ ));
+ }
+
+ @Test
public void constructedTypeFieldAccessIsCompiledToFieldLoad() {
var structType = Types.struct(NamespaceName.of("Example", "Project"), "Box");
var typeConstructor = Types.typeConstructor(