aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-21 17:34:56 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-21 17:34:56 +0000
commit1a92052dc7b1cbcf15f0b9f497942e397375d3b4 (patch)
treef60567eaf7f7900b4afcdbc6826f32f183e32378 /src/main/java
parentbedd122699360efcaf07310e713e0eec1e7457ec (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.java48
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) {