aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/org')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/Typed.java19
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java40
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/StackCompilerCallTests.java39
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java9
4 files changed, 87 insertions, 20 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java
index 75f54d36..ed58b4d4 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java
@@ -5,6 +5,7 @@ import org.shedlang.compiler.types.Type;
import org.shedlang.compiler.types.Types;
import java.math.BigInteger;
+import java.util.List;
public class Typed {
private Typed() {
@@ -14,10 +15,28 @@ public class Typed {
return new TypedBoolLiteralNode(value, Sources.NULL);
}
+ public static TypedCallNode call(
+ TypedExpressionNode receiver,
+ List<TypedExpressionNode> positionalArgs,
+ List<TypedNamedArgNode> namedArgs
+ ) {
+ return new TypedCallNode(
+ receiver,
+ new TypedArgsNode(positionalArgs, namedArgs, Sources.NULL),
+ false,
+ Types.UNIT,
+ Sources.NULL
+ );
+ }
+
public static TypedIntLiteralNode intLiteral(int value) {
return new TypedIntLiteralNode(BigInteger.valueOf(value), Sources.NULL);
}
+ public static TypedNamedArgNode namedArg(String name, TypedExpressionNode expression) {
+ return new TypedNamedArgNode(name, expression, Sources.NULL);
+ }
+
public static TypedStringLiteralNode stringLiteral(String value) {
return new TypedStringLiteralNode(value, Sources.NULL);
}
diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
index 11e7b38f..5cc0ce85 100644
--- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
+++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
@@ -13,26 +13,6 @@ public class Untyped {
return new UntypedBoolLiteralNode(value, Sources.NULL);
}
- public static UntypedIntLiteralNode intLiteral(int value) {
- return new UntypedIntLiteralNode(BigInteger.valueOf(value), Sources.NULL);
- }
-
- public static UntypedIntLiteralNode intLiteral(BigInteger value) {
- return new UntypedIntLiteralNode(value, Sources.NULL);
- }
-
- public static UntypedNamedArgNode namedArg(String name, UntypedExpressionNode expression) {
- return new UntypedNamedArgNode(name, expression, Sources.NULL);
- }
-
- public static UntypedReferenceNode reference(String name) {
- return new UntypedReferenceNode(name, Sources.NULL);
- }
-
- public static UntypedStringLiteralNode stringLiteral(String value) {
- return new UntypedStringLiteralNode(value, Sources.NULL);
- }
-
public static UntypedCallNode call(
UntypedExpressionNode receiver,
List<UntypedExpressionNode> positionalArgs
@@ -52,4 +32,24 @@ public class Untyped {
Sources.NULL
);
}
+
+ public static UntypedIntLiteralNode intLiteral(int value) {
+ return new UntypedIntLiteralNode(BigInteger.valueOf(value), Sources.NULL);
+ }
+
+ public static UntypedIntLiteralNode intLiteral(BigInteger value) {
+ return new UntypedIntLiteralNode(value, Sources.NULL);
+ }
+
+ public static UntypedNamedArgNode namedArg(String name, UntypedExpressionNode expression) {
+ return new UntypedNamedArgNode(name, expression, Sources.NULL);
+ }
+
+ public static UntypedReferenceNode reference(String name) {
+ return new UntypedReferenceNode(name, Sources.NULL);
+ }
+
+ public static UntypedStringLiteralNode stringLiteral(String value) {
+ return new UntypedStringLiteralNode(value, Sources.NULL);
+ }
}
diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerCallTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerCallTests.java
new file mode 100644
index 00000000..f4a2f229
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerCallTests.java
@@ -0,0 +1,39 @@
+package org.shedlang.compiler.stackir;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.typed.Typed;
+
+import java.util.List;
+
+import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.*;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.isSequence;
+
+public class StackCompilerCallTests {
+ @Test
+ public void callIsCompiledToInstructionsForOperandThenCall() {
+ var node = Typed.call(
+ Typed.reference("f"),
+ List.of(
+ Typed.stringLiteral("p1"),
+ Typed.stringLiteral("p2")
+
+ ),
+ List.of(
+ Typed.namedArg("x2", Typed.stringLiteral("n2")),
+ Typed.namedArg("x1", Typed.stringLiteral("n1"))
+ )
+ );
+
+ var instructions = StackCompiler.compileExpression(node);
+
+ assertThat(instructions, isSequence(
+ isLocalLoadInstruction("f"),
+ isPushStringInstruction("p1"),
+ isPushStringInstruction("p2"),
+ isPushStringInstruction("n2"),
+ isPushStringInstruction("n1"),
+ isCallInstruction(2, List.of("x2", "x1"))
+ ));
+ }
+}
diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
index 2fc1aa21..c9cd8621 100644
--- a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
+++ b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.stackir.instructions;
import org.zwobble.precisely.Matcher;
import java.math.BigInteger;
+import java.util.List;
import static org.zwobble.precisely.Matchers.*;
@@ -10,6 +11,14 @@ public class InstructionMatchers {
private InstructionMatchers() {
}
+ public static Matcher<Instruction> isCallInstruction(int argCount, List<String> namedArgs) {
+ return instanceOf(
+ CallInstruction.class,
+ has("argCount", x -> x.argCount(), equalTo(argCount)),
+ has("namedArgs", x -> x.namedArgs(), equalTo(namedArgs))
+ );
+ }
+
public static Matcher<Instruction> isLocalLoadInstruction(String name) {
return instanceOf(
LocalLoadInstruction.class,