diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index 803f62bc5118..8de93b7eb0c7 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,7 @@ +## 27.2.0 + +* Adds support for empty data classes. + ## 27.1.1 * [dart] Adds usage documentation to generated event channel methods, and diff --git a/packages/pigeon/lib/src/dart/dart_generator.dart b/packages/pigeon/lib/src/dart/dart_generator.dart index 3218103e5953..341d3e3ae9f7 100644 --- a/packages/pigeon/lib/src/dart/dart_generator.dart +++ b/packages/pigeon/lib/src/dart/dart_generator.dart @@ -222,17 +222,19 @@ class DartGenerator extends StructuredGenerator { indent.write('${sealed}class ${classDefinition.name} $implements'); indent.addScoped('{', '}', () { - if (classDefinition.fields.isEmpty) { + if (classDefinition.isSealed) { return; } _writeConstructor(indent, classDefinition); - indent.newln(); - for (final NamedType field in getFieldsInSerializationOrder(classDefinition)) { - addDocumentationComments(indent, field.documentationComments, docCommentSpec); - - final String datatype = addGenericTypes(field.type); - indent.writeln('$datatype ${field.name};'); + if (classDefinition.fields.isNotEmpty) { indent.newln(); + for (final NamedType field in getFieldsInSerializationOrder(classDefinition)) { + addDocumentationComments(indent, field.documentationComments, docCommentSpec); + + final String datatype = addGenericTypes(field.type); + indent.writeln('$datatype ${field.name};'); + indent.newln(); + } } _writeToList(indent, classDefinition); indent.newln(); @@ -264,6 +266,10 @@ class DartGenerator extends StructuredGenerator { void _writeConstructor(Indent indent, Class classDefinition) { indent.write(classDefinition.name); + if (classDefinition.fields.isEmpty) { + indent.addln('();'); + return; + } indent.addScoped('({', '});', () { for (final NamedType field in getFieldsInSerializationOrder(classDefinition)) { final required = !field.type.isNullable && field.defaultValue == null ? 'required ' : ''; diff --git a/packages/pigeon/lib/src/generator_tools.dart b/packages/pigeon/lib/src/generator_tools.dart index dbc56d4823b8..1f3f71af1f12 100644 --- a/packages/pigeon/lib/src/generator_tools.dart +++ b/packages/pigeon/lib/src/generator_tools.dart @@ -15,7 +15,7 @@ import 'generator.dart'; /// The current version of pigeon. /// /// This must match the version in pubspec.yaml. -const String pigeonVersion = '27.1.1'; +const String pigeonVersion = '27.2.0'; /// Default plugin package name. const String defaultPluginPackageName = 'dev.flutter.pigeon'; diff --git a/packages/pigeon/lib/src/java/java_generator.dart b/packages/pigeon/lib/src/java/java_generator.dart index f37769520866..1908b494ad58 100644 --- a/packages/pigeon/lib/src/java/java_generator.dart +++ b/packages/pigeon/lib/src/java/java_generator.dart @@ -349,7 +349,11 @@ class JavaGenerator extends StructuredGenerator { final Iterable checks = classDefinition.fields.map((NamedType field) { return 'pigeonDeepEquals(${field.name}, that.${field.name})'; }); - indent.writeln('return ${checks.join(' && ')};'); + if (checks.isEmpty) { + indent.writeln('return true;'); + } else { + indent.writeln('return ${checks.join(' && ')};'); + } }); indent.newln(); diff --git a/packages/pigeon/lib/src/kotlin/kotlin_generator.dart b/packages/pigeon/lib/src/kotlin/kotlin_generator.dart index 91b605fc78fe..9e6f0397b0dd 100644 --- a/packages/pigeon/lib/src/kotlin/kotlin_generator.dart +++ b/packages/pigeon/lib/src/kotlin/kotlin_generator.dart @@ -399,24 +399,35 @@ class KotlinGenerator extends StructuredGenerator { void _writeDataClassSignature(Indent indent, Class classDefinition, {bool private = false}) { final privateString = private ? 'private ' : ''; - final classType = classDefinition.isSealed ? 'sealed' : 'data'; + final String classType; + if (classDefinition.isSealed) { + classType = 'sealed '; + } else if (classDefinition.fields.isEmpty) { + classType = ''; + } else { + classType = 'data '; + } final inheritance = classDefinition.superClass != null ? ' : ${classDefinition.superClassName}()' : ''; - indent.write('$privateString$classType class ${classDefinition.name} '); + indent.write('$privateString${classType}class ${classDefinition.name} '); if (classDefinition.isSealed) { return; } - indent.addScoped('(', ')$inheritance', () { - for (final NamedType element in getFieldsInSerializationOrder(classDefinition)) { - _writeClassField(indent, element); - if (getFieldsInSerializationOrder(classDefinition).last != element) { - indent.addln(','); - } else { - indent.newln(); + if (classDefinition.fields.isEmpty) { + indent.add(inheritance); + } else { + indent.addScoped('(', ')$inheritance', () { + for (final NamedType element in getFieldsInSerializationOrder(classDefinition)) { + _writeClassField(indent, element); + if (getFieldsInSerializationOrder(classDefinition).last != element) { + indent.addln(','); + } else { + indent.newln(); + } } - } - }); + }); + } } @override diff --git a/packages/pigeon/lib/src/objc/objc_generator.dart b/packages/pigeon/lib/src/objc/objc_generator.dart index 9751b5f8e9f3..9a61d5e2a304 100644 --- a/packages/pigeon/lib/src/objc/objc_generator.dart +++ b/packages/pigeon/lib/src/objc/objc_generator.dart @@ -519,7 +519,9 @@ class ObjcSourceGenerator extends StructuredGenerator { final String className = _className(generatorOptions.prefix, classDefinition.name); indent.writeln('@implementation $className'); - _writeObjcSourceClassInitializer(generatorOptions, root, indent, classDefinition, className); + if (classDefinition.fields.isNotEmpty) { + _writeObjcSourceClassInitializer(generatorOptions, root, indent, classDefinition, className); + } writeClassDecode( generatorOptions, root, @@ -1900,10 +1902,8 @@ void _writeDataClassDeclaration( addDocumentationComments(indent, classDefinition.documentationComments, _docCommentSpec); indent.writeln('@interface ${_className(prefix, classDefinition.name)} : NSObject'); - if (getFieldsInSerializationOrder(classDefinition).isNotEmpty) { - if (getFieldsInSerializationOrder( - classDefinition, - ).map((NamedType e) => !e.type.isNullable).any((bool e) => e)) { + if (classDefinition.fields.isNotEmpty) { + if (classDefinition.fields.any((NamedType e) => !e.type.isNullable)) { indent.writeln( '$_docCommentPrefix `init` unavailable to enforce nonnull fields, see the `make` class method.', ); diff --git a/packages/pigeon/pigeons/core_tests.dart b/packages/pigeon/pigeons/core_tests.dart index e93cecf067c2..aaddd1d8158c 100644 --- a/packages/pigeon/pigeons/core_tests.dart +++ b/packages/pigeon/pigeons/core_tests.dart @@ -265,6 +265,7 @@ class AllClassesWrapper { this.classMap, this.nullableClassList, this.nullableClassMap, + this.anEmptyClass, ); AllNullableTypes allNullableTypes; AllNullableTypesWithoutRecursion? allNullableTypesWithoutRecursion; @@ -273,6 +274,7 @@ class AllClassesWrapper { List? nullableClassList; Map classMap; Map? nullableClassMap; + AnEmptyClass? anEmptyClass; } /// The core interface that each host language plugin must implement in @@ -1465,3 +1467,5 @@ class TestMessage { // ignore: always_specify_types, strict_raw_type List? testList; } + +class AnEmptyClass {} diff --git a/packages/pigeon/pigeons/event_channel_tests.dart b/packages/pigeon/pigeons/event_channel_tests.dart index ef9e904882e3..9bc9dfd5fd06 100644 --- a/packages/pigeon/pigeons/event_channel_tests.dart +++ b/packages/pigeon/pigeons/event_channel_tests.dart @@ -129,6 +129,8 @@ class ClassEvent extends PlatformEvent { final EventAllNullableTypes value; } +class EmptyEvent extends PlatformEvent {} + @EventChannelApi() abstract class EventChannelMethods { int streamInts(); diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java index da1de3d6a4da..a81e318fce0f 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) @@ -3005,6 +3006,16 @@ public void setNullableClassMap( this.nullableClassMap = setterArg; } + private @Nullable AnEmptyClass anEmptyClass; + + public @Nullable AnEmptyClass getAnEmptyClass() { + return anEmptyClass; + } + + public void setAnEmptyClass(@Nullable AnEmptyClass setterArg) { + this.anEmptyClass = setterArg; + } + /** Constructor is non-public to enforce null safety; use Builder. */ AllClassesWrapper() {} @@ -3024,7 +3035,8 @@ && pigeonDeepEquals(allTypes, that.allTypes) && pigeonDeepEquals(classList, that.classList) && pigeonDeepEquals(nullableClassList, that.nullableClassList) && pigeonDeepEquals(classMap, that.classMap) - && pigeonDeepEquals(nullableClassMap, that.nullableClassMap); + && pigeonDeepEquals(nullableClassMap, that.nullableClassMap) + && pigeonDeepEquals(anEmptyClass, that.anEmptyClass); } @Override @@ -3038,7 +3050,8 @@ public int hashCode() { classList, nullableClassList, classMap, - nullableClassMap + nullableClassMap, + anEmptyClass }; return pigeonDeepHashCode(fields); } @@ -3066,6 +3079,9 @@ public String toString() { + ", " + "nullableClassMap=" + nullableClassMap + + ", " + + "anEmptyClass=" + + anEmptyClass + "}"; } @@ -3130,6 +3146,14 @@ public static final class Builder { return this; } + private @Nullable AnEmptyClass anEmptyClass; + + @CanIgnoreReturnValue + public @NonNull Builder setAnEmptyClass(@Nullable AnEmptyClass setterArg) { + this.anEmptyClass = setterArg; + return this; + } + public @NonNull AllClassesWrapper build() { AllClassesWrapper pigeonReturn = new AllClassesWrapper(); pigeonReturn.setAllNullableTypes(allNullableTypes); @@ -3139,13 +3163,14 @@ public static final class Builder { pigeonReturn.setNullableClassList(nullableClassList); pigeonReturn.setClassMap(classMap); pigeonReturn.setNullableClassMap(nullableClassMap); + pigeonReturn.setAnEmptyClass(anEmptyClass); return pigeonReturn; } } @NonNull ArrayList toList() { - ArrayList toListResult = new ArrayList<>(7); + ArrayList toListResult = new ArrayList<>(8); toListResult.add(allNullableTypes); toListResult.add(allNullableTypesWithoutRecursion); toListResult.add(allTypes); @@ -3153,6 +3178,7 @@ ArrayList toList() { toListResult.add(nullableClassList); toListResult.add(classMap); toListResult.add(nullableClassMap); + toListResult.add(anEmptyClass); return toListResult; } @@ -3174,6 +3200,8 @@ ArrayList toList() { Object nullableClassMap = pigeonVar_list.get(6); pigeonResult.setNullableClassMap( (Map) nullableClassMap); + Object anEmptyClass = pigeonVar_list.get(7); + pigeonResult.setAnEmptyClass((AnEmptyClass) anEmptyClass); return pigeonResult; } } @@ -3249,6 +3277,50 @@ ArrayList toList() { } } + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class AnEmptyClass { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AnEmptyClass that = (AnEmptyClass) o; + return true; + } + + @Override + public int hashCode() { + return Objects.hash(getClass()); + } + + @Override + public String toString() { + return "AnEmptyClass{}"; + } + + public static final class Builder { + + public @NonNull AnEmptyClass build() { + AnEmptyClass pigeonReturn = new AnEmptyClass(); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(0); + return toListResult; + } + + static @NonNull AnEmptyClass fromList(@NonNull ArrayList pigeonVar_list) { + AnEmptyClass pigeonResult = new AnEmptyClass(); + return pigeonResult; + } + } + private static class PigeonCodec extends StandardMessageCodec { public static final PigeonCodec INSTANCE = new PigeonCodec(); @@ -3279,6 +3351,8 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { return AllClassesWrapper.fromList((ArrayList) readValue(buffer)); case (byte) 136: return TestMessage.fromList((ArrayList) readValue(buffer)); + case (byte) 137: + return AnEmptyClass.fromList((ArrayList) readValue(buffer)); default: return super.readValueOfType(type, buffer); } @@ -3310,6 +3384,9 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { } else if (value instanceof TestMessage) { stream.write(136); writeValue(stream, ((TestMessage) value).toList()); + } else if (value instanceof AnEmptyClass) { + stream.write(137); + writeValue(stream, ((AnEmptyClass) value).toList()); } else { super.writeValue(stream, value); } diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/CoreTests.gen.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/CoreTests.gen.m index 9692e443f74f..cb67048eda0c 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/CoreTests.gen.m +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/CoreTests.gen.m @@ -183,6 +183,12 @@ + (nullable FLTTestMessage *)nullableFromList:(NSArray *)list; - (NSArray *)toList; @end +@interface FLTAnEmptyClass () ++ (FLTAnEmptyClass *)fromList:(NSArray *)list; ++ (nullable FLTAnEmptyClass *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + @implementation FLTUnusedClass + (instancetype)makeWithAField:(nullable id)aField { FLTUnusedClass *pigeonResult = [[FLTUnusedClass alloc] init]; @@ -908,7 +914,8 @@ @implementation FLTAllClassesWrapper classMap:(NSDictionary *)classMap nullableClassMap: (nullable NSDictionary *) - nullableClassMap { + nullableClassMap + anEmptyClass:(nullable FLTAnEmptyClass *)anEmptyClass { FLTAllClassesWrapper *pigeonResult = [[FLTAllClassesWrapper alloc] init]; pigeonResult.allNullableTypes = allNullableTypes; pigeonResult.allNullableTypesWithoutRecursion = allNullableTypesWithoutRecursion; @@ -917,6 +924,7 @@ @implementation FLTAllClassesWrapper pigeonResult.nullableClassList = nullableClassList; pigeonResult.classMap = classMap; pigeonResult.nullableClassMap = nullableClassMap; + pigeonResult.anEmptyClass = anEmptyClass; return pigeonResult; } + (FLTAllClassesWrapper *)fromList:(NSArray *)list { @@ -928,6 +936,7 @@ + (FLTAllClassesWrapper *)fromList:(NSArray *)list { pigeonResult.nullableClassList = GetNullableObjectAtIndex(list, 4); pigeonResult.classMap = GetNullableObjectAtIndex(list, 5); pigeonResult.nullableClassMap = GetNullableObjectAtIndex(list, 6); + pigeonResult.anEmptyClass = GetNullableObjectAtIndex(list, 7); return pigeonResult; } + (nullable FLTAllClassesWrapper *)nullableFromList:(NSArray *)list { @@ -942,6 +951,7 @@ + (nullable FLTAllClassesWrapper *)nullableFromList:(NSArray *)list { self.nullableClassList ?: [NSNull null], self.classMap ?: [NSNull null], self.nullableClassMap ?: [NSNull null], + self.anEmptyClass ?: [NSNull null], ]; } - (BOOL)isEqual:(id)object { @@ -959,7 +969,8 @@ - (BOOL)isEqual:(id)object { FLTPigeonDeepEquals(self.classList, other.classList) && FLTPigeonDeepEquals(self.nullableClassList, other.nullableClassList) && FLTPigeonDeepEquals(self.classMap, other.classMap) && - FLTPigeonDeepEquals(self.nullableClassMap, other.nullableClassMap); + FLTPigeonDeepEquals(self.nullableClassMap, other.nullableClassMap) && + FLTPigeonDeepEquals(self.anEmptyClass, other.anEmptyClass); } - (NSUInteger)hash { @@ -971,16 +982,18 @@ - (NSUInteger)hash { result = result * 31 + FLTPigeonDeepHash(self.nullableClassList); result = result * 31 + FLTPigeonDeepHash(self.classMap); result = result * 31 + FLTPigeonDeepHash(self.nullableClassMap); + result = result * 31 + FLTPigeonDeepHash(self.anEmptyClass); return result; } - (NSString *)description { return - [NSString stringWithFormat:@"FLTAllClassesWrapper(allNullableTypes: %@, " - @"allNullableTypesWithoutRecursion: %@, allTypes: %@, classList: " - @"%@, nullableClassList: %@, classMap: %@, nullableClassMap: %@)", - self.allNullableTypes, self.allNullableTypesWithoutRecursion, - self.allTypes, self.classList, self.nullableClassList, - self.classMap, self.nullableClassMap]; + [NSString stringWithFormat: + @"FLTAllClassesWrapper(allNullableTypes: %@, allNullableTypesWithoutRecursion: " + @"%@, allTypes: %@, classList: %@, nullableClassList: %@, classMap: %@, " + @"nullableClassMap: %@, anEmptyClass: %@)", + self.allNullableTypes, self.allNullableTypesWithoutRecursion, self.allTypes, + self.classList, self.nullableClassList, self.classMap, self.nullableClassMap, + self.anEmptyClass]; } @end @@ -1024,6 +1037,37 @@ - (NSString *)description { } @end +@implementation FLTAnEmptyClass ++ (FLTAnEmptyClass *)fromList:(NSArray *)list { + FLTAnEmptyClass *pigeonResult = [[FLTAnEmptyClass alloc] init]; + return pigeonResult; +} ++ (nullable FLTAnEmptyClass *)nullableFromList:(NSArray *)list { + return (list) ? [FLTAnEmptyClass fromList:list] : nil; +} +- (NSArray *)toList { + return @[]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + FLTAnEmptyClass *other = (FLTAnEmptyClass *)object; + return YES; +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + return result; +} +- (NSString *)description { + return [NSString stringWithFormat:@"FLTAnEmptyClass()"]; +} +@end + @interface FLTCoreTestsPigeonCodecReader : FlutterStandardReader @end @implementation FLTCoreTestsPigeonCodecReader @@ -1052,6 +1096,8 @@ - (nullable id)readValueOfType:(UInt8)type { return [FLTAllClassesWrapper fromList:[self readValue]]; case 136: return [FLTTestMessage fromList:[self readValue]]; + case 137: + return [FLTAnEmptyClass fromList:[self readValue]]; default: return [super readValueOfType:type]; } @@ -1088,6 +1134,9 @@ - (void)writeValue:(id)value { } else if ([value isKindOfClass:[FLTTestMessage class]]) { [self writeByte:136]; [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FLTAnEmptyClass class]]) { + [self writeByte:137]; + [self writeValue:[value toList]]; } else { [super writeValue:value]; } diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/include/alternate_language_test_plugin/CoreTests.gen.h b/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/include/alternate_language_test_plugin/CoreTests.gen.h index 03be8ebb358d..0e08dd8d3e1d 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/include/alternate_language_test_plugin/CoreTests.gen.h +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/darwin/alternate_language_test_plugin/Sources/alternate_language_test_plugin/include/alternate_language_test_plugin/CoreTests.gen.h @@ -44,6 +44,7 @@ typedef NS_ENUM(NSUInteger, FLTAnotherEnum) { @class FLTAllNullableTypesWithoutRecursion; @class FLTAllClassesWrapper; @class FLTTestMessage; +@class FLTAnEmptyClass; @interface FLTUnusedClass : NSObject + (instancetype)makeWithAField:(nullable id)aField; @@ -263,7 +264,8 @@ typedef NS_ENUM(NSUInteger, FLTAnotherEnum) { classMap:(NSDictionary *)classMap nullableClassMap: (nullable NSDictionary *) - nullableClassMap; + nullableClassMap + anEmptyClass:(nullable FLTAnEmptyClass *)anEmptyClass; @property(nonatomic, strong) FLTAllNullableTypes *allNullableTypes; @property(nonatomic, strong, nullable) FLTAllNullableTypesWithoutRecursion *allNullableTypesWithoutRecursion; @@ -274,6 +276,7 @@ typedef NS_ENUM(NSUInteger, FLTAnotherEnum) { @property(nonatomic, copy) NSDictionary *classMap; @property(nonatomic, copy, nullable) NSDictionary *nullableClassMap; +@property(nonatomic, strong, nullable) FLTAnEmptyClass *anEmptyClass; @end /// A data class containing a List, used in unit tests. @@ -282,6 +285,9 @@ typedef NS_ENUM(NSUInteger, FLTAnotherEnum) { @property(nonatomic, copy, nullable) NSArray *testList; @end +@interface FLTAnEmptyClass : NSObject +@end + /// The codec used by all APIs. NSObject *FLTGetCoreTestsCodec(void); diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart index 6928aae9e54e..5c24c9716589 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart @@ -2768,6 +2768,9 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { expect(event.value.aNullableInt, 0); expect(count, 6); count++; + case EmptyEvent(): + expect(count, 7); + count++; completer.complete(); } }); diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart index c1164b5c7892..359afa07ebab 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart @@ -814,6 +814,7 @@ class AllClassesWrapper { this.nullableClassList, required this.classMap, this.nullableClassMap, + this.anEmptyClass, }); AllNullableTypes allNullableTypes; @@ -830,6 +831,8 @@ class AllClassesWrapper { Map? nullableClassMap; + AnEmptyClass? anEmptyClass; + List _toList() { return [ allNullableTypes, @@ -839,6 +842,7 @@ class AllClassesWrapper { nullableClassList, classMap, nullableClassMap, + anEmptyClass, ]; } @@ -857,6 +861,7 @@ class AllClassesWrapper { classMap: (result[5]! as Map).cast(), nullableClassMap: (result[6] as Map?) ?.cast(), + anEmptyClass: result[7] as AnEmptyClass?, ); } @@ -875,7 +880,8 @@ class AllClassesWrapper { _deepEquals(classList, other.classList) && _deepEquals(nullableClassList, other.nullableClassList) && _deepEquals(classMap, other.classMap) && - _deepEquals(nullableClassMap, other.nullableClassMap); + _deepEquals(nullableClassMap, other.nullableClassMap) && + _deepEquals(anEmptyClass, other.anEmptyClass); } @override @@ -884,7 +890,7 @@ class AllClassesWrapper { @override String toString() { - return 'AllClassesWrapper(allNullableTypes: $allNullableTypes, allNullableTypesWithoutRecursion: $allNullableTypesWithoutRecursion, allTypes: $allTypes, classList: $classList, nullableClassList: $nullableClassList, classMap: $classMap, nullableClassMap: $nullableClassMap)'; + return 'AllClassesWrapper(allNullableTypes: $allNullableTypes, allNullableTypesWithoutRecursion: $allNullableTypesWithoutRecursion, allTypes: $allTypes, classList: $classList, nullableClassList: $nullableClassList, classMap: $classMap, nullableClassMap: $nullableClassMap, anEmptyClass: $anEmptyClass)'; } } @@ -929,6 +935,40 @@ class TestMessage { } } +class AnEmptyClass { + AnEmptyClass(); + List _toList() { + return []; + } + + Object encode() { + return _toList(); + } + + static AnEmptyClass decode(Object result) { + result as List; + return AnEmptyClass(); + } + + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + bool operator ==(Object other) { + if (other is! AnEmptyClass || other.runtimeType != runtimeType) { + return false; + } + return true; + } + + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + int get hashCode => _deepHash([runtimeType, ..._toList()]); + + @override + String toString() { + return 'AnEmptyClass()'; + } +} + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -960,6 +1000,9 @@ class _PigeonCodec extends StandardMessageCodec { } else if (value is TestMessage) { buffer.putUint8(136); writeValue(buffer, value.encode()); + } else if (value is AnEmptyClass) { + buffer.putUint8(137); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -986,6 +1029,8 @@ class _PigeonCodec extends StandardMessageCodec { return AllClassesWrapper.decode(readValue(buffer)!); case 136: return TestMessage.decode(readValue(buffer)!); + case 137: + return AnEmptyClass.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); } diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/event_channel_tests.gen.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/event_channel_tests.gen.dart index 960283770445..a5b0d8e71f2c 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/event_channel_tests.gen.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/event_channel_tests.gen.dart @@ -588,6 +588,40 @@ class ClassEvent extends PlatformEvent { } } +class EmptyEvent extends PlatformEvent { + EmptyEvent(); + List _toList() { + return []; + } + + Object encode() { + return _toList(); + } + + static EmptyEvent decode(Object result) { + result as List; + return EmptyEvent(); + } + + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + bool operator ==(Object other) { + if (other is! EmptyEvent || other.runtimeType != runtimeType) { + return false; + } + return true; + } + + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + int get hashCode => _deepHash([runtimeType, ..._toList()]); + + @override + String toString() { + return 'EmptyEvent()'; + } +} + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -625,6 +659,9 @@ class _PigeonCodec extends StandardMessageCodec { } else if (value is ClassEvent) { buffer.putUint8(138); writeValue(buffer, value.encode()); + } else if (value is EmptyEvent) { + buffer.putUint8(139); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -655,6 +692,8 @@ class _PigeonCodec extends StandardMessageCodec { return EnumEvent.decode(readValue(buffer)!); case 138: return ClassEvent.decode(readValue(buffer)!); + case 139: + return EmptyEvent.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); } diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/test/data_class_methods_test.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/test/data_class_methods_test.dart index 33407ef7fc89..1327fbc2b333 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/test/data_class_methods_test.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/test/data_class_methods_test.dart @@ -199,5 +199,13 @@ void main() { 'AllTypes(aBool: true, anInt: 42, anInt64: 3000000000, aDouble: 3.14159, aByteArray: [1, 2, 3], a4ByteArray: [4, 5, 6], a8ByteArray: [7, 8, 9], aFloatArray: [2.71828, 3.14159], anEnum: AnEnum.fortyTwo, anotherEnum: AnotherEnum.justInCase, aString: Hello host!, anObject: 1, list: [Thing 1, 2, true, 3.14, null], stringList: [Thing 1, 2, true, 3.14], intList: [1, 2, 3, 4], doubleList: [1.0, 2.99999, 3.0, 3.14], boolList: [true, false, true, false], enumList: [AnEnum.one, AnEnum.two, AnEnum.three, AnEnum.fortyTwo, AnEnum.fourHundredTwentyTwo], objectList: [Thing 1, 2, true, 3.14], listList: [[Thing 1, 2, true, 3.14], [Thing 1, 2, true, 3.14], [1, 2, 3, 4], [1.0, 2.99999, 3.0, 3.14], [true, false, true, false], [AnEnum.one, AnEnum.two, AnEnum.three, AnEnum.fortyTwo, AnEnum.fourHundredTwentyTwo]], mapList: [{a: 1, b: 2.0, c: three, d: false}, {a: 1, b: 2.0, c: three, d: false}, {0.0: 0.0, 1.1: 2.0, 3.0: 0.3, -0.4: -0.2}, {0: 0, 1: 1, 2: 3, 4: -1}, {0: true, 1: false, 2: true}, {AnEnum.one: AnEnum.one, AnEnum.two: AnEnum.two, AnEnum.three: AnEnum.three, AnEnum.fortyTwo: AnEnum.fortyTwo}], map: {a: 1, b: 2.0, c: three, d: false}, stringMap: {a: 1, b: 2.0, c: three, d: false}, intMap: {0: 0, 1: 1, 2: 3, 4: -1}, enumMap: {AnEnum.one: AnEnum.one, AnEnum.two: AnEnum.two, AnEnum.three: AnEnum.three, AnEnum.fortyTwo: AnEnum.fortyTwo}, objectMap: {a: 1, b: 2.0, c: three, d: false}, listMap: {0: [Thing 1, 2, true, 3.14], 1: [Thing 1, 2, true, 3.14], 2: [1.0, 2.99999, 3.0, 3.14], 4: [1, 2, 3, 4], 5: [true, false, true, false], 6: [AnEnum.one, AnEnum.two, AnEnum.three, AnEnum.fortyTwo, AnEnum.fourHundredTwentyTwo]}, mapMap: {0: {a: 1, b: 2.0, c: three, d: false}, 1: {a: 1, b: 2.0, c: three, d: false}, 2: {0.0: 0.0, 1.1: 2.0, 3.0: 0.3, -0.4: -0.2}, 4: {0: 0, 1: 1, 2: 3, 4: -1}, 5: {0: true, 1: false, 2: true}, 6: {AnEnum.one: AnEnum.one, AnEnum.two: AnEnum.two, AnEnum.three: AnEnum.three, AnEnum.fortyTwo: AnEnum.fortyTwo}})', ); }); + + test('AnEmptyClass basic methods', () { + final a = AnEmptyClass(); + final b = AnEmptyClass(); + expect(a, b); + expect(a.hashCode, b.hashCode); + expect(a.toString(), 'AnEmptyClass()'); + }); }); } diff --git a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt index a22c40a3c5f3..879abc78aa60 100644 --- a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt +++ b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt @@ -910,7 +910,8 @@ data class AllClassesWrapper( val classList: List, val nullableClassList: List? = null, val classMap: Map, - val nullableClassMap: Map? = null + val nullableClassMap: Map? = null, + val anEmptyClass: AnEmptyClass? = null ) { companion object { fun fromList(pigeonVar_list: List): AllClassesWrapper { @@ -921,6 +922,7 @@ data class AllClassesWrapper( val nullableClassList = pigeonVar_list[4] as List? val classMap = pigeonVar_list[5] as Map val nullableClassMap = pigeonVar_list[6] as Map? + val anEmptyClass = pigeonVar_list[7] as AnEmptyClass? return AllClassesWrapper( allNullableTypes, allNullableTypesWithoutRecursion, @@ -928,7 +930,8 @@ data class AllClassesWrapper( classList, nullableClassList, classMap, - nullableClassMap) + nullableClassMap, + anEmptyClass) } } @@ -941,6 +944,7 @@ data class AllClassesWrapper( nullableClassList, classMap, nullableClassMap, + anEmptyClass, ) } @@ -959,7 +963,8 @@ data class AllClassesWrapper( CoreTestsPigeonUtils.deepEquals(this.classList, other.classList) && CoreTestsPigeonUtils.deepEquals(this.nullableClassList, other.nullableClassList) && CoreTestsPigeonUtils.deepEquals(this.classMap, other.classMap) && - CoreTestsPigeonUtils.deepEquals(this.nullableClassMap, other.nullableClassMap) + CoreTestsPigeonUtils.deepEquals(this.nullableClassMap, other.nullableClassMap) && + CoreTestsPigeonUtils.deepEquals(this.anEmptyClass, other.anEmptyClass) } override fun hashCode(): Int { @@ -971,11 +976,12 @@ data class AllClassesWrapper( result = 31 * result + CoreTestsPigeonUtils.deepHash(this.nullableClassList) result = 31 * result + CoreTestsPigeonUtils.deepHash(this.classMap) result = 31 * result + CoreTestsPigeonUtils.deepHash(this.nullableClassMap) + result = 31 * result + CoreTestsPigeonUtils.deepHash(this.anEmptyClass) return result } override fun toString(): String { - return "AllClassesWrapper(allNullableTypes=$allNullableTypes, allNullableTypesWithoutRecursion=$allNullableTypesWithoutRecursion, allTypes=$allTypes, classList=$classList, nullableClassList=$nullableClassList, classMap=$classMap, nullableClassMap=$nullableClassMap)" + return "AllClassesWrapper(allNullableTypes=$allNullableTypes, allNullableTypesWithoutRecursion=$allNullableTypesWithoutRecursion, allTypes=$allTypes, classList=$classList, nullableClassList=$nullableClassList, classMap=$classMap, nullableClassMap=$nullableClassMap, anEmptyClass=$anEmptyClass)" } } @@ -1020,6 +1026,39 @@ data class TestMessage(val testList: List? = null) { } } +/** Generated class from Pigeon that represents data sent in messages. */ +class AnEmptyClass { + companion object { + fun fromList(pigeonVar_list: List): AnEmptyClass { + return AnEmptyClass() + } + } + + fun toList(): List { + return listOf() + } + + override fun equals(other: Any?): Boolean { + if (other == null || other.javaClass != javaClass) { + return false + } + if (this === other) { + return true + } + val other = other as AnEmptyClass + return true + } + + override fun hashCode(): Int { + var result = javaClass.hashCode() + return result + } + + override fun toString(): String { + return "AnEmptyClass()" + } +} + private open class CoreTestsPigeonCodec : StandardMessageCodec() { override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { return when (type) { @@ -1049,6 +1088,9 @@ private open class CoreTestsPigeonCodec : StandardMessageCodec() { 136.toByte() -> { return (readValue(buffer) as? List)?.let { TestMessage.fromList(it) } } + 137.toByte() -> { + return (readValue(buffer) as? List)?.let { AnEmptyClass.fromList(it) } + } else -> super.readValueOfType(type, buffer) } } @@ -1087,6 +1129,10 @@ private open class CoreTestsPigeonCodec : StandardMessageCodec() { stream.write(136) writeValue(stream, value.toList()) } + is AnEmptyClass -> { + stream.write(137) + writeValue(stream, value.toList()) + } else -> super.writeValue(stream, value) } } diff --git a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/EventChannelTests.gen.kt b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/EventChannelTests.gen.kt index a9f3d6575308..9db46911992b 100644 --- a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/EventChannelTests.gen.kt +++ b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/EventChannelTests.gen.kt @@ -692,6 +692,39 @@ data class ClassEvent(val value: EventAllNullableTypes) : PlatformEvent() { } } +/** Generated class from Pigeon that represents data sent in messages. */ +class EmptyEvent : PlatformEvent() { + companion object { + fun fromList(pigeonVar_list: List): EmptyEvent { + return EmptyEvent() + } + } + + fun toList(): List { + return listOf() + } + + override fun equals(other: Any?): Boolean { + if (other == null || other.javaClass != javaClass) { + return false + } + if (this === other) { + return true + } + val other = other as EmptyEvent + return true + } + + override fun hashCode(): Int { + var result = javaClass.hashCode() + return result + } + + override fun toString(): String { + return "EmptyEvent()" + } +} + private open class EventChannelTestsPigeonCodec : StandardMessageCodec() { override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { return when (type) { @@ -725,6 +758,9 @@ private open class EventChannelTestsPigeonCodec : StandardMessageCodec() { 138.toByte() -> { return (readValue(buffer) as? List)?.let { ClassEvent.fromList(it) } } + 139.toByte() -> { + return (readValue(buffer) as? List)?.let { EmptyEvent.fromList(it) } + } else -> super.readValueOfType(type, buffer) } } @@ -771,6 +807,10 @@ private open class EventChannelTestsPigeonCodec : StandardMessageCodec() { stream.write(138) writeValue(stream, value.toList()) } + is EmptyEvent -> { + stream.write(139) + writeValue(stream, value.toList()) + } else -> super.writeValue(stream, value) } } diff --git a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt index dd42cb4ddb90..8373ef71335b 100644 --- a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt +++ b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt @@ -948,7 +948,8 @@ object SendClass : StreamEventsStreamHandler() { DoubleEvent(3.14), ObjectsEvent(true), EnumEvent(EventEnum.FORTY_TWO), - ClassEvent(EventAllNullableTypes(aNullableInt = 0))) + ClassEvent(EventAllNullableTypes(aNullableInt = 0)), + EmptyEvent()) override fun onListen(p0: Any?, sink: PigeonEventSink) { var count: Int = 0 diff --git a/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/CoreTests.gen.swift index 3269407620db..0839e838ed74 100644 --- a/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/CoreTests.gen.swift +++ b/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/CoreTests.gen.swift @@ -941,6 +941,7 @@ struct AllClassesWrapper: Hashable, CustomStringConvertible { var nullableClassList: [AllNullableTypesWithoutRecursion?]? = nil var classMap: [Int64?: AllTypes?] var nullableClassMap: [Int64?: AllNullableTypesWithoutRecursion?]? = nil + var anEmptyClass: AnEmptyClass? = nil // swift-format-ignore: AlwaysUseLowerCamelCase static func fromList(_ pigeonVar_list: [Any?]) -> AllClassesWrapper? { @@ -953,6 +954,7 @@ struct AllClassesWrapper: Hashable, CustomStringConvertible { let classMap = pigeonVar_list[5] as! [Int64?: AllTypes?] let nullableClassMap: [Int64?: AllNullableTypesWithoutRecursion?]? = nilOrValue( pigeonVar_list[6]) + let anEmptyClass: AnEmptyClass? = nilOrValue(pigeonVar_list[7]) return AllClassesWrapper( allNullableTypes: allNullableTypes, @@ -961,7 +963,8 @@ struct AllClassesWrapper: Hashable, CustomStringConvertible { classList: classList, nullableClassList: nullableClassList, classMap: classMap, - nullableClassMap: nullableClassMap + nullableClassMap: nullableClassMap, + anEmptyClass: anEmptyClass ) } func toList() -> [Any?] { @@ -973,6 +976,7 @@ struct AllClassesWrapper: Hashable, CustomStringConvertible { nullableClassList, classMap, nullableClassMap, + anEmptyClass, ] } static func == (lhs: AllClassesWrapper, rhs: AllClassesWrapper) -> Bool { @@ -987,6 +991,7 @@ struct AllClassesWrapper: Hashable, CustomStringConvertible { && CoreTestsPigeonInternal.deepEquals(lhs.nullableClassList, rhs.nullableClassList) && CoreTestsPigeonInternal.deepEquals(lhs.classMap, rhs.classMap) && CoreTestsPigeonInternal.deepEquals(lhs.nullableClassMap, rhs.nullableClassMap) + && CoreTestsPigeonInternal.deepEquals(lhs.anEmptyClass, rhs.anEmptyClass) } func hash(into hasher: inout Hasher) { @@ -998,11 +1003,12 @@ struct AllClassesWrapper: Hashable, CustomStringConvertible { CoreTestsPigeonInternal.deepHash(value: nullableClassList, hasher: &hasher) CoreTestsPigeonInternal.deepHash(value: classMap, hasher: &hasher) CoreTestsPigeonInternal.deepHash(value: nullableClassMap, hasher: &hasher) + CoreTestsPigeonInternal.deepHash(value: anEmptyClass, hasher: &hasher) } public var description: String { return - "AllClassesWrapper(allNullableTypes: \(String(describing: allNullableTypes)), allNullableTypesWithoutRecursion: \(String(describing: allNullableTypesWithoutRecursion)), allTypes: \(String(describing: allTypes)), classList: \(String(describing: classList)), nullableClassList: \(String(describing: nullableClassList)), classMap: \(String(describing: classMap)), nullableClassMap: \(String(describing: nullableClassMap)))" + "AllClassesWrapper(allNullableTypes: \(String(describing: allNullableTypes)), allNullableTypesWithoutRecursion: \(String(describing: allNullableTypesWithoutRecursion)), allTypes: \(String(describing: allTypes)), classList: \(String(describing: classList)), nullableClassList: \(String(describing: nullableClassList)), classMap: \(String(describing: classMap)), nullableClassMap: \(String(describing: nullableClassMap)), anEmptyClass: \(String(describing: anEmptyClass)))" } } @@ -1042,6 +1048,33 @@ struct TestMessage: Hashable, CustomStringConvertible { } } +/// Generated class from Pigeon that represents data sent in messages. +struct AnEmptyClass: Hashable, CustomStringConvertible { + + // swift-format-ignore: AlwaysUseLowerCamelCase + static func fromList(_ pigeonVar_list: [Any?]) -> AnEmptyClass? { + + return AnEmptyClass() + } + func toList() -> [Any?] { + return [] + } + static func == (lhs: AnEmptyClass, rhs: AnEmptyClass) -> Bool { + if Swift.type(of: lhs) != Swift.type(of: rhs) { + return false + } + return true + } + + func hash(into hasher: inout Hasher) { + hasher.combine("AnEmptyClass") + } + + public var description: String { + return "AnEmptyClass()" + } +} + private class CoreTestsPigeonCodecReader: FlutterStandardReader { override func readValue(ofType type: UInt8) -> Any? { switch type { @@ -1069,6 +1102,8 @@ private class CoreTestsPigeonCodecReader: FlutterStandardReader { return AllClassesWrapper.fromList(self.readValue() as! [Any?]) case 136: return TestMessage.fromList(self.readValue() as! [Any?]) + case 137: + return AnEmptyClass.fromList(self.readValue() as! [Any?]) default: return super.readValue(ofType: type) } @@ -1101,6 +1136,9 @@ private class CoreTestsPigeonCodecWriter: FlutterStandardWriter { } else if let value = value as? TestMessage { super.writeByte(136) super.writeValue(value.toList()) + } else if let value = value as? AnEmptyClass { + super.writeByte(137) + super.writeValue(value.toList()) } else { super.writeValue(value) } diff --git a/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/EventChannelTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/EventChannelTests.gen.swift index f659243d499a..377ef2582333 100644 --- a/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/EventChannelTests.gen.swift +++ b/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/EventChannelTests.gen.swift @@ -706,6 +706,33 @@ struct ClassEvent: PlatformEvent { } } +/// Generated class from Pigeon that represents data sent in messages. +struct EmptyEvent: PlatformEvent { + + // swift-format-ignore: AlwaysUseLowerCamelCase + static func fromList(_ pigeonVar_list: [Any?]) -> EmptyEvent? { + + return EmptyEvent() + } + func toList() -> [Any?] { + return [] + } + static func == (lhs: EmptyEvent, rhs: EmptyEvent) -> Bool { + if Swift.type(of: lhs) != Swift.type(of: rhs) { + return false + } + return true + } + + func hash(into hasher: inout Hasher) { + hasher.combine("EmptyEvent") + } + + public var description: String { + return "EmptyEvent()" + } +} + private class EventChannelTestsPigeonCodecReader: FlutterStandardReader { override func readValue(ofType type: UInt8) -> Any? { switch type { @@ -737,6 +764,8 @@ private class EventChannelTestsPigeonCodecReader: FlutterStandardReader { return EnumEvent.fromList(self.readValue() as! [Any?]) case 138: return ClassEvent.fromList(self.readValue() as! [Any?]) + case 139: + return EmptyEvent.fromList(self.readValue() as! [Any?]) default: return super.readValue(ofType: type) } @@ -775,6 +804,9 @@ private class EventChannelTestsPigeonCodecWriter: FlutterStandardWriter { } else if let value = value as? ClassEvent { super.writeByte(138) super.writeValue(value.toList()) + } else if let value = value as? EmptyEvent { + super.writeByte(139) + super.writeValue(value.toList()) } else { super.writeValue(value) } diff --git a/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/TestPlugin.swift b/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/TestPlugin.swift index 95d63024e972..c74c5c2d224f 100644 --- a/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/TestPlugin.swift +++ b/packages/pigeon/platform_tests/test_plugin/darwin/test_plugin/Sources/test_plugin/TestPlugin.swift @@ -1313,6 +1313,7 @@ class SendEvents: StreamEventsStreamHandler { ObjectsEvent(value: true), EnumEvent(value: EventEnum.fortyTwo), ClassEvent(value: EventAllNullableTypes(aNullableInt: 0)), + EmptyEvent(), ] override func onListen(withArguments arguments: Any?, sink: PigeonEventSink) { diff --git a/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.cc b/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.cc index d099ee1b7fb6..fd1b348aad54 100644 --- a/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.cc +++ b/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.cc @@ -3933,6 +3933,7 @@ struct _CoreTestsPigeonTestAllClassesWrapper { FlValue* nullable_class_list; FlValue* class_map; FlValue* nullable_class_map; + CoreTestsPigeonTestAnEmptyClass* an_empty_class; }; G_DEFINE_TYPE(CoreTestsPigeonTestAllClassesWrapper, @@ -3949,6 +3950,7 @@ static void core_tests_pigeon_test_all_classes_wrapper_dispose( g_clear_pointer(&self->nullable_class_list, fl_value_unref); g_clear_pointer(&self->class_map, fl_value_unref); g_clear_pointer(&self->nullable_class_map, fl_value_unref); + g_clear_object(&self->an_empty_class); G_OBJECT_CLASS(core_tests_pigeon_test_all_classes_wrapper_parent_class) ->dispose(object); } @@ -3969,7 +3971,8 @@ core_tests_pigeon_test_all_classes_wrapper_new( all_nullable_types_without_recursion, CoreTestsPigeonTestAllTypes* all_types, FlValue* class_list, FlValue* nullable_class_list, FlValue* class_map, - FlValue* nullable_class_map) { + FlValue* nullable_class_map, + CoreTestsPigeonTestAnEmptyClass* an_empty_class) { CoreTestsPigeonTestAllClassesWrapper* self = CORE_TESTS_PIGEON_TEST_ALL_CLASSES_WRAPPER(g_object_new( core_tests_pigeon_test_all_classes_wrapper_get_type(), nullptr)); @@ -3999,6 +4002,12 @@ core_tests_pigeon_test_all_classes_wrapper_new( } else { self->nullable_class_map = nullptr; } + if (an_empty_class != nullptr) { + self->an_empty_class = + CORE_TESTS_PIGEON_TEST_AN_EMPTY_CLASS(g_object_ref(an_empty_class)); + } else { + self->an_empty_class = nullptr; + } return self; } @@ -4054,6 +4063,14 @@ FlValue* core_tests_pigeon_test_all_classes_wrapper_get_nullable_class_map( return self->nullable_class_map; } +CoreTestsPigeonTestAnEmptyClass* +core_tests_pigeon_test_all_classes_wrapper_get_an_empty_class( + CoreTestsPigeonTestAllClassesWrapper* self) { + g_return_val_if_fail(CORE_TESTS_PIGEON_TEST_IS_ALL_CLASSES_WRAPPER(self), + nullptr); + return self->an_empty_class; +} + static FlValue* core_tests_pigeon_test_all_classes_wrapper_to_list( CoreTestsPigeonTestAllClassesWrapper* self) { FlValue* values = fl_value_new_list(); @@ -4082,6 +4099,12 @@ static FlValue* core_tests_pigeon_test_all_classes_wrapper_to_list( fl_value_append_take(values, self->nullable_class_map != nullptr ? fl_value_ref(self->nullable_class_map) : fl_value_new_null()); + fl_value_append_take(values, + self->an_empty_class != nullptr + ? fl_value_new_custom_object( + core_tests_pigeon_test_an_empty_class_type_id, + G_OBJECT(self->an_empty_class)) + : fl_value_new_null()); return values; } @@ -4119,9 +4142,16 @@ core_tests_pigeon_test_all_classes_wrapper_new_from_list(FlValue* values) { if (fl_value_get_type(value6) != FL_VALUE_TYPE_NULL) { nullable_class_map = value6; } + FlValue* value7 = fl_value_get_list_value(values, 7); + CoreTestsPigeonTestAnEmptyClass* an_empty_class = nullptr; + if (fl_value_get_type(value7) != FL_VALUE_TYPE_NULL) { + an_empty_class = CORE_TESTS_PIGEON_TEST_AN_EMPTY_CLASS( + fl_value_get_custom_value_object(value7)); + } return core_tests_pigeon_test_all_classes_wrapper_new( all_nullable_types, all_nullable_types_without_recursion, all_types, - class_list, nullable_class_list, class_map, nullable_class_map); + class_list, nullable_class_list, class_map, nullable_class_map, + an_empty_class); } gboolean core_tests_pigeon_test_all_classes_wrapper_equals( @@ -4157,6 +4187,10 @@ gboolean core_tests_pigeon_test_all_classes_wrapper_equals( if (!flpigeon_deep_equals(a->nullable_class_map, b->nullable_class_map)) { return FALSE; } + if (!core_tests_pigeon_test_an_empty_class_equals(a->an_empty_class, + b->an_empty_class)) { + return FALSE; + } return TRUE; } @@ -4174,6 +4208,8 @@ guint core_tests_pigeon_test_all_classes_wrapper_hash( result = result * 31 + flpigeon_deep_hash(self->nullable_class_list); result = result * 31 + flpigeon_deep_hash(self->class_map); result = result * 31 + flpigeon_deep_hash(self->nullable_class_map); + result = result * 31 + + core_tests_pigeon_test_an_empty_class_hash(self->an_empty_class); return result; } @@ -4242,6 +4278,15 @@ gchar* core_tests_pigeon_test_all_classes_wrapper_to_string( } else { g_string_append(str, "null"); } + g_string_append(str, ", an_empty_class: "); + if (self->an_empty_class != nullptr) { + gchar* field_str = + core_tests_pigeon_test_an_empty_class_to_string(self->an_empty_class); + g_string_append(str, field_str); + g_free(field_str); + } else { + g_string_append(str, "null"); + } g_string_append(str, ")"); return g_string_free(str, FALSE); } @@ -4346,6 +4391,70 @@ gchar* core_tests_pigeon_test_test_message_to_string( return g_string_free(str, FALSE); } +struct _CoreTestsPigeonTestAnEmptyClass { + GObject parent_instance; +}; + +G_DEFINE_TYPE(CoreTestsPigeonTestAnEmptyClass, + core_tests_pigeon_test_an_empty_class, G_TYPE_OBJECT) + +static void core_tests_pigeon_test_an_empty_class_dispose(GObject* object) { + G_OBJECT_CLASS(core_tests_pigeon_test_an_empty_class_parent_class) + ->dispose(object); +} + +static void core_tests_pigeon_test_an_empty_class_init( + CoreTestsPigeonTestAnEmptyClass* self) {} + +static void core_tests_pigeon_test_an_empty_class_class_init( + CoreTestsPigeonTestAnEmptyClassClass* klass) { + G_OBJECT_CLASS(klass)->dispose = + core_tests_pigeon_test_an_empty_class_dispose; +} + +CoreTestsPigeonTestAnEmptyClass* core_tests_pigeon_test_an_empty_class_new() { + CoreTestsPigeonTestAnEmptyClass* self = CORE_TESTS_PIGEON_TEST_AN_EMPTY_CLASS( + g_object_new(core_tests_pigeon_test_an_empty_class_get_type(), nullptr)); + return self; +} + +static FlValue* core_tests_pigeon_test_an_empty_class_to_list( + CoreTestsPigeonTestAnEmptyClass* self) { + FlValue* values = fl_value_new_list(); + return values; +} + +static CoreTestsPigeonTestAnEmptyClass* +core_tests_pigeon_test_an_empty_class_new_from_list(FlValue* values) { + return core_tests_pigeon_test_an_empty_class_new(); +} + +gboolean core_tests_pigeon_test_an_empty_class_equals( + CoreTestsPigeonTestAnEmptyClass* a, CoreTestsPigeonTestAnEmptyClass* b) { + if (a == b) { + return TRUE; + } + if (a == nullptr || b == nullptr) { + return FALSE; + } + return TRUE; +} + +guint core_tests_pigeon_test_an_empty_class_hash( + CoreTestsPigeonTestAnEmptyClass* self) { + g_return_val_if_fail(CORE_TESTS_PIGEON_TEST_IS_AN_EMPTY_CLASS(self), 0); + guint result = 0; + return result; +} + +gchar* core_tests_pigeon_test_an_empty_class_to_string( + CoreTestsPigeonTestAnEmptyClass* self) { + g_return_val_if_fail(CORE_TESTS_PIGEON_TEST_IS_AN_EMPTY_CLASS(self), NULL); + GString* str = g_string_new("AnEmptyClass("); + g_string_append(str, ")"); + return g_string_free(str, FALSE); +} + struct _CoreTestsPigeonTestMessageCodec { FlStandardMessageCodec parent_instance; }; @@ -4363,6 +4472,7 @@ const int core_tests_pigeon_test_all_nullable_types_without_recursion_type_id = 134; const int core_tests_pigeon_test_all_classes_wrapper_type_id = 135; const int core_tests_pigeon_test_test_message_type_id = 136; +const int core_tests_pigeon_test_an_empty_class_type_id = 137; static gboolean core_tests_pigeon_test_message_codec_write_core_tests_pigeon_test_an_enum( @@ -4450,6 +4560,17 @@ core_tests_pigeon_test_message_codec_write_core_tests_pigeon_test_test_message( return fl_standard_message_codec_write_value(codec, buffer, values, error); } +static gboolean +core_tests_pigeon_test_message_codec_write_core_tests_pigeon_test_an_empty_class( + FlStandardMessageCodec* codec, GByteArray* buffer, + CoreTestsPigeonTestAnEmptyClass* value, GError** error) { + uint8_t type = core_tests_pigeon_test_an_empty_class_type_id; + g_byte_array_append(buffer, &type, sizeof(uint8_t)); + g_autoptr(FlValue) values = + core_tests_pigeon_test_an_empty_class_to_list(value); + return fl_standard_message_codec_write_value(codec, buffer, values, error); +} + static gboolean core_tests_pigeon_test_message_codec_write_value( FlStandardMessageCodec* codec, GByteArray* buffer, FlValue* value, GError** error) { @@ -4503,6 +4624,12 @@ static gboolean core_tests_pigeon_test_message_codec_write_value( CORE_TESTS_PIGEON_TEST_TEST_MESSAGE( fl_value_get_custom_value_object(value)), error); + case core_tests_pigeon_test_an_empty_class_type_id: + return core_tests_pigeon_test_message_codec_write_core_tests_pigeon_test_an_empty_class( + codec, buffer, + CORE_TESTS_PIGEON_TEST_AN_EMPTY_CLASS( + fl_value_get_custom_value_object(value)), + error); } } @@ -4665,6 +4792,28 @@ core_tests_pigeon_test_message_codec_read_core_tests_pigeon_test_test_message( G_OBJECT(value)); } +static FlValue* +core_tests_pigeon_test_message_codec_read_core_tests_pigeon_test_an_empty_class( + FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, + GError** error) { + g_autoptr(FlValue) values = + fl_standard_message_codec_read_value(codec, buffer, offset, error); + if (values == nullptr) { + return nullptr; + } + + g_autoptr(CoreTestsPigeonTestAnEmptyClass) value = + core_tests_pigeon_test_an_empty_class_new_from_list(values); + if (value == nullptr) { + g_set_error(error, FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, + "Invalid data received for MessageData"); + return nullptr; + } + + return fl_value_new_custom_object( + core_tests_pigeon_test_an_empty_class_type_id, G_OBJECT(value)); +} + static FlValue* core_tests_pigeon_test_message_codec_read_value_of_type( FlStandardMessageCodec* codec, GBytes* buffer, size_t* offset, int type, GError** error) { @@ -4693,6 +4842,9 @@ static FlValue* core_tests_pigeon_test_message_codec_read_value_of_type( case core_tests_pigeon_test_test_message_type_id: return core_tests_pigeon_test_message_codec_read_core_tests_pigeon_test_test_message( codec, buffer, offset, error); + case core_tests_pigeon_test_an_empty_class_type_id: + return core_tests_pigeon_test_message_codec_read_core_tests_pigeon_test_an_empty_class( + codec, buffer, offset, error); default: return FL_STANDARD_MESSAGE_CODEC_CLASS( core_tests_pigeon_test_message_codec_parent_class) diff --git a/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.h b/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.h index e5d97e289756..f81bb3bfdade 100644 --- a/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.h +++ b/packages/pigeon/platform_tests/test_plugin/linux/pigeon/core_tests.gen.h @@ -1444,6 +1444,7 @@ G_DECLARE_FINAL_TYPE(CoreTestsPigeonTestAllClassesWrapper, * nullable_class_list: field in this object. * class_map: field in this object. * nullable_class_map: field in this object. + * an_empty_class: field in this object. * * Creates a new #AllClassesWrapper object. * @@ -1456,7 +1457,8 @@ core_tests_pigeon_test_all_classes_wrapper_new( all_nullable_types_without_recursion, CoreTestsPigeonTestAllTypes* all_types, FlValue* class_list, FlValue* nullable_class_list, FlValue* class_map, - FlValue* nullable_class_map); + FlValue* nullable_class_map, + CoreTestsPigeonTestAnEmptyClass* an_empty_class); /** * core_tests_pigeon_test_all_classes_wrapper_get_all_nullable_types @@ -1538,6 +1540,18 @@ FlValue* core_tests_pigeon_test_all_classes_wrapper_get_class_map( FlValue* core_tests_pigeon_test_all_classes_wrapper_get_nullable_class_map( CoreTestsPigeonTestAllClassesWrapper* object); +/** + * core_tests_pigeon_test_all_classes_wrapper_get_an_empty_class + * @object: a #CoreTestsPigeonTestAllClassesWrapper. + * + * Gets the value of the anEmptyClass field of @object. + * + * Returns: the field value. + */ +CoreTestsPigeonTestAnEmptyClass* +core_tests_pigeon_test_all_classes_wrapper_get_an_empty_class( + CoreTestsPigeonTestAllClassesWrapper* object); + /** * core_tests_pigeon_test_all_classes_wrapper_equals: * @a: a #CoreTestsPigeonTestAllClassesWrapper. @@ -1640,6 +1654,58 @@ guint core_tests_pigeon_test_test_message_hash( gchar* core_tests_pigeon_test_test_message_to_string( CoreTestsPigeonTestTestMessage* object); +/** + * CoreTestsPigeonTestAnEmptyClass: + * + */ + +G_DECLARE_FINAL_TYPE(CoreTestsPigeonTestAnEmptyClass, + core_tests_pigeon_test_an_empty_class, + CORE_TESTS_PIGEON_TEST, AN_EMPTY_CLASS, GObject) + +/** + * core_tests_pigeon_test_an_empty_class_new: + * + * Creates a new #AnEmptyClass object. + * + * Returns: a new #CoreTestsPigeonTestAnEmptyClass + */ +CoreTestsPigeonTestAnEmptyClass* core_tests_pigeon_test_an_empty_class_new(); + +/** + * core_tests_pigeon_test_an_empty_class_equals: + * @a: a #CoreTestsPigeonTestAnEmptyClass. + * @b: another #CoreTestsPigeonTestAnEmptyClass. + * + * Checks if two #CoreTestsPigeonTestAnEmptyClass objects are equal. + * + * Returns: TRUE if @a and @b are equal. + */ +gboolean core_tests_pigeon_test_an_empty_class_equals( + CoreTestsPigeonTestAnEmptyClass* a, CoreTestsPigeonTestAnEmptyClass* b); + +/** + * core_tests_pigeon_test_an_empty_class_hash: + * @object: a #CoreTestsPigeonTestAnEmptyClass. + * + * Calculates a hash code for a #CoreTestsPigeonTestAnEmptyClass object. + * + * Returns: the hash code. + */ +guint core_tests_pigeon_test_an_empty_class_hash( + CoreTestsPigeonTestAnEmptyClass* object); + +/** + * core_tests_pigeon_test_an_empty_class_to_string: + * @object: a #CoreTestsPigeonTestAnEmptyClass. + * + * Returns a string representation of a #CoreTestsPigeonTestAnEmptyClass object. + * + * Returns: (transfer full): a new string, free with g_free(). + */ +gchar* core_tests_pigeon_test_an_empty_class_to_string( + CoreTestsPigeonTestAnEmptyClass* object); + G_DECLARE_FINAL_TYPE(CoreTestsPigeonTestMessageCodec, core_tests_pigeon_test_message_codec, CORE_TESTS_PIGEON_TEST, MESSAGE_CODEC, @@ -1661,6 +1727,7 @@ extern const int core_tests_pigeon_test_all_nullable_types_without_recursion_type_id; extern const int core_tests_pigeon_test_all_classes_wrapper_type_id; extern const int core_tests_pigeon_test_test_message_type_id; +extern const int core_tests_pigeon_test_an_empty_class_type_id; G_DECLARE_FINAL_TYPE(CoreTestsPigeonTestHostIntegrationCoreApi, core_tests_pigeon_test_host_integration_core_api, diff --git a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp index d78f843d1892..8487b539e29c 100644 --- a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp +++ b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp @@ -2890,7 +2890,8 @@ AllClassesWrapper::AllClassesWrapper(const AllNullableTypes& all_nullable_types, const EncodableList& class_list, const EncodableList* nullable_class_list, const EncodableMap& class_map, - const EncodableMap* nullable_class_map) + const EncodableMap* nullable_class_map, + const AnEmptyClass* an_empty_class) : all_nullable_types_( std::make_unique(all_nullable_types)), all_nullable_types_without_recursion_( @@ -2906,7 +2907,10 @@ AllClassesWrapper::AllClassesWrapper(const AllNullableTypes& all_nullable_types, class_map_(class_map), nullable_class_map_(nullable_class_map ? std::optional(*nullable_class_map) - : std::nullopt) {} + : std::nullopt), + an_empty_class_(an_empty_class + ? std::make_unique(*an_empty_class) + : nullptr) {} AllClassesWrapper::AllClassesWrapper(const AllClassesWrapper& other) : all_nullable_types_( @@ -2928,7 +2932,10 @@ AllClassesWrapper::AllClassesWrapper(const AllClassesWrapper& other) nullable_class_map_( other.nullable_class_map_ ? std::optional(*other.nullable_class_map_) - : std::nullopt) {} + : std::nullopt), + an_empty_class_(other.an_empty_class_ ? std::make_unique( + *other.an_empty_class_) + : nullptr) {} AllClassesWrapper& AllClassesWrapper::operator=( const AllClassesWrapper& other) { @@ -2945,6 +2952,9 @@ AllClassesWrapper& AllClassesWrapper::operator=( nullable_class_list_ = other.nullable_class_list_; class_map_ = other.class_map_; nullable_class_map_ = other.nullable_class_map_; + an_empty_class_ = other.an_empty_class_ + ? std::make_unique(*other.an_empty_class_) + : nullptr; return *this; } @@ -3029,9 +3039,22 @@ void AllClassesWrapper::set_nullable_class_map(const EncodableMap& value_arg) { nullable_class_map_ = value_arg; } +const AnEmptyClass* AllClassesWrapper::an_empty_class() const { + return an_empty_class_.get(); +} + +void AllClassesWrapper::set_an_empty_class(const AnEmptyClass* value_arg) { + an_empty_class_ = + value_arg ? std::make_unique(*value_arg) : nullptr; +} + +void AllClassesWrapper::set_an_empty_class(const AnEmptyClass& value_arg) { + an_empty_class_ = std::make_unique(value_arg); +} + EncodableList AllClassesWrapper::ToEncodableList() const { EncodableList list; - list.reserve(7); + list.reserve(8); list.push_back(CustomEncodableValue(*all_nullable_types_)); list.push_back( all_nullable_types_without_recursion_ @@ -3045,6 +3068,8 @@ EncodableList AllClassesWrapper::ToEncodableList() const { list.push_back(EncodableValue(class_map_)); list.push_back(nullable_class_map_ ? EncodableValue(*nullable_class_map_) : EncodableValue()); + list.push_back(an_empty_class_ ? CustomEncodableValue(*an_empty_class_) + : EncodableValue()); return list; } @@ -3076,6 +3101,11 @@ AllClassesWrapper AllClassesWrapper::FromEncodableList( decoded.set_nullable_class_map( std::get(encodable_nullable_class_map)); } + auto& encodable_an_empty_class = list[7]; + if (!encodable_an_empty_class.IsNull()) { + decoded.set_an_empty_class(std::any_cast( + std::get(encodable_an_empty_class))); + } return decoded; } @@ -3091,7 +3121,8 @@ bool AllClassesWrapper::operator==(const AllClassesWrapper& other) const { other.nullable_class_list_) && PigeonInternalDeepEquals(class_map_, other.class_map_) && PigeonInternalDeepEquals(nullable_class_map_, - other.nullable_class_map_); + other.nullable_class_map_) && + PigeonInternalDeepEquals(an_empty_class_, other.an_empty_class_); } bool AllClassesWrapper::operator!=(const AllClassesWrapper& other) const { @@ -3108,6 +3139,7 @@ size_t AllClassesWrapper::Hash() const { result = result * 31 + PigeonInternalDeepHash(nullable_class_list_); result = result * 31 + PigeonInternalDeepHash(class_map_); result = result * 31 + PigeonInternalDeepHash(nullable_class_map_); + result = result * 31 + PigeonInternalDeepHash(an_empty_class_); return result; } @@ -3143,6 +3175,12 @@ std::ostream& operator<<(std::ostream& os, const AllClassesWrapper& obj) { } else { os << "null"; } + os << ", an_empty_class: "; + if (obj.an_empty_class_) { + os << *obj.an_empty_class_; + } else { + os << "null"; + } os << ")"; return os; } @@ -3214,6 +3252,40 @@ std::ostream& operator<<(std::ostream& os, const TestMessage& obj) { size_t PigeonInternalDeepHash(const TestMessage& v) { return v.Hash(); } +// AnEmptyClass + +AnEmptyClass::AnEmptyClass() {} + +EncodableList AnEmptyClass::ToEncodableList() const { + EncodableList list; + list.reserve(0); + return list; +} + +AnEmptyClass AnEmptyClass::FromEncodableList(const EncodableList& list) { + AnEmptyClass decoded; + return decoded; +} + +bool AnEmptyClass::operator==(const AnEmptyClass& other) const { return true; } + +bool AnEmptyClass::operator!=(const AnEmptyClass& other) const { + return !(*this == other); +} + +size_t AnEmptyClass::Hash() const { + size_t result = 1; + return result; +} + +std::ostream& operator<<(std::ostream& os, const AnEmptyClass& obj) { + os << "AnEmptyClass("; + os << ")"; + return os; +} + +size_t PigeonInternalDeepHash(const AnEmptyClass& v) { return v.Hash(); } + PigeonInternalCodecSerializer::PigeonInternalCodecSerializer() {} EncodableValue PigeonInternalCodecSerializer::ReadValueOfType( @@ -3261,6 +3333,10 @@ EncodableValue PigeonInternalCodecSerializer::ReadValueOfType( return CustomEncodableValue(TestMessage::FromEncodableList( std::get(ReadValue(stream)))); } + case 137: { + return CustomEncodableValue(AnEmptyClass::FromEncodableList( + std::get(ReadValue(stream)))); + } default: return ::flutter::StandardCodecSerializer::ReadValueOfType(type, stream); } @@ -3330,6 +3406,14 @@ void PigeonInternalCodecSerializer::WriteValue( stream); return; } + if (custom_value->type() == typeid(AnEmptyClass)) { + stream->WriteByte(137); + WriteValue( + EncodableValue( + std::any_cast(*custom_value).ToEncodableList()), + stream); + return; + } } ::flutter::StandardCodecSerializer::WriteValue(value, stream); } diff --git a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h index 6778e1943213..f6b26267a79e 100644 --- a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h +++ b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h @@ -719,7 +719,8 @@ class AllClassesWrapper { const AllTypes* all_types, const ::flutter::EncodableList& class_list, const ::flutter::EncodableList* nullable_class_list, const ::flutter::EncodableMap& class_map, - const ::flutter::EncodableMap* nullable_class_map); + const ::flutter::EncodableMap* nullable_class_map, + const AnEmptyClass* an_empty_class); ~AllClassesWrapper() = default; AllClassesWrapper(const AllClassesWrapper& other); @@ -754,6 +755,10 @@ class AllClassesWrapper { void set_nullable_class_map(const ::flutter::EncodableMap* value_arg); void set_nullable_class_map(const ::flutter::EncodableMap& value_arg); + const AnEmptyClass* an_empty_class() const; + void set_an_empty_class(const AnEmptyClass* value_arg); + void set_an_empty_class(const AnEmptyClass& value_arg); + bool operator==(const AllClassesWrapper& other) const; bool operator!=(const AllClassesWrapper& other) const; /// Returns a hash code value for the object. This method is supported for the @@ -782,6 +787,7 @@ class AllClassesWrapper { std::optional<::flutter::EncodableList> nullable_class_list_; ::flutter::EncodableMap class_map_; std::optional<::flutter::EncodableMap> nullable_class_map_; + std::unique_ptr an_empty_class_; }; // A data class containing a List, used in unit tests. @@ -820,6 +826,33 @@ class TestMessage { std::optional<::flutter::EncodableList> test_list_; }; +// Generated class from Pigeon that represents data sent in messages. +class AnEmptyClass { + public: + // Constructs an object setting all fields. + AnEmptyClass(); + + bool operator==(const AnEmptyClass& other) const; + bool operator!=(const AnEmptyClass& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + /// Stream output operator for formatted string representation. + friend std::ostream& operator<<(std::ostream& os, const AnEmptyClass& obj); + + private: + static AnEmptyClass FromEncodableList(const ::flutter::EncodableList& list); + ::flutter::EncodableList ToEncodableList() const; + friend class AllClassesWrapper; + friend class HostIntegrationCoreApi; + friend class FlutterIntegrationCoreApi; + friend class HostTrivialApi; + friend class HostSmallApi; + friend class FlutterSmallApi; + friend class PigeonInternalCodecSerializer; + friend class CoreTestsTest; +}; + class PigeonInternalCodecSerializer : public ::flutter::StandardCodecSerializer { public: diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index bf3b9563ca90..8103bc0b2e72 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -2,7 +2,7 @@ name: pigeon description: Code generator tool to make communication between Flutter and the host platform type-safe and easier. repository: https://github.com/flutter/packages/tree/main/packages/pigeon issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+pigeon%22 -version: 27.1.1 # This must match the version in lib/src/generator_tools.dart +version: 27.2.0 # This must match the version in lib/src/generator_tools.dart environment: sdk: ^3.10.0