From 578247e26b5ea3ba0f577478b1ce63895d852ec7 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Fri, 19 Mar 2021 15:52:34 -0700 Subject: [PATCH 1/2] Made null-safe generation the default, updated documentation surrounding 0.2.0 release. --- packages/pigeon/CHANGELOG.md | 24 ++++++++++++++++++++++++ packages/pigeon/README.md | 6 +++--- packages/pigeon/lib/dart_generator.dart | 5 ++++- packages/pigeon/lib/pigeon_lib.dart | 3 ++- packages/pigeon/run_tests.sh | 8 +++----- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index eaa7efc0362a..c183db34abec 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,27 @@ +## 0.2.0 + +* **BREAKING CHANGE** - Pigeon files must be null-safe now. That means the + fields inside of the classes must be declared nullable (non-null fields arent't + yet supported). Migration example: + +```dart +// Version 0.1.x +class Foo { + int bar; + String baz; +} + +// Version 0.2.x +class Foo { + int? bar; + String? baz; +} +``` + +* **BREAKING CHANGE** - The default output from Pigeon is now null-safe. If you + want non-null-safe code you must provide the `--no-dart_null_safety` flag. +* The Pigeon source code is now null-safe. + ## 0.1.24 * Moved logic from bin/ to lib/ to help customers wrap up the behavior. diff --git a/packages/pigeon/README.md b/packages/pigeon/README.md index a4e5a0c8f95f..75e95bdf9b1c 100644 --- a/packages/pigeon/README.md +++ b/packages/pigeon/README.md @@ -112,9 +112,9 @@ public interface Api2Host { ## Null Safety (NNBD) -In order to generate null-safe code run the command line with the extra argument -`--dart_null_safety`. For example: -`flutter pub run pigeon --input ./pigeons/messages.dart --dart_null_safety`. +In order to generate non-null-safe code run with the extra argument +`--no-dart_null_safety`. For example: +`flutter pub run pigeon --input ./pigeons/messages.dart --no-dart_null_safety --dart_out stdout`. ## Feedback diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart index f36b62e79b83..41c1dcbf23bf 100644 --- a/packages/pigeon/lib/dart_generator.dart +++ b/packages/pigeon/lib/dart_generator.dart @@ -7,8 +7,11 @@ import 'generator_tools.dart'; /// Options that control how Dart code will be generated. class DartOptions { + /// Constructor for DartOptions. + DartOptions({this.isNullSafe = true}); + /// Determines if the generated code has null safety annotations (Dart >=2.12 required). - bool isNullSafe = false; + bool isNullSafe; } String _escapeForDartSingleQuotedString(String raw) { diff --git a/packages/pigeon/lib/pigeon_lib.dart b/packages/pigeon/lib/pigeon_lib.dart index 9d3bc2ba35fe..3614a9c83545 100644 --- a/packages/pigeon/lib/pigeon_lib.dart +++ b/packages/pigeon/lib/pigeon_lib.dart @@ -313,7 +313,8 @@ options: ..addOption('java_package', help: 'The package that generated Java code will be in.') ..addFlag('dart_null_safety', - help: 'Makes generated Dart code have null safety annotations') + help: 'Makes generated Dart code have null safety annotations', + defaultsTo: true) ..addOption('objc_header_out', help: 'Path to generated Objective-C header file (.h).') ..addOption('objc_prefix', diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh index ab4610e38d10..f48cd409eaa9 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -54,6 +54,7 @@ test_pigeon_ios() { temp_dir=$(mktmpdir) pub run pigeon \ + --no-dart_null_safety \ --input $1 \ --dart_out $temp_dir/pigeon.dart \ --objc_header_out $temp_dir/pigeon.h \ @@ -80,7 +81,6 @@ test_pigeon_android() { pub run pigeon \ --input $1 \ - --dart_null_safety \ --dart_out $temp_dir/pigeon.dart \ --java_out $temp_dir/Pigeon.java \ --java_package foo @@ -113,7 +113,6 @@ test_null_safe_dart() { pub run pigeon \ --input $1 \ - --dart_null_safety \ --dart_out $temp_dir/pigeon.dart dartanalyzer $temp_dir/pigeon.dart --fatal-infos --fatal-warnings --packages ./e2e_tests/test_objc/.packages @@ -165,7 +164,6 @@ pub run pigeon 1> /dev/null pushd $PWD pub run pigeon \ --input pigeons/message.dart \ - --dart_null_safety \ --dart_out platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart cd platform_tests/flutter_null_safe_unit_tests flutter pub get @@ -178,7 +176,6 @@ popd pushd $PWD pub run pigeon \ --input pigeons/message.dart \ - --dart_null_safety \ --dart_out mock_handler_tester/test/message.dart \ --dart_test_out mock_handler_tester/test/test.dart dartfmt -w mock_handler_tester/test/message.dart @@ -221,11 +218,13 @@ test_pigeon_ios ./pigeons/all_datatypes.dart # iOS unit tests on generated code. ############################################################################### pub run pigeon \ + --no-dart_null_safety \ --input pigeons/message.dart \ --dart_out /dev/null \ --objc_header_out platform_tests/ios_unit_tests/ios/Runner/messages.h \ --objc_source_out platform_tests/ios_unit_tests/ios/Runner/messages.m pub run pigeon \ + --no-dart_null_safety \ --input pigeons/async_handlers.dart \ --dart_out /dev/null \ --objc_header_out platform_tests/ios_unit_tests/ios/Runner/async_handlers.h \ @@ -255,7 +254,6 @@ DARTLE_DART="e2e_tests/test_objc/lib/dartle.dart" PIGEON_JAVA="e2e_tests/test_objc/android/app/src/main/java/io/flutter/plugins/Pigeon.java" pub run pigeon \ --input pigeons/message.dart \ - --dart_null_safety \ --dart_out $DARTLE_DART \ --objc_header_out $DARTLE_H \ --objc_source_out $DARTLE_M \ From 8c2dd68936a0802b7470c99057a122e52b52046d Mon Sep 17 00:00:00 2001 From: Goddchen Date: Sat, 20 Mar 2021 14:28:47 +0100 Subject: [PATCH 2/2] Make tests check for null-safe code --- packages/pigeon/test/dart_generator_test.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/pigeon/test/dart_generator_test.dart b/packages/pigeon/test/dart_generator_test.dart index 6ef917238c9b..8d49639f58f5 100644 --- a/packages/pigeon/test/dart_generator_test.dart +++ b/packages/pigeon/test/dart_generator_test.dart @@ -26,7 +26,7 @@ void main() { generateDart(DartOptions(), root, sink); final String code = sink.toString(); expect(code, contains('class Foobar')); - expect(code, contains(' dataType1 field1;')); + expect(code, contains(' dataType1? field1;')); }); test('gen one host api', () { @@ -71,13 +71,13 @@ void main() { expect( code, contains( - 'pigeonMap[\'nested\'] = nested == null ? null : nested.encode()', + 'pigeonMap[\'nested\'] = nested == null ? null : nested!.encode()', ), ); expect( code.replaceAll('\n', ' ').replaceAll(' ', ''), contains( - '..nested = pigeonMap[\'nested\'] != null ? Input.decode(pigeonMap[\'nested\']) : null;', + '..nested = pigeonMap[\'nested\'] != null ? Input.decode(pigeonMap[\'nested\']!) : null;', ), ); }); @@ -243,7 +243,7 @@ void main() { expect(testCode, contains('abstract class ApiMock')); expect(testCode, isNot(contains('.ApiMock.doSomething'))); expect(testCode, contains('\'${Keys.result}\': output.encode()')); - expect(testCode, contains('return {};')); + expect(testCode, contains('return {};')); }); test('opt out of nndb', () { @@ -261,7 +261,7 @@ void main() { classes: [klass], ); final StringBuffer sink = StringBuffer(); - generateDart(DartOptions(), root, sink); + generateDart(DartOptions(isNullSafe: false), root, sink); final String code = sink.toString(); expect(code, contains('// @dart = 2.8')); });