[pigeon] Adds SwiftFunction annotation (#2304)

* Add SwiftFunction annotation

* Bump version to 3.2.4

* Remove unused imports

* Improve methods map

* Remove unnecessary print

* Force cast match of SwiftFunction

* Update packages/pigeon/lib/pigeon_lib.dart

Co-authored-by: gaaclarke <30870216+gaaclarke@users.noreply.github.com>

* Improve documentation of function to parse method with SwiftFunction

* Fix some dartdocs

* gen

* analyze

* Improve SwiftFunction application

* Add type annotation

* format

* Run format

* Update macos Swift tests

* Bump version to 7.0.0

* revert version change

* Improve some code of SwiftGenerator

* Bump version to 6.1.0

* Improve echo functions for Swift

* Match order of parameters

* Documents _SwiftFunctionComponents.fromMethod and _SwiftFunctionArgument

* Improve doc comments

* Fix tests

* Fix SwiftFunction documentation

Co-authored-by: gaaclarke <30870216+gaaclarke@users.noreply.github.com>
Co-authored-by: tarrinneal <tarrinneal@gmail.com>
diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index 3fb82c7..94dff6c 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 7.1.0
+
+* Adds `@SwiftFunction` annotation for specifying custom swift function signature.
+
 ## 7.0.5
 
 * Requires analyzer 5.0.0 and replaces use of deprecated APIs.
diff --git a/packages/pigeon/lib/ast.dart b/packages/pigeon/lib/ast.dart
index 8da2b74..08ddcbd 100644
--- a/packages/pigeon/lib/ast.dart
+++ b/packages/pigeon/lib/ast.dart
@@ -32,6 +32,7 @@
     this.isAsynchronous = false,
     this.offset,
     this.objcSelector = '',
+    this.swiftFunction = '',
     this.taskQueueType = TaskQueueType.serial,
     this.documentationComments = const <String>[],
   });
@@ -54,6 +55,9 @@
   /// An override for the generated objc selector (ex. "divideNumber:by:").
   String objcSelector;
 
+  /// An override for the generated swift function signature (ex. "divideNumber(_:by:)").
+  String swiftFunction;
+
   /// Specifies how handlers are dispatched with respect to threading.
   TaskQueueType taskQueueType;
 
@@ -68,7 +72,9 @@
   String toString() {
     final String objcSelectorStr =
         objcSelector.isEmpty ? '' : ' objcSelector:$objcSelector';
-    return '(Method name:$name returnType:$returnType arguments:$arguments isAsynchronous:$isAsynchronous$objcSelectorStr documentationComments:$documentationComments)';
+    final String swiftFunctionStr =
+        swiftFunction.isEmpty ? '' : ' swiftFunction:$swiftFunction';
+    return '(Method name:$name returnType:$returnType arguments:$arguments isAsynchronous:$isAsynchronous$objcSelectorStr$swiftFunctionStr documentationComments:$documentationComments)';
   }
 }
 
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index ccc7326..2618648 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -11,7 +11,7 @@
 /// The current version of pigeon.
 ///
 /// This must match the version in pubspec.yaml.
-const String pigeonVersion = '7.0.5';
+const String pigeonVersion = '7.1.0';
 
 /// Read all the content from [stdin] to a String.
 String readStdin() {
diff --git a/packages/pigeon/lib/pigeon_lib.dart b/packages/pigeon/lib/pigeon_lib.dart
index cad4f5c..58fb6bb 100644
--- a/packages/pigeon/lib/pigeon_lib.dart
+++ b/packages/pigeon/lib/pigeon_lib.dart
@@ -100,6 +100,20 @@
   final String value;
 }
 
+/// Metadata to annotate methods to control the signature used for Swift output.
+///
+/// The number of components in the provided signature must match the number of
+/// arguments in the annotated method.
+/// For example:
+///   @SwiftFunction('divide(_:by:)') double divide(int x, String y);
+class SwiftFunction {
+  /// Constructor.
+  const SwiftFunction(this.value);
+
+  /// The string representation of the function signature.
+  final String value;
+}
+
 /// Type of TaskQueue which determines how handlers are dispatched for
 /// HostApi's.
 enum TaskQueueType {
@@ -724,6 +738,17 @@
           ));
         }
       }
+      if (method.swiftFunction.isNotEmpty) {
+        final RegExp signatureRegex =
+            RegExp('\\w+ *\\((\\w+:){${method.arguments.length}}\\)');
+        if (!signatureRegex.hasMatch(method.swiftFunction)) {
+          result.add(Error(
+            message:
+                'Invalid function signature, expected ${method.arguments.length} arguments.',
+            lineNumber: _calculateLineNumberNullable(source, method.offset),
+          ));
+        }
+      }
       if (method.taskQueueType != TaskQueueType.serial &&
           api.location != ApiLocation.host) {
         result.add(Error(
@@ -1026,6 +1051,13 @@
             .asNullable<dart_ast.SimpleStringLiteral>()
             ?.value ??
         '';
+    final String swiftFunction = _findMetadata(node.metadata, 'SwiftFunction')
+            ?.arguments
+            ?.arguments
+            .first
+            .asNullable<dart_ast.SimpleStringLiteral>()
+            ?.value ??
+        '';
     final dart_ast.ArgumentList? taskQueueArguments =
         _findMetadata(node.metadata, 'TaskQueue')?.arguments;
     final String? taskQueueTypeName = taskQueueArguments == null
@@ -1054,6 +1086,7 @@
           arguments: arguments,
           isAsynchronous: isAsynchronous,
           objcSelector: objcSelector,
+          swiftFunction: swiftFunction,
           offset: node.offset,
           taskQueueType: taskQueueType,
           documentationComments:
diff --git a/packages/pigeon/lib/swift_generator.dart b/packages/pigeon/lib/swift_generator.dart
index b0aa98d..6109b8d 100644
--- a/packages/pigeon/lib/swift_generator.dart
+++ b/packages/pigeon/lib/swift_generator.dart
@@ -294,6 +294,9 @@
         });
       }
       for (final Method func in api.methods) {
+        final _SwiftFunctionComponents components =
+            _SwiftFunctionComponents.fromMethod(func);
+
         final String channelName = makeChannelName(api, func);
         final String returnType = func.returnType.isVoid
             ? ''
@@ -309,8 +312,11 @@
         } else {
           final Iterable<String> argTypes = func.arguments
               .map((NamedType e) => _nullsafeSwiftTypeForDartType(e.type));
-          final Iterable<String> argLabels =
-              indexMap(func.arguments, _getArgumentName);
+          final Iterable<String> argLabels = indexMap(components.arguments,
+              (int index, _SwiftFunctionArgument argument) {
+            return argument.label ??
+                _getArgumentName(index, argument.namedType);
+          });
           final Iterable<String> argNames =
               indexMap(func.arguments, _getSafeArgumentName);
           sendArgument = '[${argNames.join(', ')}] as [Any?]';
@@ -322,10 +328,10 @@
                   '$label $name: $type').join(', ');
           if (func.returnType.isVoid) {
             indent.write(
-                'func ${func.name}($argsSignature, completion: @escaping () -> Void) ');
+                'func ${components.name}($argsSignature, completion: @escaping () -> Void) ');
           } else {
             indent.write(
-                'func ${func.name}($argsSignature, completion: @escaping ($returnType) -> Void) ');
+                'func ${components.name}($argsSignature, completion: @escaping ($returnType) -> Void) ');
           }
         }
         indent.addScoped('{', '}', () {
@@ -369,7 +375,6 @@
     if (isCustomCodec) {
       _writeCodec(indent, api, root);
     }
-
     const List<String> generatedComments = <String>[
       ' Generated protocol from Pigeon that represents a handler of messages from Flutter.'
     ];
@@ -379,17 +384,15 @@
     indent.write('protocol $apiName ');
     indent.addScoped('{', '}', () {
       for (final Method method in api.methods) {
-        final List<String> argSignature = <String>[];
-        if (method.arguments.isNotEmpty) {
-          final Iterable<String> argTypes = method.arguments
-              .map((NamedType e) => _nullsafeSwiftTypeForDartType(e.type));
-          final Iterable<String> argNames =
-              method.arguments.map((NamedType e) => e.name);
-          argSignature.addAll(
-              map2(argTypes, argNames, (String argType, String argName) {
-            return '$argName: $argType';
-          }));
-        }
+        final _SwiftFunctionComponents components =
+            _SwiftFunctionComponents.fromMethod(method);
+        final List<String> argSignature =
+            components.arguments.map((_SwiftFunctionArgument argument) {
+          final String? label = argument.label;
+          final String name = argument.name;
+          final String type = _nullsafeSwiftTypeForDartType(argument.type);
+          return '${label == null ? '' : '$label '}$name: $type';
+        }).toList();
 
         final String returnType = method.returnType.isVoid
             ? ''
@@ -399,12 +402,12 @@
 
         if (method.isAsynchronous) {
           argSignature.add('completion: @escaping ($returnType) -> Void');
-          indent.writeln('func ${method.name}(${argSignature.join(', ')})');
+          indent.writeln('func ${components.name}(${argSignature.join(', ')})');
         } else if (method.returnType.isVoid) {
-          indent.writeln('func ${method.name}(${argSignature.join(', ')})');
+          indent.writeln('func ${components.name}(${argSignature.join(', ')})');
         } else {
           indent.writeln(
-              'func ${method.name}(${argSignature.join(', ')}) -> $returnType');
+              'func ${components.name}(${argSignature.join(', ')}) -> $returnType');
         }
       }
     });
@@ -428,6 +431,9 @@
           'static func setUp(binaryMessenger: FlutterBinaryMessenger, api: $apiName?) ');
       indent.addScoped('{', '}', () {
         for (final Method method in api.methods) {
+          final _SwiftFunctionComponents components =
+              _SwiftFunctionComponents.fromMethod(method);
+
           final String channelName = makeChannelName(api, method);
           final String varChannelName = '${method.name}Channel';
           addDocumentationComments(
@@ -442,18 +448,25 @@
                 method.arguments.isNotEmpty ? 'message' : '_';
             indent.addScoped('{ $messageVarName, reply in', '}', () {
               final List<String> methodArgument = <String>[];
-              if (method.arguments.isNotEmpty) {
+              if (components.arguments.isNotEmpty) {
                 indent.writeln('let args = message as! [Any?]');
-                enumerate(method.arguments, (int index, NamedType arg) {
-                  final String argName = _getSafeArgumentName(index, arg);
+                enumerate(components.arguments,
+                    (int index, _SwiftFunctionArgument arg) {
+                  final String argName =
+                      _getSafeArgumentName(index, arg.namedType);
                   final String argIndex = 'args[$index]';
                   indent.writeln(
                       'let $argName = ${_castForceUnwrap(argIndex, arg.type, root)}');
-                  methodArgument.add('${arg.name}: $argName');
+
+                  if (arg.label == '_') {
+                    methodArgument.add(argName);
+                  } else {
+                    methodArgument.add('${arg.label ?? arg.name}: $argName');
+                  }
                 });
               }
               final String call =
-                  'api.${method.name}(${methodArgument.join(', ')})';
+                  'api.${components.name}(${methodArgument.join(', ')})';
               if (method.isAsynchronous) {
                 indent.write('$call ');
                 if (method.returnType.isVoid) {
@@ -695,3 +708,87 @@
   final String nullSafe = type.isNullable ? '?' : '';
   return '${_swiftTypeForDartType(type)}$nullSafe';
 }
+
+/// A class that represents a Swift function argument.
+///
+/// The [name] is the name of the argument.
+/// The [type] is the type of the argument.
+/// The [namedType] is the [NamedType] that this argument is generated from.
+/// The [label] is the label of the argument.
+class _SwiftFunctionArgument {
+  _SwiftFunctionArgument({
+    required this.name,
+    required this.type,
+    required this.namedType,
+    this.label,
+  });
+
+  final String name;
+  final TypeDeclaration type;
+  final NamedType namedType;
+  final String? label;
+}
+
+/// A class that represents a Swift function signature.
+///
+/// The [name] is the name of the function.
+/// The [arguments] are the arguments of the function.
+/// The [returnType] is the return type of the function.
+/// The [method] is the method that this function signature is generated from.
+class _SwiftFunctionComponents {
+  _SwiftFunctionComponents._({
+    required this.name,
+    required this.arguments,
+    required this.returnType,
+    required this.method,
+  });
+
+  /// Constructor that generates a [_SwiftFunctionComponents] from a [Method].
+  factory _SwiftFunctionComponents.fromMethod(Method method) {
+    if (method.swiftFunction.isEmpty) {
+      return _SwiftFunctionComponents._(
+        name: method.name,
+        returnType: method.returnType,
+        arguments: method.arguments
+            .map((NamedType field) => _SwiftFunctionArgument(
+                  name: field.name,
+                  type: field.type,
+                  namedType: field,
+                ))
+            .toList(),
+        method: method,
+      );
+    }
+
+    final String argsExtractor =
+        repeat(r'(\w+):', method.arguments.length).join();
+    final RegExp signatureRegex = RegExp(r'(\w+) *\(' + argsExtractor + r'\)');
+    final RegExpMatch match = signatureRegex.firstMatch(method.swiftFunction)!;
+
+    final Iterable<String> labels = match
+        .groups(List<int>.generate(
+            method.arguments.length, (int index) => index + 2))
+        .whereType();
+
+    return _SwiftFunctionComponents._(
+      name: match.group(1)!,
+      returnType: method.returnType,
+      arguments: map2(
+        method.arguments,
+        labels,
+        (NamedType field, String label) => _SwiftFunctionArgument(
+          name: field.name,
+          label: label == field.name ? null : label,
+          type: field.type,
+          namedType: field,
+        ),
+      ).toList(),
+      method: method,
+    );
+  }
+
+  final String name;
+  final List<_SwiftFunctionArgument> arguments;
+  final TypeDeclaration returnType;
+  final Method method;
+}
diff --git a/packages/pigeon/pigeons/core_tests.dart b/packages/pigeon/pigeons/core_tests.dart
index 890e7d6..fe1cb9b 100644
--- a/packages/pigeon/pigeons/core_tests.dart
+++ b/packages/pigeon/pigeons/core_tests.dart
@@ -96,10 +96,12 @@
 
   /// Returns the passed object, to test serialization and deserialization.
   @ObjCSelector('echoAllTypes:')
+  @SwiftFunction('echo(_:)')
   AllTypes echoAllTypes(AllTypes everything);
 
   /// Returns the passed object, to test serialization and deserialization.
   @ObjCSelector('echoAllNullableTypes:')
+  @SwiftFunction('echo(_:)')
   AllNullableTypes? echoAllNullableTypes(AllNullableTypes? everything);
 
   /// Returns an error, to test error handling.
@@ -107,26 +109,32 @@
 
   /// Returns passed in int.
   @ObjCSelector('echoInt:')
+  @SwiftFunction('echo(_:)')
   int echoInt(int anInt);
 
   /// Returns passed in double.
   @ObjCSelector('echoDouble:')
+  @SwiftFunction('echo(_:)')
   double echoDouble(double aDouble);
 
   /// Returns the passed in boolean.
   @ObjCSelector('echoBool:')
+  @SwiftFunction('echo(_:)')
   bool echoBool(bool aBool);
 
   /// Returns the passed in string.
   @ObjCSelector('echoString:')
+  @SwiftFunction('echo(_:)')
   String echoString(String aString);
 
   /// Returns the passed in Uint8List.
   @ObjCSelector('echoUint8List:')
+  @SwiftFunction('echo(_:)')
   Uint8List echoUint8List(Uint8List aUint8List);
 
   /// Returns the passed in generic Object.
   @ObjCSelector('echoObject:')
+  @SwiftFunction('echo(_:)')
   Object echoObject(Object anObject);
 
   // ========== Syncronous nullable method tests ==========
@@ -134,40 +142,49 @@
   /// Returns the inner `aString` value from the wrapped object, to test
   /// sending of nested objects.
   @ObjCSelector('extractNestedNullableStringFrom:')
+  @SwiftFunction('extractNestedNullableString(from:)')
   String? extractNestedNullableString(AllNullableTypesWrapper wrapper);
 
   /// Returns the inner `aString` value from the wrapped object, to test
   /// sending of nested objects.
   @ObjCSelector('createNestedObjectWithNullableString:')
+  @SwiftFunction('createNestedObject(with:)')
   AllNullableTypesWrapper createNestedNullableString(String? nullableString);
 
   /// Returns passed in arguments of multiple types.
   @ObjCSelector('sendMultipleNullableTypesABool:anInt:aString:')
+  @SwiftFunction('sendMultipleNullableTypes(aBool:anInt:aString:)')
   AllNullableTypes sendMultipleNullableTypes(
       bool? aNullableBool, int? aNullableInt, String? aNullableString);
 
   /// Returns passed in int.
   @ObjCSelector('echoNullableInt:')
+  @SwiftFunction('echo(_:)')
   int? echoNullableInt(int? aNullableInt);
 
   /// Returns passed in double.
   @ObjCSelector('echoNullableDouble:')
+  @SwiftFunction('echo(_:)')
   double? echoNullableDouble(double? aNullableDouble);
 
   /// Returns the passed in boolean.
   @ObjCSelector('echoNullableBool:')
+  @SwiftFunction('echo(_:)')
   bool? echoNullableBool(bool? aNullableBool);
 
   /// Returns the passed in string.
   @ObjCSelector('echoNullableString:')
+  @SwiftFunction('echo(_:)')
   String? echoNullableString(String? aNullableString);
 
   /// Returns the passed in Uint8List.
   @ObjCSelector('echoNullableUint8List:')
+  @SwiftFunction('echo(_:)')
   Uint8List? echoNullableUint8List(Uint8List? aNullableUint8List);
 
   /// Returns the passed in generic Object.
   @ObjCSelector('echoNullableObject:')
+  @SwiftFunction('echo(_:)')
   Object? echoNullableObject(Object? aNullableObject);
 
   // ========== Asyncronous method tests ==========
@@ -180,6 +197,7 @@
   /// Returns the passed string asynchronously.
   @async
   @ObjCSelector('echoAsyncString:')
+  @SwiftFunction('echoAsync(_:)')
   String echoAsyncString(String aString);
 
   // ========== Flutter API test wrappers ==========
@@ -189,6 +207,7 @@
 
   @async
   @ObjCSelector('callFlutterEchoAllTypes:')
+  @SwiftFunction('callFlutterEcho(_:)')
   AllTypes callFlutterEchoAllTypes(AllTypes everything);
 
   // TODO(stuartmorgan): Add callFlutterEchoAllNullableTypes and the associated
@@ -198,63 +217,78 @@
 
   @async
   @ObjCSelector('callFlutterSendMultipleNullableTypesABool:anInt:aString:')
+  @SwiftFunction('callFlutterSendMultipleNullableTypes(aBool:anInt:aString:)')
   AllNullableTypes callFlutterSendMultipleNullableTypes(
       bool? aNullableBool, int? aNullableInt, String? aNullableString);
 
   @async
   @ObjCSelector('callFlutterEchoBool:')
+  @SwiftFunction('callFlutterEcho(_:)')
   bool callFlutterEchoBool(bool aBool);
 
   @async
   @ObjCSelector('callFlutterEchoInt:')
+  @SwiftFunction('callFlutterEcho(_:)')
   int callFlutterEchoInt(int anInt);
 
   @async
   @ObjCSelector('callFlutterEchoDouble:')
+  @SwiftFunction('callFlutterEcho(_:)')
   double callFlutterEchoDouble(double aDouble);
 
   @async
   @ObjCSelector('callFlutterEchoString:')
+  @SwiftFunction('callFlutterEcho(_:)')
   String callFlutterEchoString(String aString);
 
   @async
   @ObjCSelector('callFlutterEchoUint8List:')
+  @SwiftFunction('callFlutterEcho(_:)')
   Uint8List callFlutterEchoUint8List(Uint8List aList);
 
   @async
   @ObjCSelector('callFlutterEchoList:')
+  @SwiftFunction('callFlutterEcho(_:)')
   List<Object?> callFlutterEchoList(List<Object?> aList);
 
   @async
   @ObjCSelector('callFlutterEchoMap:')
+  @SwiftFunction('callFlutterEcho(_:)')
   Map<String?, Object?> callFlutterEchoMap(Map<String?, Object?> aMap);
 
   @async
   @ObjCSelector('callFlutterEchoNullableBool:')
+  @SwiftFunction('callFlutterEchoNullable(_:)')
   bool? callFlutterEchoNullableBool(bool? aBool);
 
   @async
   @ObjCSelector('callFlutterEchoNullableInt:')
+  @SwiftFunction('callFlutterEchoNullable(_:)')
   int? callFlutterEchoNullableInt(int? anInt);
 
   @async
   @ObjCSelector('callFlutterEchoNullableDouble:')
+  @SwiftFunction('callFlutterEchoNullable(_:)')
   double? callFlutterEchoNullableDouble(double? aDouble);
 
   @async
   @ObjCSelector('callFlutterEchoNullableString:')
+  @SwiftFunction('callFlutterEchoNullable(_:)')
   String? callFlutterEchoNullableString(String? aString);
 
   @async
   @ObjCSelector('callFlutterEchoNullableUint8List:')
+  @SwiftFunction('callFlutterEchoNullable(_:)')
   Uint8List? callFlutterEchoNullableUint8List(Uint8List? aList);
 
   @async
   @ObjCSelector('callFlutterEchoNullableList:')
+  @SwiftFunction('callFlutterEchoNullable(_:)')
   List<Object?>? callFlutterEchoNullableList(List<Object?>? aList);
 
   @async
   @ObjCSelector('callFlutterEchoNullableMap:')
+  @SwiftFunction('callFlutterEchoNullable(_:)')
   Map<String?, Object?>? callFlutterEchoNullableMap(
       Map<String?, Object?>? aMap);
 }
@@ -269,16 +303,19 @@
 
   /// Returns the passed object, to test serialization and deserialization.
   @ObjCSelector('echoAllTypes:')
+  @SwiftFunction('echo(_:)')
   AllTypes echoAllTypes(AllTypes everything);
 
   /// Returns the passed object, to test serialization and deserialization.
   @ObjCSelector('echoAllNullableTypes:')
+  @SwiftFunction('echoNullable(_:)')
   AllNullableTypes echoAllNullableTypes(AllNullableTypes everything);
 
   /// Returns passed in arguments of multiple types.
   ///
   /// Tests multiple-arity FlutterApi handling.
   @ObjCSelector('sendMultipleNullableTypesABool:anInt:aString:')
+  @SwiftFunction('sendMultipleNullableTypes(aBool:anInt:aString:)')
   AllNullableTypes sendMultipleNullableTypes(
       bool? aNullableBool, int? aNullableInt, String? aNullableString);
 
@@ -286,60 +323,74 @@
 
   /// Returns the passed boolean, to test serialization and deserialization.
   @ObjCSelector('echoBool:')
+  @SwiftFunction('echo(_:)')
   bool echoBool(bool aBool);
 
   /// Returns the passed int, to test serialization and deserialization.
   @ObjCSelector('echoInt:')
+  @SwiftFunction('echo(_:)')
   int echoInt(int anInt);
 
   /// Returns the passed double, to test serialization and deserialization.
   @ObjCSelector('echoDouble:')
+  @SwiftFunction('echo(_:)')
   double echoDouble(double aDouble);
 
   /// Returns the passed string, to test serialization and deserialization.
   @ObjCSelector('echoString:')
+  @SwiftFunction('echo(_:)')
   String echoString(String aString);
 
   /// Returns the passed byte list, to test serialization and deserialization.
   @ObjCSelector('echoUint8List:')
+  @SwiftFunction('echo(_:)')
   Uint8List echoUint8List(Uint8List aList);
 
   /// Returns the passed list, to test serialization and deserialization.
   @ObjCSelector('echoList:')
+  @SwiftFunction('echo(_:)')
   List<Object?> echoList(List<Object?> aList);
 
   /// Returns the passed map, to test serialization and deserialization.
   @ObjCSelector('echoMap:')
+  @SwiftFunction('echo(_:)')
   Map<String?, Object?> echoMap(Map<String?, Object?> aMap);
 
   // ========== Nullable argument/return type tests ==========
 
   /// Returns the passed boolean, to test serialization and deserialization.
   @ObjCSelector('echoNullableBool:')
+  @SwiftFunction('echoNullable(_:)')
   bool? echoNullableBool(bool? aBool);
 
   /// Returns the passed int, to test serialization and deserialization.
   @ObjCSelector('echoNullableInt:')
+  @SwiftFunction('echoNullable(_:)')
   int? echoNullableInt(int? anInt);
 
   /// Returns the passed double, to test serialization and deserialization.
   @ObjCSelector('echoNullableDouble:')
+  @SwiftFunction('echoNullable(_:)')
   double? echoNullableDouble(double? aDouble);
 
   /// Returns the passed string, to test serialization and deserialization.
   @ObjCSelector('echoNullableString:')
+  @SwiftFunction('echoNullable(_:)')
   String? echoNullableString(String? aString);
 
   /// Returns the passed byte list, to test serialization and deserialization.
   @ObjCSelector('echoNullableUint8List:')
+  @SwiftFunction('echoNullable(_:)')
   Uint8List? echoNullableUint8List(Uint8List? aList);
 
   /// Returns the passed list, to test serialization and deserialization.
   @ObjCSelector('echoNullableList:')
+  @SwiftFunction('echoNullable(_:)')
   List<Object?>? echoNullableList(List<Object?>? aList);
 
   /// Returns the passed map, to test serialization and deserialization.
   @ObjCSelector('echoNullableMap:')
+  @SwiftFunction('echoNullable(_:)')
   Map<String?, Object?>? echoNullableMap(Map<String?, Object?>? aMap);
 }
 
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 7e4d7ae..6f031f3 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 package com.example.alternate_language_test_plugin;
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 b7001f4..76982b5 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import <Foundation/Foundation.h>
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m
index cae5ac3..ad54c14 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "CoreTests.gen.h"
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 6fb1023..1768c37 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.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, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import
 
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 d4eaaef..ef56298 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 // 
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 package com.example.test_plugin
diff --git a/packages/pigeon/platform_tests/test_plugin/example/ios/RunnerTests/AllDatatypesTests.swift b/packages/pigeon/platform_tests/test_plugin/example/ios/RunnerTests/AllDatatypesTests.swift
index 4d35aff..08b9b3b 100644
--- a/packages/pigeon/platform_tests/test_plugin/example/ios/RunnerTests/AllDatatypesTests.swift
+++ b/packages/pigeon/platform_tests/test_plugin/example/ios/RunnerTests/AllDatatypesTests.swift
@@ -15,7 +15,7 @@
 
     let expectation = XCTestExpectation(description: "callback")
 
-    api.echoAllNullableTypes(everything: everything) { result in
+    api.echoNullable(everything) { result in
       XCTAssertNil(result.aNullableBool)
       XCTAssertNil(result.aNullableInt)
       XCTAssertNil(result.aNullableDouble)
@@ -57,7 +57,7 @@
 
     let expectation = XCTestExpectation(description: "callback")
 
-    api.echoAllNullableTypes(everything: everything) { result in
+    api.echoNullable(everything) { result in
       XCTAssertEqual(result.aNullableBool, everything.aNullableBool)
       XCTAssertEqual(result.aNullableInt, everything.aNullableInt)
       XCTAssertEqual(result.aNullableDouble, everything.aNullableDouble)
diff --git a/packages/pigeon/platform_tests/test_plugin/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/RunnerTests.xcscheme b/packages/pigeon/platform_tests/test_plugin/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/RunnerTests.xcscheme
new file mode 100644
index 0000000..720178f
--- /dev/null
+++ b/packages/pigeon/platform_tests/test_plugin/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/RunnerTests.xcscheme
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1420"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO"
+            parallelizable = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "33A341DA291ED36900D34E0F"
+               BuildableName = "RunnerTests.xctest"
+               BlueprintName = "RunnerTests"
+               ReferencedContainer = "container:Runner.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
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 d33a26c..0f33912 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 // 
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 import Foundation
@@ -238,65 +238,65 @@
   /// test basic calling.
   func noop()
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllTypes(everything: AllTypes) -> AllTypes
+  func echo(_ everything: AllTypes) -> AllTypes
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllNullableTypes(everything: AllNullableTypes?) -> AllNullableTypes?
+  func echo(_ everything: AllNullableTypes?) -> AllNullableTypes?
   /// Returns an error, to test error handling.
   func throwError()
   /// Returns passed in int.
-  func echoInt(anInt: Int32) -> Int32
+  func echo(_ anInt: Int32) -> Int32
   /// Returns passed in double.
-  func echoDouble(aDouble: Double) -> Double
+  func echo(_ aDouble: Double) -> Double
   /// Returns the passed in boolean.
-  func echoBool(aBool: Bool) -> Bool
+  func echo(_ aBool: Bool) -> Bool
   /// Returns the passed in string.
-  func echoString(aString: String) -> String
+  func echo(_ aString: String) -> String
   /// Returns the passed in Uint8List.
-  func echoUint8List(aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData
+  func echo(_ aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData
   /// Returns the passed in generic Object.
-  func echoObject(anObject: Any) -> Any
+  func echo(_ anObject: Any) -> Any
   /// Returns the inner `aString` value from the wrapped object, to test
   /// sending of nested objects.
-  func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String?
+  func extractNestedNullableString(from wrapper: AllNullableTypesWrapper) -> String?
   /// Returns the inner `aString` value from the wrapped object, to test
   /// sending of nested objects.
-  func createNestedNullableString(nullableString: String?) -> AllNullableTypesWrapper
+  func createNestedObject(with nullableString: String?) -> AllNullableTypesWrapper
   /// Returns passed in arguments of multiple types.
-  func sendMultipleNullableTypes(aNullableBool: Bool?, aNullableInt: Int32?, aNullableString: String?) -> AllNullableTypes
+  func sendMultipleNullableTypes(aBool aNullableBool: Bool?, anInt aNullableInt: Int32?, aString aNullableString: String?) -> AllNullableTypes
   /// Returns passed in int.
-  func echoNullableInt(aNullableInt: Int32?) -> Int32?
+  func echo(_ aNullableInt: Int32?) -> Int32?
   /// Returns passed in double.
-  func echoNullableDouble(aNullableDouble: Double?) -> Double?
+  func echo(_ aNullableDouble: Double?) -> Double?
   /// Returns the passed in boolean.
-  func echoNullableBool(aNullableBool: Bool?) -> Bool?
+  func echo(_ aNullableBool: Bool?) -> Bool?
   /// Returns the passed in string.
-  func echoNullableString(aNullableString: String?) -> String?
+  func echo(_ aNullableString: String?) -> String?
   /// Returns the passed in Uint8List.
-  func echoNullableUint8List(aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData?
+  func echo(_ aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData?
   /// Returns the passed in generic Object.
-  func echoNullableObject(aNullableObject: Any?) -> Any?
+  func echo(_ aNullableObject: Any?) -> Any?
   /// A no-op function taking no arguments and returning no value, to sanity
   /// test basic asynchronous calling.
   func noopAsync(completion: @escaping () -> Void)
   /// Returns the passed string asynchronously.
-  func echoAsyncString(aString: String, completion: @escaping (String) -> Void)
+  func echoAsync(_ aString: String, completion: @escaping (String) -> Void)
   func callFlutterNoop(completion: @escaping () -> Void)
-  func callFlutterEchoAllTypes(everything: AllTypes, completion: @escaping (AllTypes) -> Void)
-  func callFlutterSendMultipleNullableTypes(aNullableBool: Bool?, aNullableInt: Int32?, aNullableString: String?, completion: @escaping (AllNullableTypes) -> Void)
-  func callFlutterEchoBool(aBool: Bool, completion: @escaping (Bool) -> Void)
-  func callFlutterEchoInt(anInt: Int32, completion: @escaping (Int32) -> Void)
-  func callFlutterEchoDouble(aDouble: Double, completion: @escaping (Double) -> Void)
-  func callFlutterEchoString(aString: String, completion: @escaping (String) -> Void)
-  func callFlutterEchoUint8List(aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void)
-  func callFlutterEchoList(aList: [Any?], completion: @escaping ([Any?]) -> Void)
-  func callFlutterEchoMap(aMap: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void)
-  func callFlutterEchoNullableBool(aBool: Bool?, completion: @escaping (Bool?) -> Void)
-  func callFlutterEchoNullableInt(anInt: Int32?, completion: @escaping (Int32?) -> Void)
-  func callFlutterEchoNullableDouble(aDouble: Double?, completion: @escaping (Double?) -> Void)
-  func callFlutterEchoNullableString(aString: String?, completion: @escaping (String?) -> Void)
-  func callFlutterEchoNullableUint8List(aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void)
-  func callFlutterEchoNullableList(aList: [Any?]?, completion: @escaping ([Any?]?) -> Void)
-  func callFlutterEchoNullableMap(aMap: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void)
+  func callFlutterEcho(_ everything: AllTypes, completion: @escaping (AllTypes) -> Void)
+  func callFlutterSendMultipleNullableTypes(aBool aNullableBool: Bool?, anInt aNullableInt: Int32?, aString aNullableString: String?, completion: @escaping (AllNullableTypes) -> Void)
+  func callFlutterEcho(_ aBool: Bool, completion: @escaping (Bool) -> Void)
+  func callFlutterEcho(_ anInt: Int32, completion: @escaping (Int32) -> Void)
+  func callFlutterEcho(_ aDouble: Double, completion: @escaping (Double) -> Void)
+  func callFlutterEcho(_ aString: String, completion: @escaping (String) -> Void)
+  func callFlutterEcho(_ aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void)
+  func callFlutterEcho(_ aList: [Any?], completion: @escaping ([Any?]) -> Void)
+  func callFlutterEcho(_ aMap: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void)
+  func callFlutterEchoNullable(_ aBool: Bool?, completion: @escaping (Bool?) -> Void)
+  func callFlutterEchoNullable(_ anInt: Int32?, completion: @escaping (Int32?) -> Void)
+  func callFlutterEchoNullable(_ aDouble: Double?, completion: @escaping (Double?) -> Void)
+  func callFlutterEchoNullable(_ aString: String?, completion: @escaping (String?) -> Void)
+  func callFlutterEchoNullable(_ aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void)
+  func callFlutterEchoNullable(_ aList: [Any?]?, completion: @escaping ([Any?]?) -> Void)
+  func callFlutterEchoNullable(_ aMap: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void)
 }
 
 /// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
@@ -322,7 +322,7 @@
       echoAllTypesChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let everythingArg = args[0] as! AllTypes
-        let result = api.echoAllTypes(everything: everythingArg)
+        let result = api.echo(everythingArg)
         reply(wrapResult(result))
       }
     } else {
@@ -334,7 +334,7 @@
       echoAllNullableTypesChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let everythingArg = args[0] as? AllNullableTypes
-        let result = api.echoAllNullableTypes(everything: everythingArg)
+        let result = api.echo(everythingArg)
         reply(wrapResult(result))
       }
     } else {
@@ -356,7 +356,7 @@
       echoIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anIntArg = args[0] as! Int32
-        let result = api.echoInt(anInt: anIntArg)
+        let result = api.echo(anIntArg)
         reply(wrapResult(result))
       }
     } else {
@@ -368,7 +368,7 @@
       echoDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aDoubleArg = args[0] as! Double
-        let result = api.echoDouble(aDouble: aDoubleArg)
+        let result = api.echo(aDoubleArg)
         reply(wrapResult(result))
       }
     } else {
@@ -380,7 +380,7 @@
       echoBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aBoolArg = args[0] as! Bool
-        let result = api.echoBool(aBool: aBoolArg)
+        let result = api.echo(aBoolArg)
         reply(wrapResult(result))
       }
     } else {
@@ -392,7 +392,7 @@
       echoStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as! String
-        let result = api.echoString(aString: aStringArg)
+        let result = api.echo(aStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -404,7 +404,7 @@
       echoUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aUint8ListArg = args[0] as! FlutterStandardTypedData
-        let result = api.echoUint8List(aUint8List: aUint8ListArg)
+        let result = api.echo(aUint8ListArg)
         reply(wrapResult(result))
       }
     } else {
@@ -416,7 +416,7 @@
       echoObjectChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anObjectArg = args[0]!
-        let result = api.echoObject(anObject: anObjectArg)
+        let result = api.echo(anObjectArg)
         reply(wrapResult(result))
       }
     } else {
@@ -429,7 +429,7 @@
       extractNestedNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let wrapperArg = args[0] as! AllNullableTypesWrapper
-        let result = api.extractNestedNullableString(wrapper: wrapperArg)
+        let result = api.extractNestedNullableString(from: wrapperArg)
         reply(wrapResult(result))
       }
     } else {
@@ -442,7 +442,7 @@
       createNestedNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let nullableStringArg = args[0] as? String
-        let result = api.createNestedNullableString(nullableString: nullableStringArg)
+        let result = api.createNestedObject(with: nullableStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -456,7 +456,7 @@
         let aNullableBoolArg = args[0] as? Bool
         let aNullableIntArg = args[1] as? Int32
         let aNullableStringArg = args[2] as? String
-        let result = api.sendMultipleNullableTypes(aNullableBool: aNullableBoolArg, aNullableInt: aNullableIntArg, aNullableString: aNullableStringArg)
+        let result = api.sendMultipleNullableTypes(aBool: aNullableBoolArg, anInt: aNullableIntArg, aString: aNullableStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -468,7 +468,7 @@
       echoNullableIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableIntArg = args[0] as? Int32
-        let result = api.echoNullableInt(aNullableInt: aNullableIntArg)
+        let result = api.echo(aNullableIntArg)
         reply(wrapResult(result))
       }
     } else {
@@ -480,7 +480,7 @@
       echoNullableDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableDoubleArg = args[0] as? Double
-        let result = api.echoNullableDouble(aNullableDouble: aNullableDoubleArg)
+        let result = api.echo(aNullableDoubleArg)
         reply(wrapResult(result))
       }
     } else {
@@ -492,7 +492,7 @@
       echoNullableBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableBoolArg = args[0] as? Bool
-        let result = api.echoNullableBool(aNullableBool: aNullableBoolArg)
+        let result = api.echo(aNullableBoolArg)
         reply(wrapResult(result))
       }
     } else {
@@ -504,7 +504,7 @@
       echoNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableStringArg = args[0] as? String
-        let result = api.echoNullableString(aNullableString: aNullableStringArg)
+        let result = api.echo(aNullableStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -516,7 +516,7 @@
       echoNullableUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableUint8ListArg = args[0] as? FlutterStandardTypedData
-        let result = api.echoNullableUint8List(aNullableUint8List: aNullableUint8ListArg)
+        let result = api.echo(aNullableUint8ListArg)
         reply(wrapResult(result))
       }
     } else {
@@ -528,7 +528,7 @@
       echoNullableObjectChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableObjectArg = args[0]
-        let result = api.echoNullableObject(aNullableObject: aNullableObjectArg)
+        let result = api.echo(aNullableObjectArg)
         reply(wrapResult(result))
       }
     } else {
@@ -552,7 +552,7 @@
       echoAsyncStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as! String
-        api.echoAsyncString(aString: aStringArg) { result in
+        api.echoAsync(aStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -574,7 +574,7 @@
       callFlutterEchoAllTypesChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let everythingArg = args[0] as! AllTypes
-        api.callFlutterEchoAllTypes(everything: everythingArg) { result in
+        api.callFlutterEcho(everythingArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -588,7 +588,7 @@
         let aNullableBoolArg = args[0] as? Bool
         let aNullableIntArg = args[1] as? Int32
         let aNullableStringArg = args[2] as? String
-        api.callFlutterSendMultipleNullableTypes(aNullableBool: aNullableBoolArg, aNullableInt: aNullableIntArg, aNullableString: aNullableStringArg) { result in
+        api.callFlutterSendMultipleNullableTypes(aBool: aNullableBoolArg, anInt: aNullableIntArg, aString: aNullableStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -600,7 +600,7 @@
       callFlutterEchoBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aBoolArg = args[0] as! Bool
-        api.callFlutterEchoBool(aBool: aBoolArg) { result in
+        api.callFlutterEcho(aBoolArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -612,7 +612,7 @@
       callFlutterEchoIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anIntArg = args[0] as! Int32
-        api.callFlutterEchoInt(anInt: anIntArg) { result in
+        api.callFlutterEcho(anIntArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -624,7 +624,7 @@
       callFlutterEchoDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aDoubleArg = args[0] as! Double
-        api.callFlutterEchoDouble(aDouble: aDoubleArg) { result in
+        api.callFlutterEcho(aDoubleArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -636,7 +636,7 @@
       callFlutterEchoStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as! String
-        api.callFlutterEchoString(aString: aStringArg) { result in
+        api.callFlutterEcho(aStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -648,7 +648,7 @@
       callFlutterEchoUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as! FlutterStandardTypedData
-        api.callFlutterEchoUint8List(aList: aListArg) { result in
+        api.callFlutterEcho(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -660,7 +660,7 @@
       callFlutterEchoListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as! [Any?]
-        api.callFlutterEchoList(aList: aListArg) { result in
+        api.callFlutterEcho(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -672,7 +672,7 @@
       callFlutterEchoMapChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aMapArg = args[0] as! [String?: Any?]
-        api.callFlutterEchoMap(aMap: aMapArg) { result in
+        api.callFlutterEcho(aMapArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -684,7 +684,7 @@
       callFlutterEchoNullableBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aBoolArg = args[0] as? Bool
-        api.callFlutterEchoNullableBool(aBool: aBoolArg) { result in
+        api.callFlutterEchoNullable(aBoolArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -696,7 +696,7 @@
       callFlutterEchoNullableIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anIntArg = args[0] as? Int32
-        api.callFlutterEchoNullableInt(anInt: anIntArg) { result in
+        api.callFlutterEchoNullable(anIntArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -708,7 +708,7 @@
       callFlutterEchoNullableDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aDoubleArg = args[0] as? Double
-        api.callFlutterEchoNullableDouble(aDouble: aDoubleArg) { result in
+        api.callFlutterEchoNullable(aDoubleArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -720,7 +720,7 @@
       callFlutterEchoNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as? String
-        api.callFlutterEchoNullableString(aString: aStringArg) { result in
+        api.callFlutterEchoNullable(aStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -732,7 +732,7 @@
       callFlutterEchoNullableUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as? FlutterStandardTypedData
-        api.callFlutterEchoNullableUint8List(aList: aListArg) { result in
+        api.callFlutterEchoNullable(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -744,7 +744,7 @@
       callFlutterEchoNullableListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as? [Any?]
-        api.callFlutterEchoNullableList(aList: aListArg) { result in
+        api.callFlutterEchoNullable(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -756,7 +756,7 @@
       callFlutterEchoNullableMapChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aMapArg = args[0] as? [String?: Any?]
-        api.callFlutterEchoNullableMap(aMap: aMapArg) { result in
+        api.callFlutterEchoNullable(aMapArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -832,7 +832,7 @@
     }
   }
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllTypes(everything everythingArg: AllTypes, completion: @escaping (AllTypes) -> Void) {
+  func echo(_ everythingArg: AllTypes, completion: @escaping (AllTypes) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoAllTypes", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([everythingArg] as [Any?]) { response in
       let result = response as! AllTypes
@@ -840,7 +840,7 @@
     }
   }
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllNullableTypes(everything everythingArg: AllNullableTypes, completion: @escaping (AllNullableTypes) -> Void) {
+  func echoNullable(_ everythingArg: AllNullableTypes, completion: @escaping (AllNullableTypes) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoAllNullableTypes", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([everythingArg] as [Any?]) { response in
       let result = response as! AllNullableTypes
@@ -850,7 +850,7 @@
   /// Returns passed in arguments of multiple types.
   ///
   /// Tests multiple-arity FlutterApi handling.
-  func sendMultipleNullableTypes(aNullableBool aNullableBoolArg: Bool?, aNullableInt aNullableIntArg: Int32?, aNullableString aNullableStringArg: String?, completion: @escaping (AllNullableTypes) -> Void) {
+  func sendMultipleNullableTypes(aBool aNullableBoolArg: Bool?, anInt aNullableIntArg: Int32?, aString aNullableStringArg: String?, completion: @escaping (AllNullableTypes) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.sendMultipleNullableTypes", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aNullableBoolArg, aNullableIntArg, aNullableStringArg] as [Any?]) { response in
       let result = response as! AllNullableTypes
@@ -858,7 +858,7 @@
     }
   }
   /// Returns the passed boolean, to test serialization and deserialization.
-  func echoBool(aBool aBoolArg: Bool, completion: @escaping (Bool) -> Void) {
+  func echo(_ aBoolArg: Bool, completion: @escaping (Bool) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoBool", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aBoolArg] as [Any?]) { response in
       let result = response as! Bool
@@ -866,7 +866,7 @@
     }
   }
   /// Returns the passed int, to test serialization and deserialization.
-  func echoInt(anInt anIntArg: Int32, completion: @escaping (Int32) -> Void) {
+  func echo(_ anIntArg: Int32, completion: @escaping (Int32) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoInt", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([anIntArg] as [Any?]) { response in
       let result = response as! Int32
@@ -874,7 +874,7 @@
     }
   }
   /// Returns the passed double, to test serialization and deserialization.
-  func echoDouble(aDouble aDoubleArg: Double, completion: @escaping (Double) -> Void) {
+  func echo(_ aDoubleArg: Double, completion: @escaping (Double) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoDouble", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aDoubleArg] as [Any?]) { response in
       let result = response as! Double
@@ -882,7 +882,7 @@
     }
   }
   /// Returns the passed string, to test serialization and deserialization.
-  func echoString(aString aStringArg: String, completion: @escaping (String) -> Void) {
+  func echo(_ aStringArg: String, completion: @escaping (String) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoString", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aStringArg] as [Any?]) { response in
       let result = response as! String
@@ -890,7 +890,7 @@
     }
   }
   /// Returns the passed byte list, to test serialization and deserialization.
-  func echoUint8List(aList aListArg: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
+  func echo(_ aListArg: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoUint8List", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as! FlutterStandardTypedData
@@ -898,7 +898,7 @@
     }
   }
   /// Returns the passed list, to test serialization and deserialization.
-  func echoList(aList aListArg: [Any?], completion: @escaping ([Any?]) -> Void) {
+  func echo(_ aListArg: [Any?], completion: @escaping ([Any?]) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoList", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as! [Any?]
@@ -906,7 +906,7 @@
     }
   }
   /// Returns the passed map, to test serialization and deserialization.
-  func echoMap(aMap aMapArg: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void) {
+  func echo(_ aMapArg: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoMap", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aMapArg] as [Any?]) { response in
       let result = response as! [String?: Any?]
@@ -914,7 +914,7 @@
     }
   }
   /// Returns the passed boolean, to test serialization and deserialization.
-  func echoNullableBool(aBool aBoolArg: Bool?, completion: @escaping (Bool?) -> Void) {
+  func echoNullable(_ aBoolArg: Bool?, completion: @escaping (Bool?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableBool", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aBoolArg] as [Any?]) { response in
       let result = response as? Bool
@@ -922,7 +922,7 @@
     }
   }
   /// Returns the passed int, to test serialization and deserialization.
-  func echoNullableInt(anInt anIntArg: Int32?, completion: @escaping (Int32?) -> Void) {
+  func echoNullable(_ anIntArg: Int32?, completion: @escaping (Int32?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableInt", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([anIntArg] as [Any?]) { response in
       let result = response as? Int32
@@ -930,7 +930,7 @@
     }
   }
   /// Returns the passed double, to test serialization and deserialization.
-  func echoNullableDouble(aDouble aDoubleArg: Double?, completion: @escaping (Double?) -> Void) {
+  func echoNullable(_ aDoubleArg: Double?, completion: @escaping (Double?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableDouble", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aDoubleArg] as [Any?]) { response in
       let result = response as? Double
@@ -938,7 +938,7 @@
     }
   }
   /// Returns the passed string, to test serialization and deserialization.
-  func echoNullableString(aString aStringArg: String?, completion: @escaping (String?) -> Void) {
+  func echoNullable(_ aStringArg: String?, completion: @escaping (String?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableString", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aStringArg] as [Any?]) { response in
       let result = response as? String
@@ -946,7 +946,7 @@
     }
   }
   /// Returns the passed byte list, to test serialization and deserialization.
-  func echoNullableUint8List(aList aListArg: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
+  func echoNullable(_ aListArg: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableUint8List", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as? FlutterStandardTypedData
@@ -954,7 +954,7 @@
     }
   }
   /// Returns the passed list, to test serialization and deserialization.
-  func echoNullableList(aList aListArg: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
+  func echoNullable(_ aListArg: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableList", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as? [Any?]
@@ -962,7 +962,7 @@
     }
   }
   /// Returns the passed map, to test serialization and deserialization.
-  func echoNullableMap(aMap aMapArg: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void) {
+  func echoNullable(_ aMapArg: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableMap", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aMapArg] as [Any?]) { response in
       let result = response as? [String?: Any?]
diff --git a/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift b/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift
index 3515e49..edec42b 100644
--- a/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift
+++ b/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift
@@ -26,11 +26,11 @@
   func noop() {
   }
 
-  func echoAllTypes(everything: AllTypes) -> AllTypes {
+  func echo(_ everything: AllTypes) -> AllTypes {
     return everything
   }
 
-  func echoAllNullableTypes(everything: AllNullableTypes?) -> AllNullableTypes? {
+  func echo(_ everything: AllNullableTypes?) -> AllNullableTypes? {
     return everything
   }
 
@@ -39,64 +39,64 @@
     // https://github.com/flutter/flutter/issues/112483
   }
 
-  func echoInt(anInt: Int32) -> Int32 {
+  func echo(_ anInt: Int32) -> Int32 {
     return anInt
   }
 
-  func echoDouble(aDouble: Double) -> Double {
+  func echo(_ aDouble: Double) -> Double {
     return aDouble
   }
 
-  func echoBool(aBool: Bool) -> Bool {
+  func echo(_ aBool: Bool) -> Bool {
     return aBool
   }
 
-  func echoString(aString: String) -> String {
+  func echo(_ aString: String) -> String {
     return aString
   }
 
-  func echoUint8List(aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData {
+  func echo(_ aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData {
     return aUint8List
   }
 
-  func echoObject(anObject: Any) -> Any {
+  func echo(_ anObject: Any) -> Any {
     return anObject
   }
 
-  func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String? {
+  func extractNestedNullableString(from wrapper: AllNullableTypesWrapper) -> String? {
     return wrapper.values.aNullableString;
   }
 
-  func createNestedNullableString(nullableString: String?) -> AllNullableTypesWrapper {
+  func createNestedObject(with nullableString: String?) -> AllNullableTypesWrapper {
     return AllNullableTypesWrapper(values: AllNullableTypes(aNullableString: nullableString))
   }
 
-  func sendMultipleNullableTypes(aNullableBool: Bool?, aNullableInt: Int32?, aNullableString: String?) -> AllNullableTypes {
+  func sendMultipleNullableTypes(aBool aNullableBool: Bool?, anInt aNullableInt: Int32?, aString aNullableString: String?) -> AllNullableTypes {
     let someThings = AllNullableTypes(aNullableBool: aNullableBool, aNullableInt: aNullableInt, aNullableString: aNullableString)
     return someThings
   }
 
-  func echoNullableInt(aNullableInt: Int32?) -> Int32? {
+  func echo(_ aNullableInt: Int32?) -> Int32? {
     return aNullableInt
   }
 
-  func echoNullableDouble(aNullableDouble: Double?) -> Double? {
+  func echo(_ aNullableDouble: Double?) -> Double? {
     return aNullableDouble
   }
 
-  func echoNullableBool(aNullableBool: Bool?) -> Bool? {
+  func echo(_ aNullableBool: Bool?) -> Bool? {
     return aNullableBool
   }
 
-  func echoNullableString(aNullableString: String?) -> String? {
+  func echo(_ aNullableString: String?) -> String? {
     return aNullableString
   }
 
-  func echoNullableUint8List(aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData? {
+  func echo(_ aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData? {
     return aNullableUint8List
   }
 
-  func echoNullableObject(aNullableObject: Any?) -> Any? {
+  func echo(_ aNullableObject: Any?) -> Any? {
     return aNullableObject
   }
 
@@ -104,7 +104,7 @@
     completion()
   }
 
-  func echoAsyncString(aString: String, completion: @escaping (String) -> Void) {
+  func echoAsync(_ aString: String, completion: @escaping (String) -> Void) {
     completion(aString)
   }
 
@@ -114,78 +114,78 @@
     }
   }
 
-  func callFlutterEchoAllTypes(everything: AllTypes, completion: @escaping (AllTypes) -> Void) {
-    flutterAPI.echoAllTypes(everything: everything) { completion($0) }
+  func callFlutterEcho(_ everything: AllTypes, completion: @escaping (AllTypes) -> Void) {
+      flutterAPI.echo(everything) { completion($0) }
   }
 
   func callFlutterSendMultipleNullableTypes(
-    aNullableBool: Bool?,
-    aNullableInt: Int32?,
-    aNullableString: String?,
+    aBool aNullableBool: Bool?,
+    anInt aNullableInt: Int32?,
+    aString aNullableString: String?,
     completion: @escaping (AllNullableTypes) -> Void
   ) {
     flutterAPI.sendMultipleNullableTypes(
-      aNullableBool: aNullableBool,
-      aNullableInt: aNullableInt,
-      aNullableString: aNullableString
+      aBool: aNullableBool,
+      anInt: aNullableInt,
+      aString: aNullableString
     ) {
       completion($0)
     }
   }
 
-  func callFlutterEchoBool(aBool: Bool, completion: @escaping (Bool) -> Void) {
-    flutterAPI.echoBool(aBool: aBool) { completion($0) }
+  func callFlutterEcho(_ aBool: Bool, completion: @escaping (Bool) -> Void) {
+    flutterAPI.echo(aBool) { completion($0) }
   }
 
-  func callFlutterEchoInt(anInt: Int32, completion: @escaping (Int32) -> Void) {
-    flutterAPI.echoInt(anInt: anInt) { completion($0) }
+  func callFlutterEcho(_ anInt: Int32, completion: @escaping (Int32) -> Void) {
+    flutterAPI.echo(anInt) { completion($0) }
   }
 
-  func callFlutterEchoDouble(aDouble: Double, completion: @escaping (Double) -> Void) {
-    flutterAPI.echoDouble(aDouble: aDouble) { completion($0) }
+  func callFlutterEcho(_ aDouble: Double, completion: @escaping (Double) -> Void) {
+    flutterAPI.echo(aDouble) { completion($0) }
   }
 
-  func callFlutterEchoString(aString: String, completion: @escaping (String) -> Void) {
-    flutterAPI.echoString(aString: aString) { completion($0) }
+  func callFlutterEcho(_ aString: String, completion: @escaping (String) -> Void) {
+    flutterAPI.echo(aString) { completion($0) }
   }
 
-  func callFlutterEchoUint8List(aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
-    flutterAPI.echoUint8List(aList: aList) { completion($0) }
+  func callFlutterEcho(_ aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
+    flutterAPI.echo(aList) { completion($0) }
   }
 
-  func callFlutterEchoList(aList: [Any?], completion: @escaping ([Any?]) -> Void) {
-    flutterAPI.echoList(aList: aList) { completion($0) }
+  func callFlutterEcho(_ aList: [Any?], completion: @escaping ([Any?]) -> Void) {
+    flutterAPI.echo(aList) { completion($0) }
   }
 
-  func callFlutterEchoMap(aMap: [String? : Any?], completion: @escaping ([String? : Any?]) -> Void) {
-    flutterAPI.echoMap(aMap: aMap) { completion($0) }
+  func callFlutterEcho(_ aMap: [String? : Any?], completion: @escaping ([String? : Any?]) -> Void) {
+    flutterAPI.echo(aMap) { completion($0) }
   }
 
-  func callFlutterEchoNullableBool(aBool: Bool?, completion: @escaping (Bool?) -> Void) {
-    flutterAPI.echoNullableBool(aBool: aBool) { completion($0) }
+  func callFlutterEchoNullable(_ aBool: Bool?, completion: @escaping (Bool?) -> Void) {
+    flutterAPI.echoNullable(aBool) { completion($0) }
   }
 
-  func callFlutterEchoNullableInt(anInt: Int32?, completion: @escaping (Int32?) -> Void) {
-    flutterAPI.echoNullableInt(anInt: anInt) { completion($0) }
+  func callFlutterEchoNullable(_ anInt: Int32?, completion: @escaping (Int32?) -> Void) {
+    flutterAPI.echoNullable(anInt) { completion($0) }
   }
 
-  func callFlutterEchoNullableDouble(aDouble: Double?, completion: @escaping (Double?) -> Void) {
-    flutterAPI.echoNullableDouble(aDouble: aDouble) { completion($0) }
+  func callFlutterEchoNullable(_ aDouble: Double?, completion: @escaping (Double?) -> Void) {
+    flutterAPI.echoNullable(aDouble) { completion($0) }
   }
 
-  func callFlutterEchoNullableString(aString: String?, completion: @escaping (String?) -> Void) {
-    flutterAPI.echoNullableString(aString: aString) { completion($0) }
+  func callFlutterEchoNullable(_ aString: String?, completion: @escaping (String?) -> Void) {
+    flutterAPI.echoNullable(aString) { completion($0) }
   }
 
-  func callFlutterEchoNullableUint8List(aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
-    flutterAPI.echoNullableUint8List(aList: aList) { completion($0) }
+  func callFlutterEchoNullable(_ aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
+    flutterAPI.echoNullable(aList) { completion($0) }
   }
 
-  func callFlutterEchoNullableList(aList: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
-    flutterAPI.echoNullableList(aList: aList) { completion($0) }
+  func callFlutterEchoNullable(_ aList: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
+    flutterAPI.echoNullable(aList) { completion($0) }
   }
 
-  func callFlutterEchoNullableMap(aMap: [String? : Any?]?, completion: @escaping ([String? : Any?]?) -> Void) {
-    flutterAPI.echoNullableMap(aMap: aMap) { completion($0) }
+  func callFlutterEchoNullable(_ aMap: [String? : Any?]?, completion: @escaping ([String? : Any?]?) -> Void) {
+    flutterAPI.echoNullable(aMap) { completion($0) }
   }
 }
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 d33a26c..0f33912 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 // 
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 import Foundation
@@ -238,65 +238,65 @@
   /// test basic calling.
   func noop()
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllTypes(everything: AllTypes) -> AllTypes
+  func echo(_ everything: AllTypes) -> AllTypes
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllNullableTypes(everything: AllNullableTypes?) -> AllNullableTypes?
+  func echo(_ everything: AllNullableTypes?) -> AllNullableTypes?
   /// Returns an error, to test error handling.
   func throwError()
   /// Returns passed in int.
-  func echoInt(anInt: Int32) -> Int32
+  func echo(_ anInt: Int32) -> Int32
   /// Returns passed in double.
-  func echoDouble(aDouble: Double) -> Double
+  func echo(_ aDouble: Double) -> Double
   /// Returns the passed in boolean.
-  func echoBool(aBool: Bool) -> Bool
+  func echo(_ aBool: Bool) -> Bool
   /// Returns the passed in string.
-  func echoString(aString: String) -> String
+  func echo(_ aString: String) -> String
   /// Returns the passed in Uint8List.
-  func echoUint8List(aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData
+  func echo(_ aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData
   /// Returns the passed in generic Object.
-  func echoObject(anObject: Any) -> Any
+  func echo(_ anObject: Any) -> Any
   /// Returns the inner `aString` value from the wrapped object, to test
   /// sending of nested objects.
-  func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String?
+  func extractNestedNullableString(from wrapper: AllNullableTypesWrapper) -> String?
   /// Returns the inner `aString` value from the wrapped object, to test
   /// sending of nested objects.
-  func createNestedNullableString(nullableString: String?) -> AllNullableTypesWrapper
+  func createNestedObject(with nullableString: String?) -> AllNullableTypesWrapper
   /// Returns passed in arguments of multiple types.
-  func sendMultipleNullableTypes(aNullableBool: Bool?, aNullableInt: Int32?, aNullableString: String?) -> AllNullableTypes
+  func sendMultipleNullableTypes(aBool aNullableBool: Bool?, anInt aNullableInt: Int32?, aString aNullableString: String?) -> AllNullableTypes
   /// Returns passed in int.
-  func echoNullableInt(aNullableInt: Int32?) -> Int32?
+  func echo(_ aNullableInt: Int32?) -> Int32?
   /// Returns passed in double.
-  func echoNullableDouble(aNullableDouble: Double?) -> Double?
+  func echo(_ aNullableDouble: Double?) -> Double?
   /// Returns the passed in boolean.
-  func echoNullableBool(aNullableBool: Bool?) -> Bool?
+  func echo(_ aNullableBool: Bool?) -> Bool?
   /// Returns the passed in string.
-  func echoNullableString(aNullableString: String?) -> String?
+  func echo(_ aNullableString: String?) -> String?
   /// Returns the passed in Uint8List.
-  func echoNullableUint8List(aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData?
+  func echo(_ aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData?
   /// Returns the passed in generic Object.
-  func echoNullableObject(aNullableObject: Any?) -> Any?
+  func echo(_ aNullableObject: Any?) -> Any?
   /// A no-op function taking no arguments and returning no value, to sanity
   /// test basic asynchronous calling.
   func noopAsync(completion: @escaping () -> Void)
   /// Returns the passed string asynchronously.
-  func echoAsyncString(aString: String, completion: @escaping (String) -> Void)
+  func echoAsync(_ aString: String, completion: @escaping (String) -> Void)
   func callFlutterNoop(completion: @escaping () -> Void)
-  func callFlutterEchoAllTypes(everything: AllTypes, completion: @escaping (AllTypes) -> Void)
-  func callFlutterSendMultipleNullableTypes(aNullableBool: Bool?, aNullableInt: Int32?, aNullableString: String?, completion: @escaping (AllNullableTypes) -> Void)
-  func callFlutterEchoBool(aBool: Bool, completion: @escaping (Bool) -> Void)
-  func callFlutterEchoInt(anInt: Int32, completion: @escaping (Int32) -> Void)
-  func callFlutterEchoDouble(aDouble: Double, completion: @escaping (Double) -> Void)
-  func callFlutterEchoString(aString: String, completion: @escaping (String) -> Void)
-  func callFlutterEchoUint8List(aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void)
-  func callFlutterEchoList(aList: [Any?], completion: @escaping ([Any?]) -> Void)
-  func callFlutterEchoMap(aMap: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void)
-  func callFlutterEchoNullableBool(aBool: Bool?, completion: @escaping (Bool?) -> Void)
-  func callFlutterEchoNullableInt(anInt: Int32?, completion: @escaping (Int32?) -> Void)
-  func callFlutterEchoNullableDouble(aDouble: Double?, completion: @escaping (Double?) -> Void)
-  func callFlutterEchoNullableString(aString: String?, completion: @escaping (String?) -> Void)
-  func callFlutterEchoNullableUint8List(aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void)
-  func callFlutterEchoNullableList(aList: [Any?]?, completion: @escaping ([Any?]?) -> Void)
-  func callFlutterEchoNullableMap(aMap: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void)
+  func callFlutterEcho(_ everything: AllTypes, completion: @escaping (AllTypes) -> Void)
+  func callFlutterSendMultipleNullableTypes(aBool aNullableBool: Bool?, anInt aNullableInt: Int32?, aString aNullableString: String?, completion: @escaping (AllNullableTypes) -> Void)
+  func callFlutterEcho(_ aBool: Bool, completion: @escaping (Bool) -> Void)
+  func callFlutterEcho(_ anInt: Int32, completion: @escaping (Int32) -> Void)
+  func callFlutterEcho(_ aDouble: Double, completion: @escaping (Double) -> Void)
+  func callFlutterEcho(_ aString: String, completion: @escaping (String) -> Void)
+  func callFlutterEcho(_ aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void)
+  func callFlutterEcho(_ aList: [Any?], completion: @escaping ([Any?]) -> Void)
+  func callFlutterEcho(_ aMap: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void)
+  func callFlutterEchoNullable(_ aBool: Bool?, completion: @escaping (Bool?) -> Void)
+  func callFlutterEchoNullable(_ anInt: Int32?, completion: @escaping (Int32?) -> Void)
+  func callFlutterEchoNullable(_ aDouble: Double?, completion: @escaping (Double?) -> Void)
+  func callFlutterEchoNullable(_ aString: String?, completion: @escaping (String?) -> Void)
+  func callFlutterEchoNullable(_ aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void)
+  func callFlutterEchoNullable(_ aList: [Any?]?, completion: @escaping ([Any?]?) -> Void)
+  func callFlutterEchoNullable(_ aMap: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void)
 }
 
 /// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
@@ -322,7 +322,7 @@
       echoAllTypesChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let everythingArg = args[0] as! AllTypes
-        let result = api.echoAllTypes(everything: everythingArg)
+        let result = api.echo(everythingArg)
         reply(wrapResult(result))
       }
     } else {
@@ -334,7 +334,7 @@
       echoAllNullableTypesChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let everythingArg = args[0] as? AllNullableTypes
-        let result = api.echoAllNullableTypes(everything: everythingArg)
+        let result = api.echo(everythingArg)
         reply(wrapResult(result))
       }
     } else {
@@ -356,7 +356,7 @@
       echoIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anIntArg = args[0] as! Int32
-        let result = api.echoInt(anInt: anIntArg)
+        let result = api.echo(anIntArg)
         reply(wrapResult(result))
       }
     } else {
@@ -368,7 +368,7 @@
       echoDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aDoubleArg = args[0] as! Double
-        let result = api.echoDouble(aDouble: aDoubleArg)
+        let result = api.echo(aDoubleArg)
         reply(wrapResult(result))
       }
     } else {
@@ -380,7 +380,7 @@
       echoBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aBoolArg = args[0] as! Bool
-        let result = api.echoBool(aBool: aBoolArg)
+        let result = api.echo(aBoolArg)
         reply(wrapResult(result))
       }
     } else {
@@ -392,7 +392,7 @@
       echoStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as! String
-        let result = api.echoString(aString: aStringArg)
+        let result = api.echo(aStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -404,7 +404,7 @@
       echoUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aUint8ListArg = args[0] as! FlutterStandardTypedData
-        let result = api.echoUint8List(aUint8List: aUint8ListArg)
+        let result = api.echo(aUint8ListArg)
         reply(wrapResult(result))
       }
     } else {
@@ -416,7 +416,7 @@
       echoObjectChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anObjectArg = args[0]!
-        let result = api.echoObject(anObject: anObjectArg)
+        let result = api.echo(anObjectArg)
         reply(wrapResult(result))
       }
     } else {
@@ -429,7 +429,7 @@
       extractNestedNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let wrapperArg = args[0] as! AllNullableTypesWrapper
-        let result = api.extractNestedNullableString(wrapper: wrapperArg)
+        let result = api.extractNestedNullableString(from: wrapperArg)
         reply(wrapResult(result))
       }
     } else {
@@ -442,7 +442,7 @@
       createNestedNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let nullableStringArg = args[0] as? String
-        let result = api.createNestedNullableString(nullableString: nullableStringArg)
+        let result = api.createNestedObject(with: nullableStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -456,7 +456,7 @@
         let aNullableBoolArg = args[0] as? Bool
         let aNullableIntArg = args[1] as? Int32
         let aNullableStringArg = args[2] as? String
-        let result = api.sendMultipleNullableTypes(aNullableBool: aNullableBoolArg, aNullableInt: aNullableIntArg, aNullableString: aNullableStringArg)
+        let result = api.sendMultipleNullableTypes(aBool: aNullableBoolArg, anInt: aNullableIntArg, aString: aNullableStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -468,7 +468,7 @@
       echoNullableIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableIntArg = args[0] as? Int32
-        let result = api.echoNullableInt(aNullableInt: aNullableIntArg)
+        let result = api.echo(aNullableIntArg)
         reply(wrapResult(result))
       }
     } else {
@@ -480,7 +480,7 @@
       echoNullableDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableDoubleArg = args[0] as? Double
-        let result = api.echoNullableDouble(aNullableDouble: aNullableDoubleArg)
+        let result = api.echo(aNullableDoubleArg)
         reply(wrapResult(result))
       }
     } else {
@@ -492,7 +492,7 @@
       echoNullableBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableBoolArg = args[0] as? Bool
-        let result = api.echoNullableBool(aNullableBool: aNullableBoolArg)
+        let result = api.echo(aNullableBoolArg)
         reply(wrapResult(result))
       }
     } else {
@@ -504,7 +504,7 @@
       echoNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableStringArg = args[0] as? String
-        let result = api.echoNullableString(aNullableString: aNullableStringArg)
+        let result = api.echo(aNullableStringArg)
         reply(wrapResult(result))
       }
     } else {
@@ -516,7 +516,7 @@
       echoNullableUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableUint8ListArg = args[0] as? FlutterStandardTypedData
-        let result = api.echoNullableUint8List(aNullableUint8List: aNullableUint8ListArg)
+        let result = api.echo(aNullableUint8ListArg)
         reply(wrapResult(result))
       }
     } else {
@@ -528,7 +528,7 @@
       echoNullableObjectChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aNullableObjectArg = args[0]
-        let result = api.echoNullableObject(aNullableObject: aNullableObjectArg)
+        let result = api.echo(aNullableObjectArg)
         reply(wrapResult(result))
       }
     } else {
@@ -552,7 +552,7 @@
       echoAsyncStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as! String
-        api.echoAsyncString(aString: aStringArg) { result in
+        api.echoAsync(aStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -574,7 +574,7 @@
       callFlutterEchoAllTypesChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let everythingArg = args[0] as! AllTypes
-        api.callFlutterEchoAllTypes(everything: everythingArg) { result in
+        api.callFlutterEcho(everythingArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -588,7 +588,7 @@
         let aNullableBoolArg = args[0] as? Bool
         let aNullableIntArg = args[1] as? Int32
         let aNullableStringArg = args[2] as? String
-        api.callFlutterSendMultipleNullableTypes(aNullableBool: aNullableBoolArg, aNullableInt: aNullableIntArg, aNullableString: aNullableStringArg) { result in
+        api.callFlutterSendMultipleNullableTypes(aBool: aNullableBoolArg, anInt: aNullableIntArg, aString: aNullableStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -600,7 +600,7 @@
       callFlutterEchoBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aBoolArg = args[0] as! Bool
-        api.callFlutterEchoBool(aBool: aBoolArg) { result in
+        api.callFlutterEcho(aBoolArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -612,7 +612,7 @@
       callFlutterEchoIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anIntArg = args[0] as! Int32
-        api.callFlutterEchoInt(anInt: anIntArg) { result in
+        api.callFlutterEcho(anIntArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -624,7 +624,7 @@
       callFlutterEchoDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aDoubleArg = args[0] as! Double
-        api.callFlutterEchoDouble(aDouble: aDoubleArg) { result in
+        api.callFlutterEcho(aDoubleArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -636,7 +636,7 @@
       callFlutterEchoStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as! String
-        api.callFlutterEchoString(aString: aStringArg) { result in
+        api.callFlutterEcho(aStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -648,7 +648,7 @@
       callFlutterEchoUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as! FlutterStandardTypedData
-        api.callFlutterEchoUint8List(aList: aListArg) { result in
+        api.callFlutterEcho(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -660,7 +660,7 @@
       callFlutterEchoListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as! [Any?]
-        api.callFlutterEchoList(aList: aListArg) { result in
+        api.callFlutterEcho(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -672,7 +672,7 @@
       callFlutterEchoMapChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aMapArg = args[0] as! [String?: Any?]
-        api.callFlutterEchoMap(aMap: aMapArg) { result in
+        api.callFlutterEcho(aMapArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -684,7 +684,7 @@
       callFlutterEchoNullableBoolChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aBoolArg = args[0] as? Bool
-        api.callFlutterEchoNullableBool(aBool: aBoolArg) { result in
+        api.callFlutterEchoNullable(aBoolArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -696,7 +696,7 @@
       callFlutterEchoNullableIntChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let anIntArg = args[0] as? Int32
-        api.callFlutterEchoNullableInt(anInt: anIntArg) { result in
+        api.callFlutterEchoNullable(anIntArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -708,7 +708,7 @@
       callFlutterEchoNullableDoubleChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aDoubleArg = args[0] as? Double
-        api.callFlutterEchoNullableDouble(aDouble: aDoubleArg) { result in
+        api.callFlutterEchoNullable(aDoubleArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -720,7 +720,7 @@
       callFlutterEchoNullableStringChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aStringArg = args[0] as? String
-        api.callFlutterEchoNullableString(aString: aStringArg) { result in
+        api.callFlutterEchoNullable(aStringArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -732,7 +732,7 @@
       callFlutterEchoNullableUint8ListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as? FlutterStandardTypedData
-        api.callFlutterEchoNullableUint8List(aList: aListArg) { result in
+        api.callFlutterEchoNullable(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -744,7 +744,7 @@
       callFlutterEchoNullableListChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aListArg = args[0] as? [Any?]
-        api.callFlutterEchoNullableList(aList: aListArg) { result in
+        api.callFlutterEchoNullable(aListArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -756,7 +756,7 @@
       callFlutterEchoNullableMapChannel.setMessageHandler { message, reply in
         let args = message as! [Any?]
         let aMapArg = args[0] as? [String?: Any?]
-        api.callFlutterEchoNullableMap(aMap: aMapArg) { result in
+        api.callFlutterEchoNullable(aMapArg) { result in
           reply(wrapResult(result))
         }
       }
@@ -832,7 +832,7 @@
     }
   }
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllTypes(everything everythingArg: AllTypes, completion: @escaping (AllTypes) -> Void) {
+  func echo(_ everythingArg: AllTypes, completion: @escaping (AllTypes) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoAllTypes", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([everythingArg] as [Any?]) { response in
       let result = response as! AllTypes
@@ -840,7 +840,7 @@
     }
   }
   /// Returns the passed object, to test serialization and deserialization.
-  func echoAllNullableTypes(everything everythingArg: AllNullableTypes, completion: @escaping (AllNullableTypes) -> Void) {
+  func echoNullable(_ everythingArg: AllNullableTypes, completion: @escaping (AllNullableTypes) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoAllNullableTypes", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([everythingArg] as [Any?]) { response in
       let result = response as! AllNullableTypes
@@ -850,7 +850,7 @@
   /// Returns passed in arguments of multiple types.
   ///
   /// Tests multiple-arity FlutterApi handling.
-  func sendMultipleNullableTypes(aNullableBool aNullableBoolArg: Bool?, aNullableInt aNullableIntArg: Int32?, aNullableString aNullableStringArg: String?, completion: @escaping (AllNullableTypes) -> Void) {
+  func sendMultipleNullableTypes(aBool aNullableBoolArg: Bool?, anInt aNullableIntArg: Int32?, aString aNullableStringArg: String?, completion: @escaping (AllNullableTypes) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.sendMultipleNullableTypes", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aNullableBoolArg, aNullableIntArg, aNullableStringArg] as [Any?]) { response in
       let result = response as! AllNullableTypes
@@ -858,7 +858,7 @@
     }
   }
   /// Returns the passed boolean, to test serialization and deserialization.
-  func echoBool(aBool aBoolArg: Bool, completion: @escaping (Bool) -> Void) {
+  func echo(_ aBoolArg: Bool, completion: @escaping (Bool) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoBool", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aBoolArg] as [Any?]) { response in
       let result = response as! Bool
@@ -866,7 +866,7 @@
     }
   }
   /// Returns the passed int, to test serialization and deserialization.
-  func echoInt(anInt anIntArg: Int32, completion: @escaping (Int32) -> Void) {
+  func echo(_ anIntArg: Int32, completion: @escaping (Int32) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoInt", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([anIntArg] as [Any?]) { response in
       let result = response as! Int32
@@ -874,7 +874,7 @@
     }
   }
   /// Returns the passed double, to test serialization and deserialization.
-  func echoDouble(aDouble aDoubleArg: Double, completion: @escaping (Double) -> Void) {
+  func echo(_ aDoubleArg: Double, completion: @escaping (Double) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoDouble", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aDoubleArg] as [Any?]) { response in
       let result = response as! Double
@@ -882,7 +882,7 @@
     }
   }
   /// Returns the passed string, to test serialization and deserialization.
-  func echoString(aString aStringArg: String, completion: @escaping (String) -> Void) {
+  func echo(_ aStringArg: String, completion: @escaping (String) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoString", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aStringArg] as [Any?]) { response in
       let result = response as! String
@@ -890,7 +890,7 @@
     }
   }
   /// Returns the passed byte list, to test serialization and deserialization.
-  func echoUint8List(aList aListArg: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
+  func echo(_ aListArg: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoUint8List", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as! FlutterStandardTypedData
@@ -898,7 +898,7 @@
     }
   }
   /// Returns the passed list, to test serialization and deserialization.
-  func echoList(aList aListArg: [Any?], completion: @escaping ([Any?]) -> Void) {
+  func echo(_ aListArg: [Any?], completion: @escaping ([Any?]) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoList", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as! [Any?]
@@ -906,7 +906,7 @@
     }
   }
   /// Returns the passed map, to test serialization and deserialization.
-  func echoMap(aMap aMapArg: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void) {
+  func echo(_ aMapArg: [String?: Any?], completion: @escaping ([String?: Any?]) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoMap", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aMapArg] as [Any?]) { response in
       let result = response as! [String?: Any?]
@@ -914,7 +914,7 @@
     }
   }
   /// Returns the passed boolean, to test serialization and deserialization.
-  func echoNullableBool(aBool aBoolArg: Bool?, completion: @escaping (Bool?) -> Void) {
+  func echoNullable(_ aBoolArg: Bool?, completion: @escaping (Bool?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableBool", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aBoolArg] as [Any?]) { response in
       let result = response as? Bool
@@ -922,7 +922,7 @@
     }
   }
   /// Returns the passed int, to test serialization and deserialization.
-  func echoNullableInt(anInt anIntArg: Int32?, completion: @escaping (Int32?) -> Void) {
+  func echoNullable(_ anIntArg: Int32?, completion: @escaping (Int32?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableInt", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([anIntArg] as [Any?]) { response in
       let result = response as? Int32
@@ -930,7 +930,7 @@
     }
   }
   /// Returns the passed double, to test serialization and deserialization.
-  func echoNullableDouble(aDouble aDoubleArg: Double?, completion: @escaping (Double?) -> Void) {
+  func echoNullable(_ aDoubleArg: Double?, completion: @escaping (Double?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableDouble", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aDoubleArg] as [Any?]) { response in
       let result = response as? Double
@@ -938,7 +938,7 @@
     }
   }
   /// Returns the passed string, to test serialization and deserialization.
-  func echoNullableString(aString aStringArg: String?, completion: @escaping (String?) -> Void) {
+  func echoNullable(_ aStringArg: String?, completion: @escaping (String?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableString", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aStringArg] as [Any?]) { response in
       let result = response as? String
@@ -946,7 +946,7 @@
     }
   }
   /// Returns the passed byte list, to test serialization and deserialization.
-  func echoNullableUint8List(aList aListArg: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
+  func echoNullable(_ aListArg: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableUint8List", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as? FlutterStandardTypedData
@@ -954,7 +954,7 @@
     }
   }
   /// Returns the passed list, to test serialization and deserialization.
-  func echoNullableList(aList aListArg: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
+  func echoNullable(_ aListArg: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableList", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aListArg] as [Any?]) { response in
       let result = response as? [Any?]
@@ -962,7 +962,7 @@
     }
   }
   /// Returns the passed map, to test serialization and deserialization.
-  func echoNullableMap(aMap aMapArg: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void) {
+  func echoNullable(_ aMapArg: [String?: Any?]?, completion: @escaping ([String?: Any?]?) -> Void) {
     let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableMap", binaryMessenger: binaryMessenger, codec: codec)
     channel.sendMessage([aMapArg] as [Any?]) { response in
       let result = response as? [String?: Any?]
diff --git a/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift b/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift
index 7461473..4075a3d 100644
--- a/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift
+++ b/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift
@@ -26,11 +26,11 @@
   func noop() {
   }
 
-  func echoAllTypes(everything: AllTypes) -> AllTypes {
+  func echo(_ everything: AllTypes) -> AllTypes {
     return everything
   }
 
-  func echoAllNullableTypes(everything: AllNullableTypes?) -> AllNullableTypes? {
+  func echo(_ everything: AllNullableTypes?) -> AllNullableTypes? {
     return everything
   }
 
@@ -39,64 +39,64 @@
     // https://github.com/flutter/flutter/issues/112483
   }
 
-  func echoInt(anInt: Int32) -> Int32 {
+  func echo(_ anInt: Int32) -> Int32 {
     return anInt
   }
 
-  func echoDouble(aDouble: Double) -> Double {
+  func echo(_ aDouble: Double) -> Double {
     return aDouble
   }
 
-  func echoBool(aBool: Bool) -> Bool {
+  func echo(_ aBool: Bool) -> Bool {
     return aBool
   }
 
-  func echoString(aString: String) -> String {
+  func echo(_ aString: String) -> String {
     return aString
   }
 
-  func echoUint8List(aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData {
+  func echo(_ aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData {
     return aUint8List
   }
 
-  func echoObject(anObject: Any) -> Any {
+  func echo(_ anObject: Any) -> Any {
     return anObject
   }
 
-  func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String? {
+  func extractNestedNullableString(from wrapper: AllNullableTypesWrapper) -> String? {
     return wrapper.values.aNullableString;
   }
 
-  func createNestedNullableString(nullableString: String?) -> AllNullableTypesWrapper {
+  func createNestedObject(with nullableString: String?) -> AllNullableTypesWrapper {
     return AllNullableTypesWrapper(values: AllNullableTypes(aNullableString: nullableString))
   }
 
-  func sendMultipleNullableTypes(aNullableBool: Bool?, aNullableInt: Int32?, aNullableString: String?) -> AllNullableTypes {
+  func sendMultipleNullableTypes(aBool aNullableBool: Bool?, anInt aNullableInt: Int32?, aString aNullableString: String?) -> AllNullableTypes {
     let someThings = AllNullableTypes(aNullableBool: aNullableBool, aNullableInt: aNullableInt, aNullableString: aNullableString)
     return someThings
   }
 
-  func echoNullableInt(aNullableInt: Int32?) -> Int32? {
+  func echo(_ aNullableInt: Int32?) -> Int32? {
     return aNullableInt
   }
 
-  func echoNullableDouble(aNullableDouble: Double?) -> Double? {
+  func echo(_ aNullableDouble: Double?) -> Double? {
     return aNullableDouble
   }
 
-  func echoNullableBool(aNullableBool: Bool?) -> Bool? {
+  func echo(_ aNullableBool: Bool?) -> Bool? {
     return aNullableBool
   }
 
-  func echoNullableString(aNullableString: String?) -> String? {
+  func echo(_ aNullableString: String?) -> String? {
     return aNullableString
   }
 
-  func echoNullableUint8List(aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData? {
+  func echo(_ aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData? {
     return aNullableUint8List
   }
 
-  func echoNullableObject(aNullableObject: Any?) -> Any? {
+  func echo(_ aNullableObject: Any?) -> Any? {
     return aNullableObject
   }
 
@@ -104,7 +104,7 @@
     completion()
   }
 
-  func echoAsyncString(aString: String, completion: @escaping (String) -> Void) {
+  func echoAsync(_ aString: String, completion: @escaping (String) -> Void) {
     completion(aString)
   }
 
@@ -114,78 +114,78 @@
     }
   }
 
-  func callFlutterEchoAllTypes(everything: AllTypes, completion: @escaping (AllTypes) -> Void) {
-    flutterAPI.echoAllTypes(everything: everything) { completion($0) }
+  func callFlutterEcho(_ everything: AllTypes, completion: @escaping (AllTypes) -> Void) {
+      flutterAPI.echo(everything) { completion($0) }
   }
 
   func callFlutterSendMultipleNullableTypes(
-    aNullableBool: Bool?,
-    aNullableInt: Int32?,
-    aNullableString: String?,
+    aBool aNullableBool: Bool?,
+    anInt aNullableInt: Int32?,
+    aString aNullableString: String?,
     completion: @escaping (AllNullableTypes) -> Void
   ) {
     flutterAPI.sendMultipleNullableTypes(
-      aNullableBool: aNullableBool,
-      aNullableInt: aNullableInt,
-      aNullableString: aNullableString
+      aBool: aNullableBool,
+      anInt: aNullableInt,
+      aString: aNullableString
     ) {
       completion($0)
     }
   }
 
-  func callFlutterEchoBool(aBool: Bool, completion: @escaping (Bool) -> Void) {
-    flutterAPI.echoBool(aBool: aBool) { completion($0) }
+  func callFlutterEcho(_ aBool: Bool, completion: @escaping (Bool) -> Void) {
+    flutterAPI.echo(aBool) { completion($0) }
   }
 
-  func callFlutterEchoInt(anInt: Int32, completion: @escaping (Int32) -> Void) {
-    flutterAPI.echoInt(anInt: anInt) { completion($0) }
+  func callFlutterEcho(_ anInt: Int32, completion: @escaping (Int32) -> Void) {
+    flutterAPI.echo(anInt) { completion($0) }
   }
 
-  func callFlutterEchoDouble(aDouble: Double, completion: @escaping (Double) -> Void) {
-    flutterAPI.echoDouble(aDouble: aDouble) { completion($0) }
+  func callFlutterEcho(_ aDouble: Double, completion: @escaping (Double) -> Void) {
+    flutterAPI.echo(aDouble) { completion($0) }
   }
 
-  func callFlutterEchoString(aString: String, completion: @escaping (String) -> Void) {
-    flutterAPI.echoString(aString: aString) { completion($0) }
+  func callFlutterEcho(_ aString: String, completion: @escaping (String) -> Void) {
+    flutterAPI.echo(aString) { completion($0) }
   }
 
-  func callFlutterEchoUint8List(aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
-    flutterAPI.echoUint8List(aList: aList) { completion($0) }
+  func callFlutterEcho(_ aList: FlutterStandardTypedData, completion: @escaping (FlutterStandardTypedData) -> Void) {
+    flutterAPI.echo(aList) { completion($0) }
   }
 
-  func callFlutterEchoList(aList: [Any?], completion: @escaping ([Any?]) -> Void) {
-    flutterAPI.echoList(aList: aList) { completion($0) }
+  func callFlutterEcho(_ aList: [Any?], completion: @escaping ([Any?]) -> Void) {
+    flutterAPI.echo(aList) { completion($0) }
   }
 
-  func callFlutterEchoMap(aMap: [String? : Any?], completion: @escaping ([String? : Any?]) -> Void) {
-    flutterAPI.echoMap(aMap: aMap) { completion($0) }
+  func callFlutterEcho(_ aMap: [String? : Any?], completion: @escaping ([String? : Any?]) -> Void) {
+    flutterAPI.echo(aMap) { completion($0) }
   }
 
-  func callFlutterEchoNullableBool(aBool: Bool?, completion: @escaping (Bool?) -> Void) {
-    flutterAPI.echoNullableBool(aBool: aBool) { completion($0) }
+  func callFlutterEchoNullable(_ aBool: Bool?, completion: @escaping (Bool?) -> Void) {
+    flutterAPI.echoNullable(aBool) { completion($0) }
   }
 
-  func callFlutterEchoNullableInt(anInt: Int32?, completion: @escaping (Int32?) -> Void) {
-    flutterAPI.echoNullableInt(anInt: anInt) { completion($0) }
+  func callFlutterEchoNullable(_ anInt: Int32?, completion: @escaping (Int32?) -> Void) {
+    flutterAPI.echoNullable(anInt) { completion($0) }
   }
 
-  func callFlutterEchoNullableDouble(aDouble: Double?, completion: @escaping (Double?) -> Void) {
-    flutterAPI.echoNullableDouble(aDouble: aDouble) { completion($0) }
+  func callFlutterEchoNullable(_ aDouble: Double?, completion: @escaping (Double?) -> Void) {
+    flutterAPI.echoNullable(aDouble) { completion($0) }
   }
 
-  func callFlutterEchoNullableString(aString: String?, completion: @escaping (String?) -> Void) {
-    flutterAPI.echoNullableString(aString: aString) { completion($0) }
+  func callFlutterEchoNullable(_ aString: String?, completion: @escaping (String?) -> Void) {
+    flutterAPI.echoNullable(aString) { completion($0) }
   }
 
-  func callFlutterEchoNullableUint8List(aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
-    flutterAPI.echoNullableUint8List(aList: aList) { completion($0) }
+  func callFlutterEchoNullable(_ aList: FlutterStandardTypedData?, completion: @escaping (FlutterStandardTypedData?) -> Void) {
+    flutterAPI.echoNullable(aList) { completion($0) }
   }
 
-  func callFlutterEchoNullableList(aList: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
-    flutterAPI.echoNullableList(aList: aList) { completion($0) }
+  func callFlutterEchoNullable(_ aList: [Any?]?, completion: @escaping ([Any?]?) -> Void) {
+    flutterAPI.echoNullable(aList) { completion($0) }
   }
 
-  func callFlutterEchoNullableMap(aMap: [String? : Any?]?, completion: @escaping ([String? : Any?]?) -> Void) {
-    flutterAPI.echoNullableMap(aMap: aMap) { completion($0) }
+  func callFlutterEchoNullable(_ aMap: [String? : Any?]?, completion: @escaping ([String? : Any?]?) -> Void) {
+    flutterAPI.echoNullable(aMap) { completion($0) }
   }
 }
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 e1c00cc..94b9a49 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #undef _HAS_EXCEPTIONS
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 68a2397..51f6e21 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
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.0.5), do not edit directly.
+// Autogenerated from Pigeon (v7.1.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #ifndef PIGEON_CORE_TESTS_GEN_H_
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index 537b5e9..b779f0a 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -2,7 +2,7 @@
 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%3Apigeon
-version: 7.0.5 # This must match the version in lib/generator_tools.dart
+version: 7.1.0 # This must match the version in lib/generator_tools.dart
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/pigeon/test/pigeon_lib_test.dart b/packages/pigeon/test/pigeon_lib_test.dart
index 3d5c706..fd71be5 100644
--- a/packages/pigeon/test/pigeon_lib_test.dart
+++ b/packages/pigeon/test/pigeon_lib_test.dart
@@ -931,6 +931,52 @@
     expect(results.root.apis[0].methods[0].objcSelector, equals('foobar'));
   });
 
+  test('custom swift valid function signature', () {
+    const String code = '''
+@HostApi()
+abstract class Api {
+  @SwiftFunction('subtractValue(_:by:)')
+  void subtract(int x, int y);
+}
+''';
+    final ParseResults results = parseSource(code);
+    expect(results.errors.length, 0);
+    expect(results.root.apis.length, 1);
+    expect(results.root.apis[0].methods.length, equals(1));
+    expect(results.root.apis[0].methods[0].swiftFunction,
+        equals('subtractValue(_:by:)'));
+  });
+
+  test('custom swift invalid function signature', () {
+    const String code = '''
+@HostApi()
+abstract class Api {
+  @SwiftFunction('subtractValue(_:by:error:)')
+  void subtract(int x, int y);
+}
+''';
+    final ParseResults results = parseSource(code);
+    expect(results.errors.length, 1);
+    expect(results.errors[0].lineNumber, 3);
+    expect(results.errors[0].message,
+        contains('Invalid function signature, expected 2 arguments'));
+  });
+
+  test('custom swift function signature no arguments', () {
+    const String code = '''
+@HostApi()
+abstract class Api {
+  @SwiftFunction('foobar()')
+  void initialize();
+}
+''';
+    final ParseResults results = parseSource(code);
+    expect(results.errors.length, 0);
+    expect(results.root.apis.length, 1);
+    expect(results.root.apis[0].methods.length, equals(1));
+    expect(results.root.apis[0].methods[0].swiftFunction, equals('foobar()'));
+  });
+
   test('dart test has copyright', () {
     final Root root = Root(apis: <Api>[], classes: <Class>[], enums: <Enum>[]);
     const PigeonOptions options = PigeonOptions(
diff --git a/packages/pigeon/test/swift_generator_test.dart b/packages/pigeon/test/swift_generator_test.dart
index 1bf8594..1618216 100644
--- a/packages/pigeon/test/swift_generator_test.dart
+++ b/packages/pigeon/test/swift_generator_test.dart
@@ -1142,4 +1142,96 @@
     final String code = sink.toString();
     expect(code, contains(': FlutterStandardReader '));
   });
+
+  test('swift function signature', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
+          Method(
+            name: 'set',
+            arguments: <NamedType>[
+              NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'int',
+                  isNullable: false,
+                ),
+                name: 'value',
+              ),
+              NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'String',
+                  isNullable: false,
+                ),
+                name: 'key',
+              ),
+            ],
+            swiftFunction: 'setValue(_:for:)',
+            returnType: const TypeDeclaration.voidDeclaration(),
+          )
+        ])
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    const SwiftOptions swiftOptions = SwiftOptions();
+    const SwiftGenerator generator = SwiftGenerator();
+    generator.generate(swiftOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, contains('func setValue(_ value: Int32, for key: String)'));
+  });
+
+  test('swift function signature with same name argument', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
+          Method(
+            name: 'set',
+            arguments: <NamedType>[
+              NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'String',
+                  isNullable: false,
+                ),
+                name: 'key',
+              ),
+            ],
+            swiftFunction: 'removeValue(key:)',
+            returnType: const TypeDeclaration.voidDeclaration(),
+          )
+        ])
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    const SwiftOptions swiftOptions = SwiftOptions();
+    const SwiftGenerator generator = SwiftGenerator();
+    generator.generate(swiftOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, contains('func removeValue(key: String)'));
+  });
+
+  test('swift function signature with no arguments', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
+          Method(
+            name: 'clear',
+            arguments: <NamedType>[],
+            swiftFunction: 'removeAll()',
+            returnType: const TypeDeclaration.voidDeclaration(),
+          )
+        ])
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    const SwiftOptions swiftOptions = SwiftOptions();
+    const SwiftGenerator generator = SwiftGenerator();
+    generator.generate(swiftOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, contains('func removeAll()'));
+  });
 }