From 9a14e772cd0a9574b892cf872c32db1d333b0815 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 8 Jul 2023 12:22:36 +0100 Subject: Compile string addition into string-add instruction --- .../org/shedlang/compiler/ast/typed/Typed.java | 12 ++++++++++ .../stackir/InstructionSerializerTests.java | 9 ++++++++ .../stackir/StackCompilerStringAddTests.java | 26 ++++++++++++++++++++++ .../stackir/instructions/InstructionMatchers.java | 4 ++++ .../stackir/instructions/Instructions.java | 4 ++++ 5 files changed, 55 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java (limited to 'src/test/java') 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 09af73cc..f7dfb097 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java @@ -126,6 +126,18 @@ public class Typed { return new TypedReturnNode(expression, Sources.NULL); } + public static TypedBinaryOperationNode stringAdd( + TypedExpressionNode left, + TypedExpressionNode right + ) { + return new TypedBinaryOperationNode( + TypedBinaryOperator.STRING_ADD, + left, + right, + Sources.NULL + ); + } + public static TypedTargetNode targetVariable(String name) { return new TypedTargetNode.Variable(name, Sources.NULL); } diff --git a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java index c6046847..3ce690b2 100644 --- a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java @@ -206,6 +206,15 @@ public class InstructionSerializerTests { assertThat(string, equalTo("(return)")); } + @Test + public void canSerializeStringAdd() { + var instruction = Instructions.stringAdd(); + + var string = serialize(instruction); + + assertThat(string, equalTo("(string-add)")); + } + private String serialize(Instruction instruction) { var builder = new StringBuilder(); InstructionSerializer.serialize(instruction, builder); diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java new file mode 100644 index 00000000..29bf576d --- /dev/null +++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java @@ -0,0 +1,26 @@ +package org.shedlang.compiler.stackir; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.ast.typed.Typed; + +import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.*; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.isSequence; + +public class StackCompilerStringAddTests { + @Test + public void stringAddIsCompiledToStringAddInstruction() { + var node = Typed.stringAdd( + Typed.stringLiteral("a"), + Typed.stringLiteral("b") + ); + + var instructions = StackCompiler.compileExpression(node); + + assertThat(instructions, isSequence( + isPushStringInstruction("a"), + isPushStringInstruction("b"), + isStringAddInstruction() + )); + } +} 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 a47e7c75..8b2661f7 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java @@ -103,4 +103,8 @@ public class InstructionMatchers { ReturnInstruction.class ); } + + public static Matcher isStringAddInstruction() { + return instanceOf(StringAddInstruction.class); + } } 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 6f769591..df8b193b 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java @@ -77,4 +77,8 @@ public class Instructions { public static Instruction return_() { return new ReturnInstruction(Sources.NULL); } + + public static Instruction stringAdd() { + return new StringAddInstruction(Sources.NULL); + } } -- cgit v1.2.3