From 11dbdf3ebcac7e254f1c818178f64aa79406f47c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 1 Oct 2023 21:50:32 +0100 Subject: Add switch instruction to stack IR --- .../stackir/InstructionSerializerTests.java | 40 ++++++++++++++++++++++ .../stackir/instructions/Instructions.java | 11 ++++++ 2 files changed, 51 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java index b0143a9b..e2294588 100644 --- a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java @@ -327,6 +327,46 @@ public class InstructionSerializerTests { assertThat(string, equalTo("(string-add)")); } + @Test + public void canSerializeSwitch() { + var instruction = Instructions.switch_(List.of( + Instructions.switchCase( + Types.struct(NamespaceName.of("Example", "Project"), "A"), + List.of( + Instructions.return_() + ) + ), + Instructions.switchCase( + Types.struct(NamespaceName.of("Example", "Project"), "B"), + List.of( + Instructions.discard() + ) + ) + )); + + var string = serialize(instruction); + + assertThat(string, equalTo(""" + ( + switch + ( + ( + "Example/Project.A" + ( + (return) + ) + ) + ( + "Example/Project.B" + ( + (discard) + ) + ) + ) + )""" + )); + } + @Test public void canSerializeTupleCreate() { var instruction = Instructions.tupleCreate(2); diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java index 3ac0ac62..4971575c 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java @@ -134,6 +134,17 @@ public class Instructions { return new StringAddInstruction(Sources.NULL); } + public static Instruction switch_(List cases) { + return new SwitchInstruction(cases, Sources.NULL); + } + + public static SwitchInstruction.Case switchCase( + StructType type, + List body + ) { + return new SwitchInstruction.Case(type, body, Sources.NULL); + } + public static Instruction tupleCreate(int elementCount) { return new TupleCreateInstruction(elementCount, Sources.NULL); } -- cgit v1.2.3