diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index 80b759b3f75..19d9bf0592d 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,11 @@ +## 17.0.0 + +* **Breaking Change** [kotlin] Converts Kotlin enum case generation to SCREAMING_SNAKE_CASE. + * Updates `writeEnum` function to adhere to Kotlin naming conventions. + * Improves handling of complex names with enhanced regex patterns. + * Expands unit tests for comprehensive name conversion validation. + * **Migration Note**: This change modifies the naming convention of Kotlin enum cases generated from the Pigeon package. It is recommended to review the impact on your existing codebase and update any dependent code accordingly. + ## 16.0.5 * Adds ProxyApi to AST generation. diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart index b9aec2b2799..99da7e0a4d5 100644 --- a/packages/pigeon/lib/generator_tools.dart +++ b/packages/pigeon/lib/generator_tools.dart @@ -13,7 +13,7 @@ import 'ast.dart'; /// The current version of pigeon. /// /// This must match the version in pubspec.yaml. -const String pigeonVersion = '16.0.5'; +const String pigeonVersion = '17.0.0'; /// Read all the content from [stdin] to a String. String readStdin() { diff --git a/packages/pigeon/lib/kotlin_generator.dart b/packages/pigeon/lib/kotlin_generator.dart index 97dd68ac644..29e3e366255 100644 --- a/packages/pigeon/lib/kotlin_generator.dart +++ b/packages/pigeon/lib/kotlin_generator.dart @@ -127,7 +127,11 @@ class KotlinGenerator extends StructuredGenerator { enumerate(anEnum.members, (int index, final EnumMember member) { addDocumentationComments( indent, member.documentationComments, _docCommentSpec); - indent.write('${member.name.toUpperCase()}($index)'); + final String nameScreamingSnakeCase = member.name + .replaceAllMapped( + RegExp(r'(?<=[a-z])[A-Z]'), (Match m) => '_${m.group(0)}') + .toUpperCase(); + indent.write('$nameScreamingSnakeCase($index)'); if (index != anEnum.members.length - 1) { indent.addln(','); } else { diff --git a/packages/pigeon/pigeons/core_tests.dart b/packages/pigeon/pigeons/core_tests.dart index a0c6a3ccf29..9d571688a09 100644 --- a/packages/pigeon/pigeons/core_tests.dart +++ b/packages/pigeon/pigeons/core_tests.dart @@ -8,6 +8,8 @@ enum AnEnum { one, two, three, + fortyTwo, + fourHundredTwentyTwo, } /// A class containing all supported types. diff --git a/packages/pigeon/pigeons/enum.dart b/packages/pigeon/pigeons/enum.dart index 7a39e0bea2c..b060fe5a53d 100644 --- a/packages/pigeon/pigeons/enum.dart +++ b/packages/pigeon/pigeons/enum.dart @@ -18,6 +18,9 @@ enum EnumState { /// This comment is to test enum member (Error) documentation comments. Error, + + /// This comment is to test enum member (SnakeCase) documentation comments. + SnakeCase, } /// This comment is to test class documentation comments. 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 8585b13315a..0917a8cfa79 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 @@ -77,7 +77,9 @@ protected static FlutterError createConnectionError(@NonNull String channelName) public enum AnEnum { ONE(0), TWO(1), - THREE(2); + THREE(2), + FORTY_TWO(3), + FOUR_HUNDRED_TWENTY_TWO(4); final int index; diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h index 782c3794a13..e7022baa940 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h @@ -18,6 +18,8 @@ typedef NS_ENUM(NSUInteger, AnEnum) { AnEnumOne = 0, AnEnumTwo = 1, AnEnumThree = 2, + AnEnumFortyTwo = 3, + AnEnumFourHundredTwentyTwo = 4, }; /// Wrapper for AnEnum to allow for nullability. diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/macos/Classes/CoreTests.gen.h b/packages/pigeon/platform_tests/alternate_language_test_plugin/macos/Classes/CoreTests.gen.h index 782c3794a13..e7022baa940 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/macos/Classes/CoreTests.gen.h +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/macos/Classes/CoreTests.gen.h @@ -18,6 +18,8 @@ typedef NS_ENUM(NSUInteger, AnEnum) { AnEnumOne = 0, AnEnumTwo = 1, AnEnumThree = 2, + AnEnumFortyTwo = 3, + AnEnumFourHundredTwentyTwo = 4, }; /// Wrapper for AnEnum to allow for nullability. 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 6b60a87e146..4ebee6b740a 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 @@ -138,7 +138,7 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { 'd': false, 'e': null }, - anEnum: AnEnum.two, + anEnum: AnEnum.fortyTwo, anObject: 1, ); @@ -166,7 +166,7 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { ], nullableMapWithAnnotations: {}, nullableMapWithObject: {}, - aNullableEnum: AnEnum.two, + aNullableEnum: AnEnum.fourHundredTwentyTwo, aNullableObject: 0, ); @@ -443,6 +443,15 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { expect(receivedEnum, sentEnum); }); + testWidgets('multi word enums serialize and deserialize correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + const AnEnum sentEnum = AnEnum.fortyTwo; + final AnEnum receivedEnum = await api.echoEnum(sentEnum); + expect(receivedEnum, sentEnum); + }); + testWidgets('required named parameter', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); // This number corresponds with the default value of this method. @@ -648,6 +657,15 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { expect(echoEnum, sentEnum); }); + testWidgets('multi word nullable enums serialize and deserialize correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + const AnEnum sentEnum = AnEnum.fourHundredTwentyTwo; + final AnEnum? echoEnum = await api.echoNullableEnum(sentEnum); + expect(echoEnum, sentEnum); + }); + testWidgets('null lists serialize and deserialize correctly', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); @@ -887,6 +905,15 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { expect(echoEnum, sentEnum); }); + testWidgets('multi word enums serialize and deserialize correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + const AnEnum sentEnum = AnEnum.fourHundredTwentyTwo; + final AnEnum echoEnum = await api.echoAsyncEnum(sentEnum); + expect(echoEnum, sentEnum); + }); + testWidgets('nullable Int async serialize and deserialize correctly', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); @@ -1004,6 +1031,15 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { expect(echoEnum, sentEnum); }); + testWidgets('nullable enums serialize and deserialize correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + const AnEnum sentEnum = AnEnum.fortyTwo; + final AnEnum? echoEnum = await api.echoAsyncNullableEnum(sentEnum); + expect(echoEnum, sentEnum); + }); + testWidgets('null Ints async serialize and deserialize correctly', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); @@ -1243,6 +1279,15 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { expect(echoEnum, sentEnum); }); + testWidgets('multi word enums serialize and deserialize correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + const AnEnum sentEnum = AnEnum.fortyTwo; + final AnEnum echoEnum = await api.callFlutterEchoEnum(sentEnum); + expect(echoEnum, sentEnum); + }); + testWidgets('nullable booleans serialize and deserialize correctly', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); @@ -1407,6 +1452,15 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { expect(echoEnum, sentEnum); }); + testWidgets('multi word nullable enums serialize and deserialize correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + const AnEnum sentEnum = AnEnum.fourHundredTwentyTwo; + final AnEnum? echoEnum = await api.callFlutterEchoNullableEnum(sentEnum); + expect(echoEnum, sentEnum); + }); + testWidgets('null enums serialize and deserialize correctly', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); 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 6815f461c94..98c1aea5c08 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 @@ -34,6 +34,8 @@ enum AnEnum { one, two, three, + fortyTwo, + fourHundredTwentyTwo, } /// A class containing all supported types. diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/enum.gen.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/enum.gen.dart index 8354d159d33..c585d3a8325 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/enum.gen.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/enum.gen.dart @@ -40,6 +40,9 @@ enum EnumState { /// This comment is to test enum member (Error) documentation comments. Error, + + /// This comment is to test enum member (SnakeCase) documentation comments. + SnakeCase, } /// This comment is to test class documentation comments. 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 798d6684989..c3ec9d98caf 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 @@ -51,7 +51,9 @@ class CoreTestsError( enum class AnEnum(val raw: Int) { ONE(0), TWO(1), - THREE(2); + THREE(2), + FORTY_TWO(3), + FOUR_HUNDRED_TWENTY_TWO(4); companion object { fun ofRaw(raw: Int): AnEnum? { diff --git a/packages/pigeon/platform_tests/test_plugin/android/src/test/kotlin/com/example/test_plugin/EnumTest.kt b/packages/pigeon/platform_tests/test_plugin/android/src/test/kotlin/com/example/test_plugin/EnumTest.kt index 8e78e7abd2f..1117a8a3a1e 100644 --- a/packages/pigeon/platform_tests/test_plugin/android/src/test/kotlin/com/example/test_plugin/EnumTest.kt +++ b/packages/pigeon/platform_tests/test_plugin/android/src/test/kotlin/com/example/test_plugin/EnumTest.kt @@ -21,7 +21,7 @@ internal class EnumTest : TestCase() { val api = mockk() val channelName = "dev.flutter.pigeon.pigeon_integration_tests.EnumApi2Host.echo" - val input = DataWithEnum(EnumState.SUCCESS) + val input = DataWithEnum(EnumState.SNAKE_CASE) val handlerSlot = slot() @@ -52,7 +52,7 @@ internal class EnumTest : TestCase() { val binaryMessenger = mockk() val api = EnumApi2Flutter(binaryMessenger) - val input = DataWithEnum(EnumState.SUCCESS) + val input = DataWithEnum(EnumState.SNAKE_CASE) every { binaryMessenger.send(any(), any(), any()) } answers { diff --git a/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift index 14bcb9a4113..62682b44c2c 100644 --- a/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift +++ b/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift @@ -53,6 +53,8 @@ enum AnEnum: Int { case one = 0 case two = 1 case three = 2 + case fortyTwo = 3 + case fourHundredTwentyTwo = 4 } /// A class containing all supported types. diff --git a/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift index 14bcb9a4113..62682b44c2c 100644 --- a/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift +++ b/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift @@ -53,6 +53,8 @@ enum AnEnum: Int { case one = 0 case two = 1 case three = 2 + case fortyTwo = 3 + case fourHundredTwentyTwo = 4 } /// A class containing all supported types. 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 53c3320b3cf..484d5e349bc 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 @@ -65,7 +65,13 @@ class ErrorOr { std::variant v_; }; -enum class AnEnum { one = 0, two = 1, three = 2 }; +enum class AnEnum { + one = 0, + two = 1, + three = 2, + fortyTwo = 3, + fourHundredTwentyTwo = 4 +}; // A class containing all supported types. // diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index e077f7d8132..d969e5a08ed 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: 16.0.5 # This must match the version in lib/generator_tools.dart +version: 17.0.0 # This must match the version in lib/generator_tools.dart environment: sdk: ">=3.0.0 <4.0.0" diff --git a/packages/pigeon/test/kotlin_generator_test.dart b/packages/pigeon/test/kotlin_generator_test.dart index e680e3ac66d..d4817bf56e9 100644 --- a/packages/pigeon/test/kotlin_generator_test.dart +++ b/packages/pigeon/test/kotlin_generator_test.dart @@ -856,10 +856,10 @@ void main() { test('gen one enum class', () { final Enum anEnum = Enum( - name: 'Enum1', + name: 'SampleEnum', members: [ - EnumMember(name: 'one'), - EnumMember(name: 'two'), + EnumMember(name: 'sampleVersion'), + EnumMember(name: 'sampleTest'), ], ); final Class classDefinition = Class( @@ -867,11 +867,11 @@ void main() { fields: [ NamedType( type: TypeDeclaration( - baseName: 'Enum1', + baseName: 'SampleEnum', associatedEnum: emptyEnum, isNullable: true, ), - name: 'enum1', + name: 'sampleEnum', ), ], ); @@ -890,9 +890,9 @@ void main() { dartPackageName: DEFAULT_PACKAGE_NAME, ); final String code = sink.toString(); - expect(code, contains('enum class Enum1(val raw: Int)')); - expect(code, contains('ONE(0)')); - expect(code, contains('TWO(1)')); + expect(code, contains('enum class SampleEnum(val raw: Int)')); + expect(code, contains('SAMPLE_VERSION(0)')); + expect(code, contains('SAMPLE_TEST(1)')); }); Iterable makeIterable(String string) sync* {