aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-28 15:13:55 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-28 15:13:55 +0100
commit37623ba6964acf573e100903fbdd1453d69d2e26 (patch)
treed7dd087153dc64cdf3f386b4897a3255d64db453 /src/test/java
parenta637fcc83f642d5320608ea7fc20a93f3ec5ab86 (diff)
Add Patio code gen for struct field accesses
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioCodeGenDefineStructTests.java15
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioCodeGenFieldLoadTests.java28
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java2
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java2
5 files changed, 42 insertions, 9 deletions
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenDefineStructTests.java b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenDefineStructTests.java
index 6d2bd125..1dba9fd5 100644
--- a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenDefineStructTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenDefineStructTests.java
@@ -5,11 +5,15 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.shedlang.compiler.stackir.instructions.Instructions;
import org.shedlang.compiler.testing.snapshots.SnapshotResolver;
import org.shedlang.compiler.testing.snapshots.Snapshotter;
+import org.shedlang.compiler.typechecker.TypeCheckerContext;
import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.StructTypeInfo;
import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
import java.io.IOException;
import java.util.List;
+import java.util.Map;
import static org.shedlang.compiler.patio.PatioTesting.serialize;
@@ -17,14 +21,21 @@ import static org.shedlang.compiler.patio.PatioTesting.serialize;
public class PatioCodeGenDefineStructTests {
@Test
public void canGenerateCodeForDefiineStruct(Snapshotter snapshotter) throws IOException {
+ var structType = Types.struct(NamespaceName.of("Example", "Project"), "User");
var instruction = Instructions.defineStruct(
- Types.struct(NamespaceName.of("Example", "Project"), "User"),
+ structType,
List.of(
Instructions.defineStructField("name"),
Instructions.defineStructField("isActive")
)
);
- var context = PatioCodeGenContext.EMPTY;
+ var typeInfos = TypeCheckerContext.EMPTY
+ .addStructTypeInfo(structType, new StructTypeInfo(P.orderedMap(
+ Map.entry("name", Types.STRING),
+ Map.entry("isActive", Types.BOOL)
+ )))
+ .toTypeInfos();
+ var context = PatioCodeGenContext.forTypeInfos(typeInfos);
var result = PatioCodeGen.generateInstruction(instruction, context);
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenFieldLoadTests.java b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenFieldLoadTests.java
index 31fe60c0..b43f2d1c 100644
--- a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenFieldLoadTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenFieldLoadTests.java
@@ -8,6 +8,7 @@ import org.shedlang.compiler.testing.snapshots.SnapshotResolver;
import org.shedlang.compiler.testing.snapshots.Snapshotter;
import org.shedlang.compiler.typechecker.TypeCheckerContext;
import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.StructTypeInfo;
import org.shedlang.compiler.types.Types;
import org.shedlang.compiler.util.P;
@@ -20,17 +21,38 @@ import static org.shedlang.compiler.patio.PatioTesting.serialize;
@ExtendWith({SnapshotResolver.class})
public class PatioCodeGenFieldLoadTests {
@Test
- public void canGenerateCodeForFieldLoad(Snapshotter snapshotter) throws IOException {
+ public void canGenerateCodeForNamespaceFieldLoad(Snapshotter snapshotter) throws IOException {
var namespaceName = new NamespaceName(List.of("Example", "Project"));
var stackIrInstruction = Instructions.fieldLoad(namespaceName, "y");
- var typeInfo = TypeCheckerContext.EMPTY
+ var typeInfos = TypeCheckerContext.EMPTY
.addNamespaceFields(namespaceName, P.orderedMap(
Map.entry("x", Types.INT),
Map.entry("y", Types.INT),
Map.entry("z", Types.INT)
))
.toTypeInfos();
- var context = PatioCodeGenContext.forTypeInfos(typeInfo)
+ var context = PatioCodeGenContext.forTypeInfos(typeInfos)
+ .temporaryPush(new PatioLocalRef("a"))
+ .temporaryPush(new PatioLocalRef("b"));
+
+ var result = PatioCodeGen.generateInstruction(stackIrInstruction, context);
+
+ snapshotter.assertSnapshot(serialize(result));
+ }
+
+ @Test
+ public void canGenerateCodeForStructFieldLoad(Snapshotter snapshotter) throws IOException {
+ var namespaceName = NamespaceName.of("Example", "Project");
+ var structType = Types.struct(namespaceName, "User");
+ var stackIrInstruction = Instructions.fieldLoad(structType, "id");
+ var typeInfos = TypeCheckerContext.EMPTY
+ .addStructTypeInfo(structType, new StructTypeInfo(P.orderedMap(
+ Map.entry("name", Types.STRING),
+ Map.entry("id", Types.INT),
+ Map.entry("isActive", Types.BOOL)
+ )))
+ .toTypeInfos();
+ var context = PatioCodeGenContext.forTypeInfos(typeInfos)
.temporaryPush(new PatioLocalRef("a"))
.temporaryPush(new PatioLocalRef("b"));
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java
index 28d8d2e0..cb43a057 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java
@@ -353,7 +353,7 @@ public class TypeCheckerCallTests {
.addNamedArg(Untyped.namedArg("name", Untyped.stringLiteral("Bob")))
.build();
var structType = Types.struct(NamespaceName.of("Example"), "User");
- var structTypeInfo = new StructTypeInfo(P.orderedPMap(
+ var structTypeInfo = new StructTypeInfo(P.orderedMap(
Map.entry("name", Types.STRING)
));
var context = TypeCheckerContext.EMPTY
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java
index 7f8ad5fb..77e6e867 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java
@@ -25,7 +25,7 @@ public class TypeCheckerFieldAccessTests {
"name"
);
var structType = Types.struct(NamespaceName.of("Example"), "User");
- var structTypeInfo = new StructTypeInfo(P.orderedPMap(Map.entry("name", Types.STRING)));
+ var structTypeInfo = new StructTypeInfo(P.orderedMap(Map.entry("name", Types.STRING)));
var context = TypeCheckerContext.EMPTY
.enterGlobal(P.map(Map.entry("user", structType)))
.addStructTypeInfo(structType, structTypeInfo);
@@ -64,7 +64,7 @@ public class TypeCheckerFieldAccessTests {
"name"
);
var structType = Types.struct(NamespaceName.of("Example"), "User");
- var structTypeInfo = new StructTypeInfo(P.orderedPMap(Map.entry("username", Types.STRING)));
+ var structTypeInfo = new StructTypeInfo(P.orderedMap(Map.entry("username", Types.STRING)));
var context = TypeCheckerContext.EMPTY
.enterGlobal(P.map(Map.entry("user", structType)))
.addStructTypeInfo(structType, structTypeInfo);
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java
index a0efeac3..6af0a4f0 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java
@@ -117,7 +117,7 @@ public class TypeCheckerStructDefinitionTests {
assertThat(
typed.context().structTypeInfos().get(Types.struct(NAMESPACE_NAME, "ExampleStruct")),
// TODO: builder for OrderedPMap
- has("fields", x -> x.fields().entrySet(), isSequence(
+ has("fields", x -> x.fields().entryStream().toList(), isSequence(
equalTo(Map.entry("b", Types.BOOL)),
equalTo(Map.entry("a", Types.INT))
))