Skip to content

[pigeon] removes restriction on number of custom types per file #6840

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion packages/pigeon/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
## NEXT
## 21.2.0

* Removes restriction on number of custom types.
* [java] Fixes bug with multiple enums.
* [java] Removes `Object` from generics.
* [objc] Fixes bug with multiple enums per data class.
* Updates `varPrefix` and `classMemberNamePrefix`.
* Updates minimum supported SDK version to Flutter 3.19/Dart 3.3.

## 21.1.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public FlutterError(@NonNull String code, @Nullable String message, @Nullable Ob

@NonNull
protected static ArrayList<Object> wrapError(@NonNull Throwable exception) {
ArrayList<Object> errorList = new ArrayList<Object>(3);
ArrayList<Object> errorList = new ArrayList<>(3);
if (exception instanceof FlutterError) {
FlutterError error = (FlutterError) exception;
errorList.add(error.code);
Expand Down Expand Up @@ -77,7 +77,7 @@ public enum Code {

final int index;

private Code(final int index) {
Code(final int index) {
this.index = index;
}
}
Expand Down Expand Up @@ -199,23 +199,23 @@ public static final class Builder {

@NonNull
ArrayList<Object> toList() {
ArrayList<Object> toListResult = new ArrayList<Object>(4);
ArrayList<Object> toListResult = new ArrayList<>(4);
toListResult.add(name);
toListResult.add(description);
toListResult.add(code);
toListResult.add(data);
return toListResult;
}

static @NonNull MessageData fromList(@NonNull ArrayList<Object> __pigeon_list) {
static @NonNull MessageData fromList(@NonNull ArrayList<Object> pigeonVar_list) {
MessageData pigeonResult = new MessageData();
Object name = __pigeon_list.get(0);
Object name = pigeonVar_list.get(0);
pigeonResult.setName((String) name);
Object description = __pigeon_list.get(1);
Object description = pigeonVar_list.get(1);
pigeonResult.setDescription((String) description);
Object code = __pigeon_list.get(2);
Object code = pigeonVar_list.get(2);
pigeonResult.setCode((Code) code);
Object data = __pigeon_list.get(3);
Object data = pigeonVar_list.get(3);
pigeonResult.setData((Map<String, String>) data);
return pigeonResult;
}
Expand All @@ -230,23 +230,25 @@ private PigeonCodec() {}
protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) {
switch (type) {
case (byte) 129:
return MessageData.fromList((ArrayList<Object>) readValue(buffer));
{
Object value = readValue(buffer);
return value == null ? null : Code.values()[(int) value];
}
case (byte) 130:
Object value = readValue(buffer);
return value == null ? null : Code.values()[(int) value];
return MessageData.fromList((ArrayList<Object>) readValue(buffer));
default:
return super.readValueOfType(type, buffer);
}
}

@Override
protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) {
if (value instanceof MessageData) {
if (value instanceof Code) {
stream.write(129);
writeValue(stream, ((MessageData) value).toList());
} else if (value instanceof Code) {
stream.write(130);
writeValue(stream, value == null ? null : ((Code) value).index);
} else if (value instanceof MessageData) {
stream.write(130);
writeValue(stream, ((MessageData) value).toList());
} else {
super.writeValue(stream, value);
}
Expand Down Expand Up @@ -312,13 +314,12 @@ static void setUp(
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
try {
String output = api.getHostLanguage();
wrapped.add(0, output);
} catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
Expand All @@ -336,7 +337,7 @@ static void setUp(
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
ArrayList<Object> args = (ArrayList<Object>) message;
Number aArg = (Number) args.get(0);
Number bArg = (Number) args.get(1);
Expand All @@ -347,8 +348,7 @@ static void setUp(
(bArg == null) ? null : bArg.longValue());
wrapped.add(0, output);
} catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
Expand All @@ -366,7 +366,7 @@ static void setUp(
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
ArrayList<Object> args = (ArrayList<Object>) message;
MessageData messageArg = (MessageData) args.get(0);
Result<Boolean> resultCallback =
Expand Down Expand Up @@ -405,8 +405,7 @@ public MessageFlutterApi(
this.messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix;
}

/** Public interface for sending reply. */
/** The codec used by MessageFlutterApi. */
/** Public interface for sending reply. The codec used by MessageFlutterApi. */
static @NonNull MessageCodec<Object> getCodec() {
return PigeonCodec.INSTANCE;
}
Expand All @@ -418,16 +417,14 @@ public void flutterMethod(@Nullable String aStringArg, @NonNull Result<String> r
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(binaryMessenger, channelName, getCodec());
channel.send(
new ArrayList<Object>(Collections.singletonList(aStringArg)),
new ArrayList<>(Collections.singletonList(aStringArg)),
channelReply -> {
if (channelReply instanceof List) {
List<Object> listReply = (List<Object>) channelReply;
if (listReply.size() > 1) {
result.error(
new FlutterError(
(String) listReply.get(0),
(String) listReply.get(1),
(String) listReply.get(2)));
(String) listReply.get(0), (String) listReply.get(1), listReply.get(2)));
} else if (listReply.get(0) == null) {
result.error(
new FlutterError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,11 @@ data class MessageData(
val data: Map<String?, String?>
) {
companion object {
@Suppress("LocalVariableName")
fun fromList(__pigeon_list: List<Any?>): MessageData {
val name = __pigeon_list[0] as String?
val description = __pigeon_list[1] as String?
val code = __pigeon_list[2] as Code
val data = __pigeon_list[3] as Map<String?, String?>
fun fromList(pigeonVar_list: List<Any?>): MessageData {
val name = pigeonVar_list[0] as String?
val description = pigeonVar_list[1] as String?
val code = pigeonVar_list[2] as Code
val data = pigeonVar_list[3] as Map<String?, String?>
return MessageData(name, description, code, data)
}
}
Expand All @@ -89,24 +88,24 @@ private object MessagesPigeonCodec : StandardMessageCodec() {
override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? {
return when (type) {
129.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { MessageData.fromList(it) }
return (readValue(buffer) as Int?)?.let { Code.ofRaw(it) }
}
130.toByte() -> {
return (readValue(buffer) as Int?)?.let { Code.ofRaw(it) }
return (readValue(buffer) as? List<Any?>)?.let { MessageData.fromList(it) }
}
else -> super.readValueOfType(type, buffer)
}
}

override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
when (value) {
is MessageData -> {
is Code -> {
stream.write(129)
writeValue(stream, value.toList())
writeValue(stream, value.raw)
}
is Code -> {
is MessageData -> {
stream.write(130)
writeValue(stream, value.raw)
writeValue(stream, value.toList())
}
else -> super.writeValue(stream, value)
}
Expand Down
28 changes: 14 additions & 14 deletions packages/pigeon/example/app/ios/Runner/Messages.g.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,11 @@ struct MessageData {
var data: [String?: String?]

// swift-format-ignore: AlwaysUseLowerCamelCase
static func fromList(_ __pigeon_list: [Any?]) -> MessageData? {
let name: String? = nilOrValue(__pigeon_list[0])
let description: String? = nilOrValue(__pigeon_list[1])
let code = __pigeon_list[2] as! Code
let data = __pigeon_list[3] as! [String?: String?]
static func fromList(_ pigeonVar_list: [Any?]) -> MessageData? {
let name: String? = nilOrValue(pigeonVar_list[0])
let description: String? = nilOrValue(pigeonVar_list[1])
let code = pigeonVar_list[2] as! Code
let data = pigeonVar_list[3] as! [String?: String?]

return MessageData(
name: name,
Expand All @@ -108,18 +108,18 @@ struct MessageData {
]
}
}

private class MessagesPigeonCodecReader: FlutterStandardReader {
override func readValue(ofType type: UInt8) -> Any? {
switch type {
case 129:
return MessageData.fromList(self.readValue() as! [Any?])
case 130:
var enumResult: Code? = nil
let enumResultAsInt: Int? = nilOrValue(self.readValue() as? Int)
if let enumResultAsInt = enumResultAsInt {
enumResult = Code(rawValue: enumResultAsInt)
return Code(rawValue: enumResultAsInt)
}
return enumResult
return nil
case 130:
return MessageData.fromList(self.readValue() as! [Any?])
default:
return super.readValue(ofType: type)
}
Expand All @@ -128,12 +128,12 @@ private class MessagesPigeonCodecReader: FlutterStandardReader {

private class MessagesPigeonCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) {
if let value = value as? MessageData {
if let value = value as? Code {
super.writeByte(129)
super.writeValue(value.toList())
} else if let value = value as? Code {
super.writeByte(130)
super.writeValue(value.rawValue)
} else if let value = value as? MessageData {
super.writeByte(130)
super.writeValue(value.toList())
} else {
super.writeValue(value)
}
Expand Down
Loading