From 1a92052dc7b1cbcf15f0b9f497942e397375d3b4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Mar 2026 17:34:56 +0000 Subject: Serialize Patio function definition to Protobuf --- .../compiler/patio/protobuf/PatioToProtobuf.java | 48 +++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (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 56cbc260..6a849beb 100644 --- a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java +++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java @@ -65,7 +65,9 @@ public class PatioToProtobuf { ); } case PatioFunctionDefinition functionDefinition -> { - throw new UnsupportedOperationException("TODO"); + builder.setFunctionDefinition( + serializeFunctionDefinition(functionDefinition, parentSource) + ); } } @@ -104,6 +106,12 @@ public class PatioToProtobuf { parentSource ); + case FUNCTION_DEFINITION -> + deserializeFunctionDefinition( + elementProtobuf.getFunctionDefinition(), + parentSource + ); + case VALUE_NOT_SET -> throw new UnsupportedOperationException("TODO"); }; @@ -230,6 +238,44 @@ public class PatioToProtobuf { ); } + private static PatioProtobuf.PatioFunctionDefinition serializeFunctionDefinition( + PatioFunctionDefinition functionDefinition, + Source parentSource + ) { + var builder = PatioProtobuf.PatioFunctionDefinition.newBuilder(); + builder.setSource(serializeSource(functionDefinition.source(), parentSource)); + builder.setName(functionDefinition.name()); + builder.setVisibility(serializeVisibility(functionDefinition.visibility())); + for (var param : functionDefinition.locals()) { + builder.addLocals(serializeLocal(param)); + } + builder.setReturnType(serializeType(functionDefinition.returnType())); + for (var bodyInstruction : functionDefinition.body()) { + builder.addBody(serializeInstruction(bodyInstruction, functionDefinition.source())); + } + return builder.build(); + } + + private static PatioFunctionDefinition deserializeFunctionDefinition( + PatioProtobuf.PatioFunctionDefinition functionDefinitionProtobuf, + Source parentSource + ) { + var source = deserializeSource(functionDefinitionProtobuf.getSource(), parentSource); + + return new PatioFunctionDefinition( + functionDefinitionProtobuf.getName(), + deserializeVisibility(functionDefinitionProtobuf.getVisibility()), + functionDefinitionProtobuf.getLocalsList().stream() + .map(PatioToProtobuf::deserializeLocal) + .collect(Collectors.toList()), + deserializeType(functionDefinitionProtobuf.getReturnType()), + functionDefinitionProtobuf.getBodyList().stream() + .map(bodyInstructionProtobuf -> deserializeInstruction(bodyInstructionProtobuf, source)) + .collect(Collectors.toList()), + source + ); + } + // == Locals == private static PatioProtobuf.PatioLocal serializeLocal(PatioLocal local) { -- cgit v1.2.3