diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-03-21 17:34:56 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-03-21 17:34:56 +0000 |
| commit | 1a92052dc7b1cbcf15f0b9f497942e397375d3b4 (patch) | |
| tree | f60567eaf7f7900b4afcdbc6826f32f183e32378 /src/main/java | |
| parent | bedd122699360efcaf07310e713e0eec1e7457ec (diff) | |
Serialize Patio function definition to Protobuf
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java | 48 |
1 files changed, 47 insertions, 1 deletions
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) { |
