From 37623ba6964acf573e100903fbdd1453d69d2e26 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Sep 2023 15:13:55 +0100 Subject: Add Patio code gen for struct field accesses --- .../patio/PatioCodeGenDefineStructTests.java | 15 ++++++++++-- .../compiler/patio/PatioCodeGenFieldLoadTests.java | 28 +++++++++++++++++++--- .../compiler/typechecker/TypeCheckerCallTests.java | 2 +- .../typechecker/TypeCheckerFieldAccessTests.java | 4 ++-- .../TypeCheckerStructDefinitionTests.java | 2 +- 5 files changed, 42 insertions(+), 9 deletions(-) (limited to 'src/test/java') 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)) )) -- cgit v1.2.3