From 4ebb6355bd2481e844d07a649dce3daa2b9fa881 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Mar 2026 11:25:08 +0000 Subject: Serialize Patio data layouts to Protobuf --- .../compiler/patio/protobuf/PatioToProtobuf.java | 94 +++++++++++++++++++++- 1 file changed, 90 insertions(+), 4 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java index 07b652d8..58157c86 100644 --- a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java +++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java @@ -1,10 +1,11 @@ package org.shedlang.compiler.patio.protobuf; import org.shedlang.compiler.patio.*; +import org.shedlang.compiler.patio.types.*; import org.shedlang.compiler.sources.Source; -import org.shedlang.compiler.sources.protobuf.SourceToProtobuf; import java.util.Optional; +import java.util.stream.Collectors; import static org.shedlang.compiler.sources.protobuf.SourceToProtobuf.serializeSource; @@ -68,7 +69,7 @@ public class PatioToProtobuf { Source parentSource ) { var builder = PatioProtobuf.PatioDataElementImmutableDefinition.newBuilder(); - builder.setSource(SourceToProtobuf.serializeSource(element.source(), parentSource)); + builder.setSource(serializeSource(element.source(), parentSource)); builder.setName(element.name()); builder.setVisibility(serializeVisibility(element.visibility())); return builder.build(); @@ -79,7 +80,7 @@ public class PatioToProtobuf { Source parentSource ) { var builder = PatioProtobuf.PatioDataElementMutableDeclaration.newBuilder(); - builder.setSource(SourceToProtobuf.serializeSource(element.source(), parentSource)); + builder.setSource(serializeSource(element.source(), parentSource)); builder.setName(element.name()); return builder.build(); } @@ -89,7 +90,7 @@ public class PatioToProtobuf { Source parentSource ) { var builder = PatioProtobuf.PatioDataElementMutableDefinition.newBuilder(); - builder.setSource(SourceToProtobuf.serializeSource(element.source(), parentSource)); + builder.setSource(serializeSource(element.source(), parentSource)); builder.setName(element.name()); builder.setVisibility(serializeVisibility(element.visibility())); return builder.build(); @@ -101,4 +102,89 @@ public class PatioToProtobuf { case PUBLIC -> PatioProtobuf.PatioVisibility.PUBLIC; }; } + + public static PatioProtobuf.PatioDataLayout serializeDataLayout(PatioDataLayout layout) { + var builder = PatioProtobuf.PatioDataLayout.newBuilder(); + switch (layout) { + case PatioDataLayoutArray patioDataLayoutArray -> { + var arrayBuilder = PatioProtobuf.PatioDataLayoutArray.newBuilder(); + arrayBuilder.setElement(serializeDataLayout(patioDataLayoutArray.element())); + arrayBuilder.setSize(patioDataLayoutArray.size()); + builder.setArray(arrayBuilder); + } + + case PatioDataLayoutBool patioDataLayoutBool -> { + builder.setBool(PatioProtobuf.PatioDataLayoutBool.newBuilder().build()); + } + + case PatioDataLayoutByte patioDataLayoutByte -> { + builder.setByte(PatioProtobuf.PatioDataLayoutByte.newBuilder().build()); + } + + case PatioDataLayoutDataPtr patioDataLayoutDataPtr -> { + builder.setDataPtr(PatioProtobuf.PatioDataLayoutDataPtr.newBuilder().build()); + } + + case PatioDataLayoutFunctionPtr patioDataLayoutFunctionPtr -> { + builder.setFunctionPtr(PatioProtobuf.PatioDataLayoutFunctionPtr.newBuilder().build()); + } + + case PatioDataLayoutInt patioDataLayoutInt -> { + builder.setInt(PatioProtobuf.PatioDataLayoutInt.newBuilder().build()); + } + + case PatioDataLayoutInt32 patioDataLayoutInt32 -> { + builder.setInt32(PatioProtobuf.PatioDataLayoutInt32.newBuilder().build()); + } + + case PatioDataLayoutStruct patioDataLayoutStruct -> { + var structBuilder = PatioProtobuf.PatioDataLayoutStruct.newBuilder(); + for (var element : patioDataLayoutStruct.elements()) { + structBuilder.addElements(serializeDataLayout(element)); + } + builder.setStruct(structBuilder); + } + } + + return builder.build(); + } + + public static PatioDataLayout deserializeDataLayout(PatioProtobuf.PatioDataLayout layoutProtobuf) { + return switch (layoutProtobuf.getValueCase()) { + case ARRAY -> + PatioDataLayouts.array( + deserializeDataLayout(layoutProtobuf.getArray().getElement()), + layoutProtobuf.getArray().getSize() + ); + + case BOOL -> + PatioDataLayouts.BOOL; + + case BYTE -> + PatioDataLayouts.BYTE; + + case DATA_PTR -> + PatioDataLayouts.DATA_PTR; + + case FUNCTION_PTR -> + PatioDataLayouts.FUNCTION_PTR; + + case INT -> + PatioDataLayouts.INT; + + case INT32 -> + PatioDataLayouts.INT32; + + case STRUCT -> + PatioDataLayouts.struct( + layoutProtobuf.getStruct().getElementsList().stream() + .map(PatioToProtobuf::deserializeDataLayout) + .collect(Collectors.toList()) + ); + + case VALUE_NOT_SET -> { + throw new UnsupportedOperationException("TODO"); + } + }; + } } -- cgit v1.2.3