diff --git a/packages/pigeon/README.md b/packages/pigeon/README.md index 699cffdb96e9..a4e5a0c8f95f 100644 --- a/packages/pigeon/README.md +++ b/packages/pigeon/README.md @@ -78,7 +78,7 @@ Example: ```dart class Value { - int number; + int? number; } @HostApi() diff --git a/packages/pigeon/example/README.md b/packages/pigeon/example/README.md index 0c8fdb8ee27e..a6d18e36a265 100644 --- a/packages/pigeon/example/README.md +++ b/packages/pigeon/example/README.md @@ -14,11 +14,11 @@ from Flutter to the host-platform. import 'package:pigeon/pigeon.dart'; class SearchRequest { - String query; + String? query; } class SearchReply { - String result; + String? result; } @HostApi() diff --git a/packages/pigeon/lib/ast.dart b/packages/pigeon/lib/ast.dart index 747a7ed56d48..95fb026a9c9b 100644 --- a/packages/pigeon/lib/ast.dart +++ b/packages/pigeon/lib/ast.dart @@ -17,8 +17,12 @@ class Node {} /// Represents a method on an [Api]. class Method extends Node { /// Parametric constructor for [Method]. - Method( - {this.name, this.returnType, this.argType, this.isAsynchronous = false}); + Method({ + required this.name, + required this.returnType, + required this.argType, + this.isAsynchronous = false, + }); /// The name of the method. String name; @@ -36,7 +40,12 @@ class Method extends Node { /// Represents a collection of [Method]s that are hosted on a given [location]. class Api extends Node { /// Parametric constructor for [Api]. - Api({this.name, this.location, this.methods, this.dartHostTestHandler}); + Api({ + required this.name, + required this.location, + required this.methods, + this.dartHostTestHandler, + }); /// The name of the API. String name; @@ -48,13 +57,16 @@ class Api extends Node { List methods; /// The name of the Dart test interface to generate to help with testing. - String dartHostTestHandler; + String? dartHostTestHandler; } /// Represents a field on a [Class]. class Field extends Node { /// Parametric constructor for [Field]. - Field({this.name, this.dataType}); + Field({ + required this.name, + required this.dataType, + }); /// The name of the field. String name; @@ -71,7 +83,10 @@ class Field extends Node { /// Represents a class with [Field]s. class Class extends Node { /// Parametric constructor for [Class]. - Class({this.name, this.fields}); + Class({ + required this.name, + required this.fields, + }); /// The name of the class. String name; @@ -88,7 +103,10 @@ class Class extends Node { /// Top-level node for the AST. class Root extends Node { /// Parametric constructor for [Root]. - Root({this.classes, this.apis}); + Root({ + required this.classes, + required this.apis, + }); /// All the classes contained in the AST. List classes; diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart index 168ac86f42a1..f36b62e79b83 100644 --- a/packages/pigeon/lib/dart_generator.dart +++ b/packages/pigeon/lib/dart_generator.dart @@ -33,7 +33,7 @@ void _writeHostApi(DartOptions opt, Indent indent, Api api) { } String argSignature = ''; String sendArgument = 'null'; - String encodedDeclaration; + String? encodedDeclaration; if (func.argType != 'void') { argSignature = '${func.argType} arg'; sendArgument = 'encoded'; @@ -47,17 +47,18 @@ void _writeHostApi(DartOptions opt, Indent indent, Api api) { indent.writeln(encodedDeclaration); } final String channelName = makeChannelName(api, func); - indent.writeln('const BasicMessageChannel channel ='); + indent.writeln( + 'const BasicMessageChannel channel = BasicMessageChannel('); indent.nest(2, () { indent.writeln( - 'BasicMessageChannel(\'$channelName\', StandardMessageCodec());', + '\'$channelName\', StandardMessageCodec());', ); }); final String returnStatement = func.returnType == 'void' ? '// noop' : 'return ${func.returnType}.decode(replyMap[\'${Keys.result}\']$unwrapOperator);'; indent.format(''' -final Map$nullTag replyMap = await channel.send($sendArgument) as Map$nullTag; +final Map$nullTag replyMap =\n\t\tawait channel.send($sendArgument) as Map$nullTag; if (replyMap == null) { \tthrow PlatformException( \t\tcode: 'channel-error', @@ -83,7 +84,7 @@ void _writeFlutterApi( DartOptions opt, Indent indent, Api api, { - String Function(Method) channelNameFunc, + String Function(Method)? channelNameFunc, bool isMockHandler = false, }) { assert(api.location == ApiLocation.flutter); @@ -105,14 +106,14 @@ void _writeFlutterApi( indent.write(''); indent.scoped('{', '}', () { indent.writeln( - 'const BasicMessageChannel channel =', + 'const BasicMessageChannel channel = BasicMessageChannel(', ); final String channelName = channelNameFunc == null ? makeChannelName(api, func) : channelNameFunc(func); indent.nest(2, () { indent.writeln( - 'BasicMessageChannel(\'$channelName\', StandardMessageCodec());', + '\'$channelName\', StandardMessageCodec());', ); }); final String messageHandlerSetter = @@ -248,9 +249,10 @@ void generateDart(DartOptions opt, Root root, StringSink sink) { final Field field = klass.fields[index]; indent.write('..${field.name} = '); if (customClassNames.contains(field.dataType)) { - indent.add( - 'pigeonMap[\'${field.name}\'] != null ? ${field.dataType}.decode(pigeonMap[\'${field.name}\']$unwrapOperator) : null', - ); + indent.format(''' +pigeonMap['${field.name}'] != null +\t\t? ${field.dataType}.decode(pigeonMap['${field.name}']$unwrapOperator) +\t\t: null''', leadingSpace: false, trailingNewline: false); } else { indent.add( 'pigeonMap[\'${field.name}\'] as ${_addGenericTypes(field.dataType, nullTag)}', @@ -300,9 +302,10 @@ void generateTestDart( for (final Api api in root.apis) { if (api.location == ApiLocation.host && api.dartHostTestHandler != null) { final Api mockApi = Api( - name: api.dartHostTestHandler, + name: api.dartHostTestHandler!, methods: api.methods, location: ApiLocation.flutter, + dartHostTestHandler: api.dartHostTestHandler, ); indent.writeln(''); _writeFlutterApi( diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart index 895c58e97bf3..c1cf021ee9c0 100644 --- a/packages/pigeon/lib/generator_tools.dart +++ b/packages/pigeon/lib/generator_tools.dart @@ -8,7 +8,7 @@ import 'dart:mirrors'; import 'ast.dart'; /// The current version of pigeon. This must match the version in pubspec.yaml. -const String pigeonVersion = '0.1.24'; +const String pigeonVersion = '0.2.0'; /// Read all the content from [stdin] to a String. String readStdin() { @@ -55,17 +55,26 @@ class Indent { } /// Replaces the newlines and tabs of input and adds it to the stream. - void format(String input) { - for (final String line in input.split('\n')) { - writeln(line.replaceAll('\t', tab)); + void format(String input, + {bool leadingSpace = true, bool trailingNewline = true}) { + final List lines = input.split('\n'); + for (int i = 0; i < lines.length; ++i) { + final String line = lines[i]; + if (i == 0 && !leadingSpace) { + addln(line.replaceAll('\t', tab)); + } else if (i == lines.length - 1 && !trailingNewline) { + write(line.replaceAll('\t', tab)); + } else { + writeln(line.replaceAll('\t', tab)); + } } } /// Scoped increase of the ident level. For the execution of [func] the /// indentation will be incremented. void scoped( - String begin, - String end, + String? begin, + String? end, Function func, { bool addTrailingNewline = true, }) { @@ -83,12 +92,12 @@ class Indent { /// Like `scoped` but writes the current indentation level. void writeScoped( - String begin, + String? begin, String end, Function func, { bool addTrailingNewline = true, }) { - scoped(str() + begin ?? '', end, func, + scoped(str() + (begin ?? ''), end, func, addTrailingNewline: addTrailingNewline); } @@ -133,7 +142,10 @@ String makeChannelName(Api api, Method func) { /// Represents the mapping of a Dart datatype to a Host datatype. class HostDatatype { /// Parametric constructor for HostDatatype. - HostDatatype({this.datatype, this.isBuiltin}); + HostDatatype({ + required this.datatype, + required this.isBuiltin, + }); /// The [String] that can be printed into host code to represent the type. final String datatype; @@ -147,9 +159,9 @@ class HostDatatype { /// `builtinResolver` will return the host datatype for the Dart datatype for /// builtin types. `customResolver` can modify the datatype of custom types. HostDatatype getHostDatatype( - Field field, List classes, String Function(String) builtinResolver, - {String Function(String) customResolver}) { - final String datatype = builtinResolver(field.dataType); + Field field, List classes, String? Function(String) builtinResolver, + {String Function(String)? customResolver}) { + final String? datatype = builtinResolver(field.dataType); if (datatype == null) { if (classes.map((Class x) => x.name).contains(field.dataType)) { final String customName = customResolver != null diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart index 2c119e8ed58a..9f1d307c3784 100644 --- a/packages/pigeon/lib/java_generator.dart +++ b/packages/pigeon/lib/java_generator.dart @@ -20,11 +20,17 @@ const Map _javaTypeForDartTypeMap = { /// Options that control how Java code will be generated. class JavaOptions { + /// Creates a [JavaOptions] object + JavaOptions({ + this.className, + this.package, + }); + /// The name of the class that will house all the generated classes. - String className; + String? className; /// The package where the generated class will live. - String package; + String? package; } void _writeHostApi(Indent indent, Api api) { @@ -198,7 +204,7 @@ String _makeSetter(Field field) { return 'set$uppercased'; } -String _javaTypeForDartType(String datatype) { +String? _javaTypeForDartType(String datatype) { return _javaTypeForDartTypeMap[datatype]; } @@ -236,11 +242,10 @@ void generateJava(JavaOptions options, Root root, StringSink sink) { indent.writeln('import java.util.HashMap;'); indent.addln(''); - assert(options.className != null); indent.writeln('/** Generated class from Pigeon. */'); indent.writeln( '@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"})'); - indent.write('public class ${options.className} '); + indent.write('public class ${options.className!} '); indent.scoped('{', '}', () { for (final Class klass in root.classes) { indent.addln(''); diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart index 30a4b59a8690..54665b825a35 100644 --- a/packages/pigeon/lib/objc_generator.dart +++ b/packages/pigeon/lib/objc_generator.dart @@ -8,17 +8,20 @@ import 'generator_tools.dart'; /// Options that control how Objective-C code will be generated. class ObjcOptions { /// Parametric constructor for ObjcOptions. - ObjcOptions({this.header, this.prefix}); + ObjcOptions({ + this.header, + this.prefix, + }); /// The path to the header that will get placed in the source filed (example: /// "foo.h"). - String header; + String? header; /// Prefix that will be appended before all generated classes and protocols. - String prefix; + String? prefix; } -String _className(String prefix, String className) { +String _className(String? prefix, String className) { if (prefix != null) { return '$prefix$className'; } else { @@ -58,12 +61,12 @@ const Map _propertyTypeForDartTypeMap = { 'Map': 'strong', }; -String _objcTypeForDartType(String type) { +String? _objcTypeForDartType(String type) { return _objcTypeForDartTypeMap[type]; } String _propertyTypeForDartType(String type) { - final String result = _propertyTypeForDartTypeMap[type]; + final String? result = _propertyTypeForDartTypeMap[type]; if (result == null) { return 'assign'; } else { @@ -72,7 +75,7 @@ String _propertyTypeForDartType(String type) { } void _writeClassDeclarations( - Indent indent, List classes, String prefix) { + Indent indent, List classes, String? prefix) { for (final Class klass in classes) { indent.writeln('@interface ${_className(prefix, klass.name)} : NSObject'); for (final Field field in klass.fields) { @@ -191,7 +194,7 @@ void generateObjcHeader(ObjcOptions options, Root root, StringSink sink) { } String _dictGetter( - List classnames, String dict, Field field, String prefix) { + List classnames, String dict, Field field, String? prefix) { if (classnames.contains(field.dataType)) { String className = field.dataType; if (prefix != null) { diff --git a/packages/pigeon/lib/pigeon_cl.dart b/packages/pigeon/lib/pigeon_cl.dart index b605d9d55fe3..de70005bfc5c 100644 --- a/packages/pigeon/lib/pigeon_cl.dart +++ b/packages/pigeon/lib/pigeon_cl.dart @@ -11,7 +11,7 @@ import 'package:pigeon/pigeon_lib.dart'; /// This creates a relative path from `from` to `input`, the output being a /// posix path on all platforms. -String _posixRelative(String input, {String from}) { +String _posixRelative(String input, {required String from}) { final path.Context context = path.Context(style: path.Style.posix); final String rawInputPath = input; final String absInputPath = File(rawInputPath).absolute.path; @@ -27,7 +27,7 @@ String _posixRelative(String input, {String from}) { /// This is the main entrypoint for the command-line tool. [args] are the /// commmand line arguments and there is an optional [packageConfig] to /// accomodate users that want to integrate pigeon with other build systems. -Future runCommandLine(List args, {Uri packageConfig}) async { +Future runCommandLine(List args, {Uri? packageConfig}) async { final PigeonOptions opts = Pigeon.parseArgs(args); final Directory tempDir = Directory.systemTemp.createTempSync( 'flutter_pigeon.', @@ -35,11 +35,11 @@ Future runCommandLine(List args, {Uri packageConfig}) async { String importLine = ''; if (opts.input != null) { - final String relInputPath = _posixRelative(opts.input, from: tempDir.path); + final String relInputPath = _posixRelative(opts.input!, from: tempDir.path); importLine = 'import \'$relInputPath\';\n'; } final String code = """ -// @dart = 2.2 +// @dart = 2.12 $importLine import 'dart:io'; import 'dart:isolate'; diff --git a/packages/pigeon/lib/pigeon_lib.dart b/packages/pigeon/lib/pigeon_lib.dart index 4072779440e1..9d3bc2ba35fe 100644 --- a/packages/pigeon/lib/pigeon_lib.dart +++ b/packages/pigeon/lib/pigeon_lib.dart @@ -58,7 +58,7 @@ class HostApi { /// testing. /// /// Defaults to `null` in which case no handler will be generated. - final String dartHostTestHandler; + final String? dartHostTestHandler; } /// Metadata to annotate a Pigeon API implemented by Flutter. @@ -75,16 +75,20 @@ class FlutterApi { /// Represents an error as a result of parsing and generating code. class Error { /// Parametric constructor for Error. - Error({this.message, this.filename, this.lineNumber}); + Error({ + required this.message, + this.filename, + this.lineNumber, + }); /// A description of the error. String message; /// What file caused the [Error]. - String filename; + String? filename; /// What line the error happened on. - int lineNumber; + int? lineNumber; @override String toString() { @@ -97,7 +101,7 @@ bool _isApi(ClassMirror classMirror) { (_getHostApi(classMirror) != null || _isFlutterApi(classMirror)); } -HostApi _getHostApi(ClassMirror apiMirror) { +HostApi? _getHostApi(ClassMirror apiMirror) { for (final InstanceMirror instance in apiMirror.metadata) { if (instance.reflectee is HostApi) { return instance.reflectee; @@ -117,38 +121,44 @@ bool _isFlutterApi(ClassMirror apiMirror) { /// Options used when running the code generator. class PigeonOptions { + /// Creates a instance of PigeonOptions + PigeonOptions(); + /// Path to the file which will be processed. - String input; + String? input; /// Path to the dart file that will be generated. - String dartOut; + String? dartOut; /// Path to the dart file that will be generated for test support classes. - String dartTestOut; + String? dartTestOut; /// Path to the ".h" Objective-C file will be generated. - String objcHeaderOut; + String? objcHeaderOut; /// Path to the ".m" Objective-C file will be generated. - String objcSourceOut; + String? objcSourceOut; /// Options that control how Objective-C will be generated. - ObjcOptions objcOptions = ObjcOptions(); + ObjcOptions? objcOptions; /// Path to the java file that will be generated. - String javaOut; + String? javaOut; /// Options that control how Java will be generated. - JavaOptions javaOptions = JavaOptions(); + JavaOptions? javaOptions; /// Options that control how Dart will be generated. - DartOptions dartOptions = DartOptions(); + DartOptions? dartOptions = DartOptions(); } /// A collection of an AST represented as a [Root] and [Error]'s. class ParseResults { /// Parametric constructor for [ParseResults]. - ParseResults({this.root, this.errors}); + ParseResults({ + required this.root, + required this.errors, + }); /// The resulting AST. final Root root; @@ -169,14 +179,18 @@ class Pigeon { for (final DeclarationMirror declaration in klassMirror.declarations.values) { if (declaration is VariableMirror) { - fields.add(Field() - ..name = MirrorSystem.getName(declaration.simpleName) - ..dataType = MirrorSystem.getName(declaration.type.simpleName)); + fields.add(Field( + name: MirrorSystem.getName(declaration.simpleName), + dataType: MirrorSystem.getName( + declaration.type.simpleName, + ), + )); } } - final Class klass = Class() - ..name = MirrorSystem.getName(klassMirror.simpleName) - ..fields = fields; + final Class klass = Class( + name: MirrorSystem.getName(klassMirror.simpleName), + fields: fields, + ); return klass; } @@ -208,7 +222,6 @@ class Pigeon { /// Use reflection to parse the [types] provided. ParseResults parse(List types) { - final Root root = Root(); final Set classes = {}; final List apis = []; @@ -226,19 +239,19 @@ class Pigeon { in apiMirror.declarations.values) { if (declaration is MethodMirror && !declaration.isConstructor) { if (!isVoid(declaration.returnType)) { - classes.add(declaration.returnType); + classes.add(declaration.returnType as ClassMirror); } if (declaration.parameters.isNotEmpty) { - classes.add(declaration.parameters[0].type); + classes.add(declaration.parameters[0].type as ClassMirror); } } } } - - root.classes = - _unique(_parseClassMirrors(classes), (Class x) => x.name).toList(); - - root.apis = []; + final Root root = Root( + classes: + _unique(_parseClassMirrors(classes), (Class x) => x.name).toList(), + apis: [], + ); for (final ClassMirror apiMirror in apis) { final List functions = []; for (final DeclarationMirror declaration @@ -249,23 +262,24 @@ class Pigeon { return MirrorSystem.getName(it.type.simpleName) == '${async.runtimeType}'; }); - functions.add(Method() - ..name = MirrorSystem.getName(declaration.simpleName) - ..argType = declaration.parameters.isEmpty + functions.add(Method( + name: MirrorSystem.getName(declaration.simpleName), + argType: declaration.parameters.isEmpty ? 'void' : MirrorSystem.getName( - declaration.parameters[0].type.simpleName) - ..returnType = - MirrorSystem.getName(declaration.returnType.simpleName) - ..isAsynchronous = isAsynchronous); + declaration.parameters[0].type.simpleName), + returnType: MirrorSystem.getName(declaration.returnType.simpleName), + isAsynchronous: isAsynchronous, + )); } } - final HostApi hostApi = _getHostApi(apiMirror); + final HostApi? hostApi = _getHostApi(apiMirror); root.apis.add(Api( - name: MirrorSystem.getName(apiMirror.simpleName), - location: hostApi != null ? ApiLocation.host : ApiLocation.flutter, - methods: functions, - dartHostTestHandler: hostApi?.dartHostTestHandler)); + name: MirrorSystem.getName(apiMirror.simpleName), + location: hostApi != null ? ApiLocation.host : ApiLocation.flutter, + methods: functions, + dartHostTestHandler: hostApi?.dartHostTestHandler, + )); } final List validateErrors = _validateAst(root); @@ -315,10 +329,17 @@ options: opts.dartTestOut = results['dart_test_out']; opts.objcHeaderOut = results['objc_header_out']; opts.objcSourceOut = results['objc_source_out']; - opts.objcOptions.prefix = results['objc_prefix']; + opts.objcOptions = ObjcOptions( + prefix: results['objc_prefix'], + ); opts.javaOut = results['java_out']; - opts.javaOptions.package = results['java_package']; - opts.dartOptions.isNullSafe = results['dart_null_safety']; + opts.javaOptions = JavaOptions( + className: (opts.javaOut == null) + ? null + : path.basenameWithoutExtension(opts.javaOut!), + package: results['java_package'], + ); + opts.dartOptions = DartOptions()..isNullSafe = results['dart_null_safety']; return opts; } @@ -408,10 +429,7 @@ options: final List errors = []; final List apis = []; if (options.objcHeaderOut != null) { - options.objcOptions.header = basename(options.objcHeaderOut); - } - if (options.javaOut != null) { - options.javaOptions.className = basenameWithoutExtension(options.javaOut); + options.objcOptions?.header = basename(options.objcHeaderOut!); } for (final LibraryMirror library @@ -430,19 +448,19 @@ options: } if (options.dartOut != null) { await _runGenerator( - options.dartOut, - (StringSink sink) => - generateDart(options.dartOptions, parseResults.root, sink)); + options.dartOut!, + (StringSink sink) => generateDart( + options.dartOptions ?? DartOptions(), parseResults.root, sink)); } - if (options.dartTestOut != null) { + if (options.dartTestOut != null && options.dartOut != null) { final String mainPath = context.relative( - _posixify(options.dartOut), - from: _posixify(path.dirname(options.dartTestOut)), + _posixify(options.dartOut!), + from: _posixify(path.dirname(options.dartTestOut!)), ); await _runGenerator( - options.dartTestOut, + options.dartTestOut!, (StringSink sink) => generateTestDart( - options.dartOptions, + options.dartOptions ?? DartOptions(), parseResults.root, sink, mainPath, @@ -451,21 +469,21 @@ options: } if (options.objcHeaderOut != null) { await _runGenerator( - options.objcHeaderOut, + options.objcHeaderOut!, (StringSink sink) => generateObjcHeader( - options.objcOptions, parseResults.root, sink)); + options.objcOptions ?? ObjcOptions(), parseResults.root, sink)); } if (options.objcSourceOut != null) { await _runGenerator( - options.objcSourceOut, + options.objcSourceOut!, (StringSink sink) => generateObjcSource( - options.objcOptions, parseResults.root, sink)); + options.objcOptions ?? ObjcOptions(), parseResults.root, sink)); } if (options.javaOut != null) { await _runGenerator( - options.javaOut, - (StringSink sink) => - generateJava(options.javaOptions, parseResults.root, sink)); + options.javaOut!, + (StringSink sink) => generateJava( + options.javaOptions ?? JavaOptions(), parseResults.root, sink)); } } else { errors.add(Error(message: 'No pigeon classes found, nothing generated.')); diff --git a/packages/pigeon/mock_handler_tester/pubspec.yaml b/packages/pigeon/mock_handler_tester/pubspec.yaml index eeabf8d49fd0..1826c25edda6 100644 --- a/packages/pigeon/mock_handler_tester/pubspec.yaml +++ b/packages/pigeon/mock_handler_tester/pubspec.yaml @@ -4,10 +4,10 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" dependencies: - cupertino_icons: ^0.1.3 + cupertino_icons: ^1.0.2 flutter: sdk: flutter diff --git a/packages/pigeon/mock_handler_tester/test/message.dart b/packages/pigeon/mock_handler_tester/test/message.dart index 30ccafa5a4ac..0896b04a9cd3 100644 --- a/packages/pigeon/mock_handler_tester/test/message.dart +++ b/packages/pigeon/mock_handler_tester/test/message.dart @@ -1,38 +1,38 @@ -// Autogenerated from Pigeon (v0.1.19), do not edit directly. +// Autogenerated from Pigeon (v0.2.0-nullsafety.0), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import -// @dart = 2.8 +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types +// @dart = 2.12 import 'dart:async'; import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List; import 'package:flutter/services.dart'; class SearchReply { - String result; - String error; + String? result; + String? error; Object encode() { - final Map pigeonMap = {}; + final Map pigeonMap = {}; pigeonMap['result'] = result; pigeonMap['error'] = error; return pigeonMap; } static SearchReply decode(Object message) { - final Map pigeonMap = message as Map; + final Map pigeonMap = message as Map; return SearchReply() - ..result = pigeonMap['result'] as String - ..error = pigeonMap['error'] as String; + ..result = pigeonMap['result'] as String? + ..error = pigeonMap['error'] as String?; } } class SearchRequest { - String query; - int anInt; - bool aBool; + String? query; + int? anInt; + bool? aBool; Object encode() { - final Map pigeonMap = {}; + final Map pigeonMap = {}; pigeonMap['query'] = query; pigeonMap['anInt'] = anInt; pigeonMap['aBool'] = aBool; @@ -40,45 +40,45 @@ class SearchRequest { } static SearchRequest decode(Object message) { - final Map pigeonMap = message as Map; + final Map pigeonMap = message as Map; return SearchRequest() - ..query = pigeonMap['query'] as String - ..anInt = pigeonMap['anInt'] as int - ..aBool = pigeonMap['aBool'] as bool; + ..query = pigeonMap['query'] as String? + ..anInt = pigeonMap['anInt'] as int? + ..aBool = pigeonMap['aBool'] as bool?; } } class Nested { - SearchRequest request; + SearchRequest? request; Object encode() { - final Map pigeonMap = {}; - pigeonMap['request'] = request?.encode(); + final Map pigeonMap = {}; + pigeonMap['request'] = request == null ? null : request!.encode(); return pigeonMap; } static Nested decode(Object message) { - final Map pigeonMap = message as Map; + final Map pigeonMap = message as Map; return Nested() ..request = pigeonMap['request'] != null - ? SearchRequest.decode(pigeonMap['request']) + ? SearchRequest.decode(pigeonMap['request']!) : null; } } abstract class FlutterSearchApi { SearchReply search(SearchRequest arg); - static void setup(FlutterSearchApi api) { + static void setup(FlutterSearchApi? api) { { - const BasicMessageChannel channel = BasicMessageChannel( + const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.FlutterSearchApi.search', StandardMessageCodec()); if (api == null) { channel.setMessageHandler(null); } else { - channel.setMessageHandler((Object message) async { + channel.setMessageHandler((Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.FlutterSearchApi.search was null. Expected SearchRequest.'); - final SearchRequest input = SearchRequest.decode(message); + final SearchRequest input = SearchRequest.decode(message!); final SearchReply output = api.search(input); return output.encode(); }); @@ -90,10 +90,10 @@ abstract class FlutterSearchApi { class NestedApi { Future search(Nested arg) async { final Object encoded = arg.encode(); - const BasicMessageChannel channel = BasicMessageChannel( + const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.NestedApi.search', StandardMessageCodec()); - final Map replyMap = - await channel.send(encoded) as Map; + final Map? replyMap = + await channel.send(encoded) as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', @@ -101,25 +101,25 @@ class NestedApi { details: null, ); } else if (replyMap['error'] != null) { - final Map error = - replyMap['error'] as Map; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( - code: error['code'] as String, - message: error['message'] as String, + code: (error['code'] as String?)!, + message: error['message'] as String?, details: error['details'], ); } else { - return SearchReply.decode(replyMap['result']); + return SearchReply.decode(replyMap['result']!); } } } class Api { Future initialize() async { - const BasicMessageChannel channel = BasicMessageChannel( + const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.Api.initialize', StandardMessageCodec()); - final Map replyMap = - await channel.send(null) as Map; + final Map? replyMap = + await channel.send(null) as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', @@ -127,11 +127,11 @@ class Api { details: null, ); } else if (replyMap['error'] != null) { - final Map error = - replyMap['error'] as Map; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( - code: error['code'] as String, - message: error['message'] as String, + code: (error['code'] as String?)!, + message: error['message'] as String?, details: error['details'], ); } else { @@ -141,10 +141,10 @@ class Api { Future search(SearchRequest arg) async { final Object encoded = arg.encode(); - const BasicMessageChannel channel = BasicMessageChannel( + const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.Api.search', StandardMessageCodec()); - final Map replyMap = - await channel.send(encoded) as Map; + final Map? replyMap = + await channel.send(encoded) as Map?; if (replyMap == null) { throw PlatformException( code: 'channel-error', @@ -152,15 +152,15 @@ class Api { details: null, ); } else if (replyMap['error'] != null) { - final Map error = - replyMap['error'] as Map; + final Map error = + (replyMap['error'] as Map?)!; throw PlatformException( - code: error['code'] as String, - message: error['message'] as String, + code: (error['code'] as String?)!, + message: error['message'] as String?, details: error['details'], ); } else { - return SearchReply.decode(replyMap['result']); + return SearchReply.decode(replyMap['result']!); } } } diff --git a/packages/pigeon/mock_handler_tester/test/test.dart b/packages/pigeon/mock_handler_tester/test/test.dart index 7c6ccf03de37..0d8e4c3ad52c 100644 --- a/packages/pigeon/mock_handler_tester/test/test.dart +++ b/packages/pigeon/mock_handler_tester/test/test.dart @@ -1,7 +1,7 @@ -// Autogenerated from Pigeon (v0.1.19), do not edit directly. +// Autogenerated from Pigeon (v0.2.0-nullsafety.0), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import -// @dart = 2.8 +// @dart = 2.12 import 'dart:async'; import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List; import 'package:flutter/services.dart'; @@ -11,19 +11,19 @@ import 'message.dart'; abstract class TestNestedApi { SearchReply search(Nested arg); - static void setup(TestNestedApi api) { + static void setup(TestNestedApi? api) { { - const BasicMessageChannel channel = BasicMessageChannel( + const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.NestedApi.search', StandardMessageCodec()); if (api == null) { channel.setMockMessageHandler(null); } else { - channel.setMockMessageHandler((Object message) async { + channel.setMockMessageHandler((Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.NestedApi.search was null. Expected Nested.'); - final Nested input = Nested.decode(message); + final Nested input = Nested.decode(message!); final SearchReply output = api.search(input); - return {'result': output.encode()}; + return {'result': output.encode()}; }); } } @@ -33,32 +33,32 @@ abstract class TestNestedApi { abstract class TestHostApi { void initialize(); SearchReply search(SearchRequest arg); - static void setup(TestHostApi api) { + static void setup(TestHostApi? api) { { - const BasicMessageChannel channel = BasicMessageChannel( + const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.Api.initialize', StandardMessageCodec()); if (api == null) { channel.setMockMessageHandler(null); } else { - channel.setMockMessageHandler((Object message) async { + channel.setMockMessageHandler((Object? message) async { // ignore message api.initialize(); - return {}; + return {}; }); } } { - const BasicMessageChannel channel = BasicMessageChannel( + const BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.Api.search', StandardMessageCodec()); if (api == null) { channel.setMockMessageHandler(null); } else { - channel.setMockMessageHandler((Object message) async { + channel.setMockMessageHandler((Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.Api.search was null. Expected SearchRequest.'); - final SearchRequest input = SearchRequest.decode(message); + final SearchRequest input = SearchRequest.decode(message!); final SearchReply output = api.search(input); - return {'result': output.encode()}; + return {'result': output.encode()}; }); } } diff --git a/packages/pigeon/mock_handler_tester/test/widget_test.dart b/packages/pigeon/mock_handler_tester/test/widget_test.dart index 4f6497c45b15..0334051cad4f 100644 --- a/packages/pigeon/mock_handler_tester/test/widget_test.dart +++ b/packages/pigeon/mock_handler_tester/test/widget_test.dart @@ -33,7 +33,7 @@ class MockNested implements TestNestedApi { if (arg.request == null) { return SearchReply(); } else { - return SearchReply()..result = arg.request.query; + return SearchReply()..result = arg.request?.query; } } } @@ -73,17 +73,17 @@ void main() { final Mock mock = Mock(); TestHostApi.setup(mock); expect( - await const BasicMessageChannel( + await const BasicMessageChannel( 'dev.flutter.pigeon.Api.initialize', StandardMessageCodec(), ).send(null), isEmpty, ); try { - await const BasicMessageChannel( + await const BasicMessageChannel( 'dev.flutter.pigeon.Api.search', StandardMessageCodec(), - ).send(null) as Map; + ).send(null) as Map?; expect(true, isFalse); // should not reach here } catch (error) { expect(error, isAssertionError); diff --git a/packages/pigeon/pigeons/all_datatypes.dart b/packages/pigeon/pigeons/all_datatypes.dart index 981f87cc10be..95a28863bc02 100644 --- a/packages/pigeon/pigeons/all_datatypes.dart +++ b/packages/pigeon/pigeons/all_datatypes.dart @@ -5,18 +5,18 @@ import 'package:pigeon/pigeon.dart'; class Everything { - bool aBool; - int anInt; - double aDouble; - String aString; - Uint8List aByteArray; - Int32List a4ByteArray; - Int64List a8ByteArray; - Float64List aFloatArray; + bool? aBool; + int? anInt; + double? aDouble; + String? aString; + Uint8List? aByteArray; + Int32List? a4ByteArray; + Int64List? a8ByteArray; + Float64List? aFloatArray; // ignore: always_specify_types - List aList; + List? aList; // ignore: always_specify_types - Map aMap; + Map? aMap; } @HostApi() diff --git a/packages/pigeon/pigeons/async_handlers.dart b/packages/pigeon/pigeons/async_handlers.dart index 8e86671ba4f4..67c439e7ae3a 100644 --- a/packages/pigeon/pigeons/async_handlers.dart +++ b/packages/pigeon/pigeons/async_handlers.dart @@ -5,7 +5,7 @@ import 'package:pigeon/pigeon.dart'; class Value { - int number; + int? number; } @HostApi() diff --git a/packages/pigeon/pigeons/host2flutter.dart b/packages/pigeon/pigeons/host2flutter.dart index 673ff56334f9..5a45975778b6 100644 --- a/packages/pigeon/pigeons/host2flutter.dart +++ b/packages/pigeon/pigeons/host2flutter.dart @@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:pigeon/objc_generator.dart'; import 'package:pigeon/pigeon.dart'; class SearchRequest { - String query; + String? query; } class SearchReply { - String result; + String? result; } @FlutterApi() @@ -18,5 +19,6 @@ abstract class Api { } void configurePigeon(PigeonOptions options) { - options.objcOptions.prefix = 'AC'; + options.objcOptions ??= ObjcOptions(); + options.objcOptions?.prefix = 'AC'; } diff --git a/packages/pigeon/pigeons/list.dart b/packages/pigeon/pigeons/list.dart index bed4a79227b9..e370ae80120c 100644 --- a/packages/pigeon/pigeons/list.dart +++ b/packages/pigeon/pigeons/list.dart @@ -6,7 +6,7 @@ import 'package:pigeon/pigeon.dart'; class TestMessage { // ignore: always_specify_types - List testList; + List? testList; } @HostApi() diff --git a/packages/pigeon/pigeons/message.dart b/packages/pigeon/pigeons/message.dart index 02b95840f638..449debff2fee 100644 --- a/packages/pigeon/pigeons/message.dart +++ b/packages/pigeon/pigeons/message.dart @@ -5,17 +5,19 @@ // This file is an example pigeon file that is used in compilation, unit, mock // handler, and e2e tests. +import 'package:pigeon/java_generator.dart'; +import 'package:pigeon/objc_generator.dart'; import 'package:pigeon/pigeon.dart'; class SearchRequest { - String query; - int anInt; - bool aBool; + String? query; + int? anInt; + bool? aBool; } class SearchReply { - String result; - String error; + String? result; + String? error; } @HostApi(dartHostTestHandler: 'TestHostApi') @@ -25,7 +27,7 @@ abstract class Api { } class Nested { - SearchRequest request; + SearchRequest? request; } @HostApi(dartHostTestHandler: 'TestNestedApi') @@ -34,8 +36,10 @@ abstract class NestedApi { } void configurePigeon(PigeonOptions options) { - options.objcOptions.prefix = 'AC'; - options.javaOptions.package = 'dev.flutter.aaclarke.pigeon'; + options.objcOptions ??= ObjcOptions(); + options.objcOptions?.prefix = 'AC'; + options.javaOptions ??= JavaOptions(className: 'Pigeon'); + options.javaOptions?.package = 'dev.flutter.aaclarke.pigeon'; } @FlutterApi() diff --git a/packages/pigeon/pigeons/void_arg_flutter.dart b/packages/pigeon/pigeons/void_arg_flutter.dart index 9886e0e10c0b..d6fbd5490865 100644 --- a/packages/pigeon/pigeons/void_arg_flutter.dart +++ b/packages/pigeon/pigeons/void_arg_flutter.dart @@ -5,7 +5,7 @@ import 'package:pigeon/pigeon.dart'; class Result { - int code; + int? code; } @FlutterApi() diff --git a/packages/pigeon/pigeons/void_arg_host.dart b/packages/pigeon/pigeons/void_arg_host.dart index 38229a08fa70..fec04ab930ea 100644 --- a/packages/pigeon/pigeons/void_arg_host.dart +++ b/packages/pigeon/pigeons/void_arg_host.dart @@ -5,7 +5,7 @@ import 'package:pigeon/pigeon.dart'; class Result { - int code; + int? code; } @HostApi() diff --git a/packages/pigeon/pigeons/voidflutter.dart b/packages/pigeon/pigeons/voidflutter.dart index 9606c210e8af..eb2faa946654 100644 --- a/packages/pigeon/pigeons/voidflutter.dart +++ b/packages/pigeon/pigeons/voidflutter.dart @@ -5,7 +5,7 @@ import 'package:pigeon/pigeon.dart'; class SetRequest { - int value; + int? value; } @FlutterApi() diff --git a/packages/pigeon/pigeons/voidhost.dart b/packages/pigeon/pigeons/voidhost.dart index ffd7f01c4db0..cdbbebda8d38 100644 --- a/packages/pigeon/pigeons/voidhost.dart +++ b/packages/pigeon/pigeons/voidhost.dart @@ -5,7 +5,7 @@ import 'package:pigeon/pigeon.dart'; class SetRequest { - int value; + int? value; } @HostApi() diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index 13a236945805..8d041a398865 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -1,11 +1,11 @@ name: pigeon -version: 0.1.24 # This must match the version in lib/generator_tools.dart +version: 0.2.0 # This must match the version in lib/generator_tools.dart description: Code generator tool to make communication between Flutter and the host platform type-safe and easier. homepage: https://github.com/flutter/packages/tree/master/packages/pigeon dependencies: - args: ^1.5.2 - path: ^1.6.4 + args: ^2.0.0 + path: ^1.8.0 dev_dependencies: test: ^1.11.1 environment: - sdk: '>=2.2.0 <3.0.0' + sdk: '>=2.12.0 <3.0.0' diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh index f370651fe812..ab4610e38d10 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -80,6 +80,7 @@ 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 @@ -151,7 +152,7 @@ fi pub get dart analyze bin dart analyze lib -dart --no-sound-null-safety test +dart test ############################################################################### # Execute without arguments test @@ -177,6 +178,7 @@ 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 @@ -253,6 +255,7 @@ 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 \ diff --git a/packages/pigeon/test/dart_generator_test.dart b/packages/pigeon/test/dart_generator_test.dart index 4f6fde4b71d0..6ef917238c9b 100644 --- a/packages/pigeon/test/dart_generator_test.dart +++ b/packages/pigeon/test/dart_generator_test.dart @@ -9,16 +9,19 @@ import 'package:test/test.dart'; void main() { test('gen one class', () { - final Class klass = Class() - ..name = 'Foobar' - ..fields = [ - Field() - ..name = 'field1' - ..dataType = 'dataType1' - ]; - final Root root = Root() - ..apis = [] - ..classes = [klass]; + final Class klass = Class( + name: 'Foobar', + fields: [ + Field( + name: 'field1', + dataType: 'dataType1', + ), + ], + ); + final Root root = Root( + apis: [], + classes: [klass], + ); final StringBuffer sink = StringBuffer(); generateDart(DartOptions(), root, sink); final String code = sink.toString(); @@ -72,7 +75,7 @@ void main() { ), ); expect( - code, + code.replaceAll('\n', ' ').replaceAll(' ', ''), contains( '..nested = pigeonMap[\'nested\'] != null ? Input.decode(pigeonMap[\'nested\']) : null;', ), @@ -244,16 +247,19 @@ void main() { }); test('opt out of nndb', () { - final Class klass = Class() - ..name = 'Foobar' - ..fields = [ - Field() - ..name = 'field1' - ..dataType = 'dataType1' - ]; - final Root root = Root() - ..apis = [] - ..classes = [klass]; + final Class klass = Class( + name: 'Foobar', + fields: [ + Field( + name: 'field1', + dataType: 'dataType1', + ), + ], + ); + final Root root = Root( + apis: [], + classes: [klass], + ); final StringBuffer sink = StringBuffer(); generateDart(DartOptions(), root, sink); final String code = sink.toString(); diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart index 398ca69ce05a..053049b3636a 100644 --- a/packages/pigeon/test/java_generator_test.dart +++ b/packages/pigeon/test/java_generator_test.dart @@ -8,19 +8,21 @@ import 'package:test/test.dart'; void main() { test('gen one class', () { - final Class klass = Class() - ..name = 'Foobar' - ..fields = [ - Field() - ..name = 'field1' - ..dataType = 'int' - ]; - final Root root = Root() - ..apis = [] - ..classes = [klass]; + final Class klass = Class( + name: 'Foobar', + fields: [ + Field( + name: 'field1', + dataType: 'int', + ), + ], + ); + final Root root = Root( + apis: [], + classes: [klass], + ); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public class Messages')); @@ -29,20 +31,22 @@ void main() { }); test('package', () { - final Class klass = Class() - ..name = 'Foobar' - ..fields = [ - Field() - ..name = 'field1' - ..dataType = 'int' - ]; - final Root root = Root() - ..apis = [] - ..classes = [klass]; + final Class klass = Class( + name: 'Foobar', + fields: [ + Field( + name: 'field1', + dataType: 'int', + ) + ], + ); + final Root root = Root( + apis: [], + classes: [klass], + ); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; - javaOptions.package = 'com.google.foobar'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages') + ..package = 'com.google.foobar'; generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('package com.google.foobar;')); @@ -68,8 +72,7 @@ void main() { fields: [Field(name: 'output', dataType: 'String')]) ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public interface Api')); @@ -92,8 +95,7 @@ void main() { ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('private Boolean aBool;')); @@ -125,8 +127,7 @@ void main() { fields: [Field(name: 'output', dataType: 'String')]) ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public static class Api')); @@ -149,8 +150,7 @@ void main() { fields: [Field(name: 'input', dataType: 'String')]), ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, isNot(matches('=.*doSomething'))); @@ -173,8 +173,7 @@ void main() { fields: [Field(name: 'input', dataType: 'String')]), ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('Reply')); @@ -198,8 +197,7 @@ void main() { fields: [Field(name: 'output', dataType: 'String')]), ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('Output doSomething()')); @@ -222,8 +220,7 @@ void main() { fields: [Field(name: 'output', dataType: 'String')]), ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('doSomething(Reply')); @@ -237,8 +234,7 @@ void main() { fields: [Field(name: 'field1', dataType: 'List')]), ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public static class Foobar')); @@ -252,8 +248,7 @@ void main() { fields: [Field(name: 'field1', dataType: 'Map')]), ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public static class Foobar')); @@ -261,26 +256,30 @@ void main() { }); test('gen nested', () { - final Class klass = Class() - ..name = 'Outer' - ..fields = [ - Field() - ..name = 'nested' - ..dataType = 'Nested' - ]; - final Class nestedClass = Class() - ..name = 'Nested' - ..fields = [ - Field() - ..name = 'data' - ..dataType = 'int' - ]; - final Root root = Root() - ..apis = [] - ..classes = [klass, nestedClass]; + final Class klass = Class( + name: 'Outer', + fields: [ + Field( + name: 'nested', + dataType: 'Nested', + ) + ], + ); + final Class nestedClass = Class( + name: 'Nested', + fields: [ + Field( + name: 'data', + dataType: 'int', + ) + ], + ); + final Root root = Root( + apis: [], + classes: [klass, nestedClass], + ); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public class Messages')); @@ -310,8 +309,7 @@ void main() { fields: [Field(name: 'output', dataType: 'String')]) ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public interface Api')); @@ -344,8 +342,7 @@ void main() { fields: [Field(name: 'output', dataType: 'String')]) ]); final StringBuffer sink = StringBuffer(); - final JavaOptions javaOptions = JavaOptions(); - javaOptions.className = 'Messages'; + final JavaOptions javaOptions = JavaOptions(className: 'Messages'); generateJava(javaOptions, root, sink); final String code = sink.toString(); expect(code, contains('public static class Api')); diff --git a/packages/pigeon/test/pigeon_lib_test.dart b/packages/pigeon/test/pigeon_lib_test.dart index 1ae31471614f..f92117d2eb60 100644 --- a/packages/pigeon/test/pigeon_lib_test.dart +++ b/packages/pigeon/test/pigeon_lib_test.dart @@ -7,11 +7,11 @@ import 'package:pigeon/pigeon_lib.dart'; import 'package:pigeon/ast.dart'; class Input1 { - String input; + String? input; } class Output1 { - String output; + String? output; } @HostApi() @@ -30,7 +30,7 @@ abstract class ApiTwoMethods { } class Nested { - Input1 input; + Input1? input; } @FlutterApi() @@ -54,11 +54,11 @@ abstract class ApiWithMockDartClass { } class OnlyVisibleFromNesting { - String foo; + String? foo; } class Nestor { - OnlyVisibleFromNesting nested; + OnlyVisibleFromNesting? nested; } @HostApi() @@ -92,7 +92,7 @@ void main() { test('parse args - java_package', () { final PigeonOptions opts = Pigeon.parseArgs(['--java_package', 'com.google.foo']); - expect(opts.javaOptions.package, equals('com.google.foo')); + expect(opts.javaOptions?.package, equals('com.google.foo')); }); test('parse args - input', () { @@ -126,8 +126,8 @@ void main() { expect(root.apis[0].methods[0].argType, equals('Input1')); expect(root.apis[0].methods[0].returnType, equals('Output1')); - Class input; - Class output; + Class? input; + Class? output; for (final Class klass in root.classes) { if (klass.name == 'Input1') { input = klass; @@ -138,13 +138,13 @@ void main() { expect(input, isNotNull); expect(output, isNotNull); - expect(input.fields.length, equals(1)); - expect(input.fields[0].name, equals('input')); - expect(input.fields[0].dataType, equals('String')); + expect(input?.fields.length, equals(1)); + expect(input?.fields[0].name, equals('input')); + expect(input?.fields[0].dataType, equals('String')); - expect(output.fields.length, equals(1)); - expect(output.fields[0].name, equals('output')); - expect(output.fields[0].dataType, equals('String')); + expect(output?.fields.length, equals(1)); + expect(output?.fields[0].name, equals('output')); + expect(output?.fields[0].dataType, equals('String')); }); test('invalid datatype', () { @@ -241,6 +241,6 @@ void main() { test('null safety flag', () { final PigeonOptions results = Pigeon.parseArgs(['--dart_null_safety']); - expect(results.dartOptions.isNullSafe, true); + expect(results.dartOptions?.isNullSafe, isTrue); }); } diff --git a/packages/pigeon/test/version_test.dart b/packages/pigeon/test/version_test.dart index a586856406af..1487b90b4e79 100644 --- a/packages/pigeon/test/version_test.dart +++ b/packages/pigeon/test/version_test.dart @@ -12,8 +12,8 @@ void main() { final String pubspecPath = '${Directory.current.path}/pubspec.yaml'; final String pubspec = File(pubspecPath).readAsStringSync(); final RegExp regex = RegExp(r'version:\s*(.*?) #'); - final RegExpMatch match = regex.firstMatch(pubspec); + final RegExpMatch? match = regex.firstMatch(pubspec); expect(match, isNotNull); - expect(pigeonVersion, match.group(1).trim()); + expect(pigeonVersion, match?.group(1)?.trim()); }); }