diff options
4 files changed, 92 insertions, 29 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java index 614f368c..e7dd1522 100644 --- a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java +++ b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java @@ -17,6 +17,46 @@ import java.util.Optional; import java.util.function.Function; public class PatioToFlatbuffers { + // == Compilation units == + + public static int serializeCompilationUnit( + FlatBufferBuilder builder, + PatioCompilationUnit compilationUnit + ) { + var sourceFbs = SourceToFlatbuffers.serializeSource( + builder, + compilationUnit.source(), + Optional.empty() + ); + + var elementsOffsetsFbs = compilationUnit.elements().stream() + .mapToInt(element -> serializeCompilationUnitElement(builder, element, compilationUnit.source())) + .toArray(); + var elementsVectorFbs = PatioCompilationUnitFbs.createElementsVector(builder, elementsOffsetsFbs); + + PatioCompilationUnitFbs.startPatioCompilationUnitFbs(builder); + PatioCompilationUnitFbs.addSource(builder, sourceFbs); + PatioCompilationUnitFbs.addElements(builder, elementsVectorFbs); + return PatioCompilationUnitFbs.endPatioCompilationUnitFbs(builder); + } + + public static PatioCompilationUnit deserializeCompilationUnit( + PatioCompilationUnitFbs compilationUnitFbs + ) { + var source = SourceToFlatbuffers.deserializeSource( + compilationUnitFbs.source(), + Optional.empty() + ); + + var elements = deserializeVector( + compilationUnitFbs::elements, + compilationUnitFbs.elementsLength(), + elementFbs -> deserializeCompilationUnitElement(elementFbs, source) + ); + + return new PatioCompilationUnit(elements, source); + } + // == Compilation unit elements == public static int serializeCompilationUnitElement( diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java index cfb28691..7b894f40 100644 --- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java +++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java @@ -1,10 +1,7 @@ package org.shedlang.compiler.patio.serialization; import org.junit.jupiter.api.Test; -import org.shedlang.compiler.patio.PatioCompilationUnitElement; -import org.shedlang.compiler.patio.PatioFunctionDeclaration; -import org.shedlang.compiler.patio.PatioFunctionDefinition; -import org.shedlang.compiler.patio.PatioVisibility; +import org.shedlang.compiler.patio.*; import org.shedlang.compiler.patio.instructions.Patio; import org.shedlang.compiler.patio.instructions.PatioInstruction; import org.shedlang.compiler.patio.operands.PatioOperand; @@ -21,6 +18,27 @@ import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; public abstract class PatioSerializationTests { + + // == Compilation unit == + + protected abstract PatioCompilationUnit deserializeCompilationUnit(byte[] buffer); + protected abstract byte[] serializeCompilationUnit(PatioCompilationUnit value); + + @Test + public void canSerializeCompilationUnit() { + var element = PatioFunctionDefinition.builder() + .withName("f") + .withReturnType(PatioTypes.VOID) + .build(); + var compilationUnit = Patio.compilationUnit(List.of(element)); + + var deserializedCompilationUnit = deserializeCompilationUnit( + serializeCompilationUnit(compilationUnit) + ); + + assertThat(deserializedCompilationUnit, equalTo(compilationUnit)); + } + // == Compilation unit elements == protected abstract PatioCompilationUnitElement deserializeCompilationUnitElement(byte[] buffer, Source parentSource); diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java index 00be1e28..9ff08678 100644 --- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java +++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.patio.serialization; import com.google.flatbuffers.FlatBufferBuilder; +import org.shedlang.compiler.patio.PatioCompilationUnit; import org.shedlang.compiler.patio.PatioCompilationUnitElement; import org.shedlang.compiler.patio.flatbuffers.*; import org.shedlang.compiler.patio.instructions.PatioInstruction; @@ -16,6 +17,20 @@ import java.nio.ByteBuffer; public class PatioToFlatbuffersTests extends PatioSerializationTests { @Override + protected byte[] serializeCompilationUnit(PatioCompilationUnit value) { + var builder = new FlatBufferBuilder(); + var valueFbs = PatioToFlatbuffers.serializeCompilationUnit(builder, value); + builder.finish(valueFbs); + return builder.sizedByteArray(); + } + + @Override + protected PatioCompilationUnit deserializeCompilationUnit(byte[] buffer) { + var valueFbs = PatioCompilationUnitFbs.getRootAsPatioCompilationUnitFbs(ByteBuffer.wrap(buffer)); + return PatioToFlatbuffers.deserializeCompilationUnit(valueFbs); + } + + @Override protected byte[] serializeCompilationUnitElement(PatioCompilationUnitElement value, Source parentSource) { var builder = new FlatBufferBuilder(); var valueFbs = PatioToFlatbuffers.serializeCompilationUnitElement(builder, value, parentSource); diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java index 168f5372..d75016cb 100644 --- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java +++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java @@ -1,27 +1,34 @@ package org.shedlang.compiler.patio.serialization; import com.google.protobuf.InvalidProtocolBufferException; -import org.junit.jupiter.api.Test; +import org.shedlang.compiler.patio.PatioCompilationUnit; import org.shedlang.compiler.patio.PatioCompilationUnitElement; -import org.shedlang.compiler.patio.PatioFunctionDefinition; -import org.shedlang.compiler.patio.instructions.Patio; import org.shedlang.compiler.patio.instructions.PatioInstruction; import org.shedlang.compiler.patio.operands.PatioOperand; import org.shedlang.compiler.patio.protobuf.PatioProtobuf; import org.shedlang.compiler.patio.types.PatioDataLayout; import org.shedlang.compiler.patio.types.PatioDataValue; import org.shedlang.compiler.patio.types.PatioType; -import org.shedlang.compiler.patio.types.PatioTypes; import org.shedlang.compiler.patio.values.PatioDataPtrValue; import org.shedlang.compiler.patio.values.PatioIntValue; import org.shedlang.compiler.sources.Source; -import java.util.List; +public class PatioToProtobufTests extends PatioSerializationTests { + @Override + protected byte[] serializeCompilationUnit(PatioCompilationUnit value) { + return PatioToProtobuf.serializeCompilationUnit(value).toByteArray(); + } -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.equalTo; + @Override + protected PatioCompilationUnit deserializeCompilationUnit(byte[] buffer) { + try { + var valueProtobuf = PatioProtobuf.PatioCompilationUnit.parseFrom(buffer); + return PatioToProtobuf.deserializeCompilationUnit(valueProtobuf); + } catch (InvalidProtocolBufferException exception) { + throw new RuntimeException(exception); + } + } -public class PatioToProtobufTests extends PatioSerializationTests { @Override protected byte[] serializeCompilationUnitElement(PatioCompilationUnitElement value, Source parentSource) { return PatioToProtobuf.serializeCompilationUnitElement(value, parentSource).toByteArray(); @@ -141,21 +148,4 @@ public class PatioToProtobufTests extends PatioSerializationTests { throw new RuntimeException(exception); } } - - // == Compilation unit == - - @Test - public void canSerializeCompilationUnit() { - var element = PatioFunctionDefinition.builder() - .withName("f") - .withReturnType(PatioTypes.VOID) - .build(); - var compilationUnit = Patio.compilationUnit(List.of(element)); - - var deserializedCompilationUnit = PatioToProtobuf.deserializeCompilationUnit( - PatioToProtobuf.serializeCompilationUnit(compilationUnit) - ); - - assertThat(deserializedCompilationUnit, equalTo(compilationUnit)); - } } |
