From 8db8026f1ce7d31eab18b02dab5ed54a512dcb48 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Mar 2026 15:16:25 +0000 Subject: Serialize Patio function declarations to Protobuf --- .../compiler/patio/protobuf/PatioToProtobuf.java | 251 ++++++++++++++------- 1 file changed, 168 insertions(+), 83 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 8bdb278b..a08f42b6 100644 --- a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java +++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java @@ -58,7 +58,9 @@ public class PatioToProtobuf { ); } case PatioFunctionDeclaration functionDeclaration -> { - throw new UnsupportedOperationException("TODO"); + builder.setFunctionDeclaration( + serializeFunctionDeclaration(functionDeclaration, parentSource) + ); } case PatioFunctionDefinition functionDefinition -> { throw new UnsupportedOperationException("TODO"); @@ -94,6 +96,12 @@ public class PatioToProtobuf { parentSource ); + case FUNCTION_DECLARATION -> + deserializeFunctionDeclaration( + elementProtobuf.getFunctionDeclaration(), + parentSource + ); + case VALUE_NOT_SET -> throw new UnsupportedOperationException("TODO"); }; @@ -192,6 +200,106 @@ public class PatioToProtobuf { ); } + private static PatioProtobuf.PatioFunctionDeclaration serializeFunctionDeclaration( + PatioFunctionDeclaration functionDeclaration, + Source parentSource + ) { + var builder = PatioProtobuf.PatioFunctionDeclaration.newBuilder(); + builder.setSource(serializeSource(functionDeclaration.source(), parentSource)); + builder.setName(functionDeclaration.name()); + for (var param : functionDeclaration.params()) { + builder.addParams(serializeLocal(param)); + } + builder.setReturnType(serializeType(functionDeclaration.returnType())); + return builder.build(); + } + + private static PatioFunctionDeclaration deserializeFunctionDeclaration( + PatioProtobuf.PatioFunctionDeclaration functionDeclarationProtobuf, + Source parentSource + ) { + return new PatioFunctionDeclaration( + functionDeclarationProtobuf.getName(), + functionDeclarationProtobuf.getParamsList().stream() + .map(PatioToProtobuf::deserializeLocal) + .collect(Collectors.toList()), + deserializeType(functionDeclarationProtobuf.getReturnType()), + deserializeSource(functionDeclarationProtobuf.getSource(), parentSource) + ); + } + + // == Locals == + + private static PatioProtobuf.PatioLocal serializeLocal(PatioLocal local) { + var builder = PatioProtobuf.PatioLocal.newBuilder(); + builder.setName(local.name()); + builder.setType(serializeType(local.type())); + builder.setLocalType(serializeLocalType(local.localType())); + return builder.build(); + } + + private static PatioLocal deserializeLocal(PatioProtobuf.PatioLocal localProtobuf) { + return new PatioLocal( + localProtobuf.getName(), + deserializeType(localProtobuf.getType()), + deserializeLocalType(localProtobuf.getLocalType()) + ); + } + + private static PatioProtobuf.PatioLocalType serializeLocalType(PatioLocalType localType) { + return switch (localType) { + case PARAM -> + PatioProtobuf.PatioLocalType.PARAM; + + case VAL -> + PatioProtobuf.PatioLocalType.VAL; + + case VAR -> + PatioProtobuf.PatioLocalType.VAR; + }; + } + + private static PatioLocalType deserializeLocalType(PatioProtobuf.PatioLocalType localTypeProtobuf) { + return switch (localTypeProtobuf) { + case PARAM -> + PatioLocalType.PARAM; + + case VAL -> + PatioLocalType.VAL; + + case VAR -> + PatioLocalType.VAR; + + case UNRECOGNIZED -> + throw new UnsupportedOperationException("TODO"); + }; + } + + // == Visibility == + + private static PatioProtobuf.PatioVisibility serializeVisibility(PatioVisibility visibility) { + return switch (visibility) { + case PRIVATE -> + PatioProtobuf.PatioVisibility.PRIVATE; + + case PUBLIC -> + PatioProtobuf.PatioVisibility.PUBLIC; + }; + } + + private static PatioVisibility deserializeVisibility(PatioProtobuf.PatioVisibility visibility) { + return switch (visibility) { + case PRIVATE -> + PatioVisibility.PRIVATE; + + case PUBLIC -> + PatioVisibility.PUBLIC; + + case UNRECOGNIZED -> + throw new UnsupportedOperationException("TODO"); + }; + } + // == Data ptr values == public static PatioProtobuf.PatioDataPtrValue serializeDataPtrValue(PatioDataPtrValue value) { @@ -275,6 +383,65 @@ public class PatioToProtobuf { }; } + // == Types == + + public static PatioProtobuf.PatioType serializeType(PatioType type) { + var builder = PatioProtobuf.PatioType.newBuilder(); + + switch (type) { + case PatioBoolType patioBoolType -> + builder.getBoolBuilder(); + + case PatioByteType patioByteType -> + builder.getByteBuilder(); + + case PatioDataPtrType patioDataPtrType -> + builder.getDataPtrBuilder(); + + case PatioFunctionPtrType patioFunctionPtrType -> + builder.getFunctionPtrBuilder(); + + case PatioInt32Type patioInt32Type -> + builder.getInt32Builder(); + + case PatioIntType patioIntType -> + builder.getIntBuilder(); + + case PatioVoidType patioVoidType -> + builder.getVoidBuilder(); + } + + return builder.build(); + } + + public static PatioType deserializeType(PatioProtobuf.PatioType type) { + return switch (type.getValueCase()) { + case BOOL -> + PatioTypes.BOOL; + + case BYTE -> + PatioTypes.BYTE; + + case DATA_PTR -> + PatioTypes.DATA_PTR; + + case FUNCTION_PTR -> + PatioTypes.FUNCTION_PTR; + + case INT -> + PatioTypes.INT; + + case INT32 -> + PatioTypes.INT32; + + case VOID -> + PatioTypes.VOID; + + case VALUE_NOT_SET -> + throw new UnsupportedOperationException("TODO"); + }; + } + // == Data layouts == public static PatioProtobuf.PatioDataLayout serializeDataLayout(PatioDataLayout layout) { @@ -455,86 +622,4 @@ public class PatioToProtobuf { } }; } - - // == Visibility == - - private static PatioProtobuf.PatioVisibility serializeVisibility(PatioVisibility visibility) { - return switch (visibility) { - case PRIVATE -> - PatioProtobuf.PatioVisibility.PRIVATE; - - case PUBLIC -> - PatioProtobuf.PatioVisibility.PUBLIC; - }; - } - - private static PatioVisibility deserializeVisibility(PatioProtobuf.PatioVisibility visibility) { - return switch (visibility) { - case PRIVATE -> - PatioVisibility.PRIVATE; - - case PUBLIC -> - PatioVisibility.PUBLIC; - - case UNRECOGNIZED -> - throw new UnsupportedOperationException("TODO"); - }; - } - - public static PatioProtobuf.PatioType serializeType(PatioType type) { - var builder = PatioProtobuf.PatioType.newBuilder(); - - switch (type) { - case PatioBoolType patioBoolType -> - builder.getBoolBuilder(); - - case PatioByteType patioByteType -> - builder.getByteBuilder(); - - case PatioDataPtrType patioDataPtrType -> - builder.getDataPtrBuilder(); - - case PatioFunctionPtrType patioFunctionPtrType -> - builder.getFunctionPtrBuilder(); - - case PatioInt32Type patioInt32Type -> - builder.getInt32Builder(); - - case PatioIntType patioIntType -> - builder.getIntBuilder(); - - case PatioVoidType patioVoidType -> - builder.getVoidBuilder(); - } - - return builder.build(); - } - - public static PatioType deserializeType(PatioProtobuf.PatioType type) { - return switch (type.getValueCase()) { - case BOOL -> - PatioTypes.BOOL; - - case BYTE -> - PatioTypes.BYTE; - - case DATA_PTR -> - PatioTypes.DATA_PTR; - - case FUNCTION_PTR -> - PatioTypes.FUNCTION_PTR; - - case INT -> - PatioTypes.INT; - - case INT32 -> - PatioTypes.INT32; - - case VOID -> - PatioTypes.VOID; - - case VALUE_NOT_SET -> - throw new UnsupportedOperationException("TODO"); - }; - } } -- cgit v1.2.3