From af50498623bd37db5f5b60f2828e81b7e50d2ec4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 1 Oct 2023 20:34:41 +0100 Subject: Compile sum type definition to stack IR --- .../org/shedlang/compiler/ast/typed/Typed.java | 4 +++ .../StackCompilerStructDefinitionTests.java | 4 +-- .../StackCompilerSumTypeDefinitionTests.java | 30 ++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/shedlang/compiler/stackir/StackCompilerSumTypeDefinitionTests.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 24ee99a3..06c481ba 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java @@ -197,6 +197,10 @@ public class Typed { return new TypedStructFieldDefinitionNode(name, type, Sources.NULL); } + public static TypedSumTypeDefinitionNode sumTypeDefinition(SumType sumType) { + return new TypedSumTypeDefinitionNode(sumType, Sources.NULL); + } + public static TypedTargetNode targetIgnore() { return new TypedTargetNode.Ignore(Sources.NULL); } diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerStructDefinitionTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStructDefinitionTests.java index 3be1b1a5..f2f07ed5 100644 --- a/src/test/java/org/shedlang/compiler/stackir/StackCompilerStructDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStructDefinitionTests.java @@ -2,14 +2,12 @@ package org.shedlang.compiler.stackir; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.typed.Typed; -import org.shedlang.compiler.ast.typed.TypedFunctionDefinitionNode; import org.shedlang.compiler.ast.typed.TypedStructDefinitionNode; -import org.shedlang.compiler.stackir.instructions.DefineFunctionInstruction; import org.shedlang.compiler.stackir.instructions.DefineStructInstruction; import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.types.Types; -import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.*; +import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.isLocalStoreInstruction; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerSumTypeDefinitionTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerSumTypeDefinitionTests.java new file mode 100644 index 00000000..488ac261 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerSumTypeDefinitionTests.java @@ -0,0 +1,30 @@ +package org.shedlang.compiler.stackir; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.ast.typed.Typed; +import org.shedlang.compiler.types.NamespaceName; +import org.shedlang.compiler.types.Types; + +import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.isLocalStoreInstruction; +import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.isPushUnitInstruction; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.isSequence; + +public class StackCompilerSumTypeDefinitionTests { + @Test + public void sumTypeDefinitionIsCompiledToUnit() { + // TODO: this is a bit of a hack, we probably want to be able to have + // sum types in some potential backends (e.g. the JVM) + var sumType = Types.sum(NamespaceName.of("Example", "Project"), "Option"); + var node = Typed.sumTypeDefinition(sumType); + var context = StackCompiler.Context.EMPTY + .addShedVariable("Option"); + + var result = StackCompiler.compileNamespaceStatement(node, context); + + assertThat(result.instructions(), isSequence( + isPushUnitInstruction(), + isLocalStoreInstruction("Option__0") + )); + } +} -- cgit v1.2.3