aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-21 15:16:25 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-21 15:16:25 +0000
commit8db8026f1ce7d31eab18b02dab5ed54a512dcb48 (patch)
tree8c7f102a6ad745039f265f52521fd681570c2cd2 /src/main/java
parentc83895700fad8ea3cd2dd97683f2439472cdff96 (diff)
Serialize Patio function declarations to Protobuf
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java251
1 files changed, 168 insertions, 83 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 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");
- };
- }
}