diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index bdf032f..6c3bdf7 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 7.0.1
+
+* [generator_tools] adds `newln` method for adding empty lines and ending lines.
+* Updates generators to more closely match Flutter formatter tool output.
+
 ## 7.0.0
 
 * [java] **BREAKING CHANGE**: Makes data classes final.
diff --git a/packages/pigeon/lib/cpp_generator.dart b/packages/pigeon/lib/cpp_generator.dart
index 71a3a24..844e80e 100644
--- a/packages/pigeon/lib/cpp_generator.dart
+++ b/packages/pigeon/lib/cpp_generator.dart
@@ -104,7 +104,7 @@
     }
     indent.writeln('$_commentPrefix $generatedCodeWarning');
     indent.writeln('$_commentPrefix $seeAlsoWarning');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -119,34 +119,34 @@
       'flutter/encodable_value.h',
       'flutter/standard_message_codec.h',
     ]);
-    indent.addln('');
+    indent.newln();
     _writeSystemHeaderIncludeBlock(indent, <String>[
       'map',
       'string',
       'optional',
     ]);
-    indent.addln('');
+    indent.newln();
     if (generatorOptions.namespace != null) {
       indent.writeln('namespace ${generatorOptions.namespace} {');
     }
-    indent.addln('');
+    indent.newln();
     if (generatorOptions.namespace?.endsWith('_pigeontest') ?? false) {
       final String testFixtureClass =
           '${_pascalCaseFromSnakeCase(generatorOptions.namespace!.replaceAll('_pigeontest', ''))}Test';
       indent.writeln('class $testFixtureClass;');
     }
-    indent.addln('');
+    indent.newln();
     indent.writeln('$_commentPrefix Generated class from Pigeon.');
   }
 
   @override
   void writeEnum(
       CppOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
-    indent.writeln('');
+    indent.newln();
     addDocumentationComments(
         indent, anEnum.documentationComments, _docCommentSpec);
     indent.write('enum class ${anEnum.name} ');
-    indent.scoped('{', '};', () {
+    indent.addScoped('{', '};', () {
       enumerate(anEnum.members, (int index, final EnumMember member) {
         addDocumentationComments(
             indent, member.documentationComments, _docCommentSpec);
@@ -173,7 +173,7 @@
       testFixtureClass =
           '${_pascalCaseFromSnakeCase(generatorOptions.namespace!.replaceAll('_pigeontest', ''))}Test';
     }
-    indent.addln('');
+    indent.newln();
 
     const List<String> generatedMessages = <String>[
       ' Generated class from Pigeon that represents data sent in messages.'
@@ -184,8 +184,8 @@
         generatorComments: generatedMessages);
 
     indent.write('class ${klass.name} ');
-    indent.scoped('{', '};', () {
-      indent.scoped(' public:', '', () {
+    indent.addScoped('{', '};', () {
+      indent.addScoped(' public:', '', () {
         indent.writeln('${klass.name}();');
         for (final NamedType field in getFieldsInSerializationOrder(klass)) {
           addDocumentationComments(
@@ -204,11 +204,11 @@
             indent.writeln(
                 'void ${_makeSetterName(field)}(${_unownedArgumentType(nonNullType)} value_arg);');
           }
-          indent.addln('');
+          indent.newln();
         }
       });
 
-      indent.scoped(' private:', '', () {
+      indent.addScoped(' private:', '', () {
         indent.writeln('${klass.name}(const flutter::EncodableList& list);');
         indent.writeln('flutter::EncodableList ToEncodableList() const;');
         for (final Class friend in root.classes) {
@@ -236,7 +236,7 @@
         }
       });
     }, nestCount: 0);
-    indent.writeln('');
+    indent.newln();
   }
 
   @override
@@ -256,14 +256,14 @@
     addDocumentationComments(indent, api.documentationComments, _docCommentSpec,
         generatorComments: generatedMessages);
     indent.write('class ${api.name} ');
-    indent.scoped('{', '};', () {
-      indent.scoped(' private:', '', () {
+    indent.addScoped('{', '};', () {
+      indent.addScoped(' private:', '', () {
         indent.writeln('flutter::BinaryMessenger* binary_messenger_;');
       });
-      indent.scoped(' public:', '', () {
+      indent.addScoped(' public:', '', () {
         indent
             .write('${api.name}(flutter::BinaryMessenger* binary_messenger);');
-        indent.writeln('');
+        indent.newln();
         indent
             .writeln('static const flutter::StandardMessageCodec& GetCodec();');
         for (final Method func in api.methods) {
@@ -288,7 +288,7 @@
         }
       });
     }, nestCount: 0);
-    indent.writeln('');
+    indent.newln();
   }
 
   @override
@@ -308,8 +308,8 @@
     addDocumentationComments(indent, api.documentationComments, _docCommentSpec,
         generatorComments: generatedMessages);
     indent.write('class ${api.name} ');
-    indent.scoped('{', '};', () {
-      indent.scoped(' public:', '', () {
+    indent.addScoped('{', '};', () {
+      indent.addScoped(' public:', '', () {
         indent.writeln('${api.name}(const ${api.name}&) = delete;');
         indent.writeln('${api.name}& operator=(const ${api.name}&) = delete;');
         indent.writeln('virtual ~${api.name}() { };');
@@ -347,7 +347,7 @@
                 'virtual $returnTypeName ${_makeMethodName(method)}(${argSignature.join(', ')}) = 0;');
           }
         }
-        indent.addln('');
+        indent.newln();
         indent.writeln('$_commentPrefix The codec used by ${api.name}.');
         indent
             .writeln('static const flutter::StandardMessageCodec& GetCodec();');
@@ -360,7 +360,7 @@
         indent.writeln(
             'static flutter::EncodableValue WrapError(const FlutterError& error);');
       });
-      indent.scoped(' protected:', '', () {
+      indent.addScoped(' protected:', '', () {
         indent.writeln('${api.name}() = default;');
       });
     }, nestCount: 0);
@@ -372,9 +372,9 @@
     final String codeSerializerName = _getCodecSerializerName(api);
     indent
         .write('class $codeSerializerName : public $_defaultCodecSerializer ');
-    indent.scoped('{', '};', () {
-      indent.scoped(' public:', '', () {
-        indent.writeln('');
+    indent.addScoped('{', '};', () {
+      indent.addScoped(' public:', '', () {
+        indent.newln();
         indent.format('''
 inline static $codeSerializerName& GetInstance() {
 \tstatic $codeSerializerName sInstance;
@@ -392,7 +392,7 @@
             'flutter::EncodableValue ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const override;');
       });
     }, nestCount: 0);
-    indent.addln('');
+    indent.newln();
   }
 
   void _writeErrorOr(Indent indent,
@@ -468,28 +468,28 @@
     }
     indent.writeln('$_commentPrefix $generatedCodeWarning');
     indent.writeln('$_commentPrefix $seeAlsoWarning');
-    indent.addln('');
+    indent.newln();
     indent.addln('#undef _HAS_EXCEPTIONS');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
   void writeFileImports(CppOptions generatorOptions, Root root, Indent indent) {
     indent.writeln('#include "${generatorOptions.headerIncludePath}"');
-    indent.addln('');
+    indent.newln();
     _writeSystemHeaderIncludeBlock(indent, <String>[
       'flutter/basic_message_channel.h',
       'flutter/binary_messenger.h',
       'flutter/encodable_value.h',
       'flutter/standard_message_codec.h',
     ]);
-    indent.addln('');
+    indent.newln();
     _writeSystemHeaderIncludeBlock(indent, <String>[
       'map',
       'string',
       'optional',
     ]);
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -508,9 +508,9 @@
     final Set<String> customEnumNames =
         root.enums.map((Enum x) => x.name).toSet();
 
-    indent.addln('');
+    indent.newln();
     indent.writeln('$_commentPrefix ${klass.name}');
-    indent.addln('');
+    indent.newln();
 
     // Getters and setters.
     for (final NamedType field in getFieldsInSerializationOrder(klass)) {
@@ -523,7 +523,7 @@
 
     // Default constructor.
     indent.writeln('${klass.name}::${klass.name}() {}');
-    indent.addln('');
+    indent.newln();
 
     // Deserialization.
     writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
@@ -541,8 +541,8 @@
   ) {
     indent.write(
         'flutter::EncodableList ${klass.name}::ToEncodableList() const ');
-    indent.scoped('{', '}', () {
-      indent.scoped('return flutter::EncodableList{', '};', () {
+    indent.addScoped('{', '}', () {
+      indent.addScoped('return flutter::EncodableList{', '};', () {
         for (final NamedType field in getFieldsInSerializationOrder(klass)) {
           final HostDatatype hostDatatype = getFieldHostDatatype(
               field, root.classes, root.enums, _baseCppTypeForBuiltinDartType);
@@ -552,7 +552,7 @@
         }
       });
     });
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -566,7 +566,7 @@
   ) {
     indent.write(
         '${klass.name}::${klass.name}(const flutter::EncodableList& list) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       enumerate(getFieldsInSerializationOrder(klass),
           (int index, final NamedType field) {
         final String instanceVariableName = _makeInstanceVariableName(field);
@@ -593,21 +593,20 @@
                   .contains(field.type.baseName)) {
             indent.write(
                 'if (const flutter::EncodableList* $pointerFieldName = std::get_if<flutter::EncodableList>(&$encodableFieldName)) ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln(
                   '$instanceVariableName = ${hostDatatype.datatype}(*$pointerFieldName);');
             });
           } else {
             indent.write(
                 'if (const ${hostDatatype.datatype}* $pointerFieldName = std::get_if<${hostDatatype.datatype}>(&$encodableFieldName)) ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln('$instanceVariableName = *$pointerFieldName;');
             });
           }
         }
       });
     });
-    indent.addln('');
   }
 
   @override
@@ -625,10 +624,10 @@
         '$_commentPrefix Generated class from Pigeon that represents Flutter messages that can be called from C++.');
     indent.write(
         '${api.name}::${api.name}(flutter::BinaryMessenger* binary_messenger) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('this->binary_messenger_ = binary_messenger;');
     });
-    indent.writeln('');
+    indent.newln();
     final String codeSerializerName = getCodecClasses(api, root).isNotEmpty
         ? _getCodecSerializerName(api)
         : _defaultCodecSerializer;
@@ -657,7 +656,7 @@
       ];
       indent.write(
           'void ${api.name}::${_makeMethodName(func)}(${parameters.join(', ')}) ');
-      indent.scoped('{', '}', () {
+      indent.writeScoped('{', '}', () {
         const String channel = 'channel';
         indent.writeln(
             'auto channel = std::make_unique<flutter::BasicMessageChannel<>>(binary_messenger_, '
@@ -669,7 +668,7 @@
         if (func.arguments.isEmpty) {
           indent.addln('flutter::EncodableValue();');
         } else {
-          indent.scoped(
+          indent.addScoped(
               'flutter::EncodableValue(flutter::EncodableList{', '});', () {
             for (final _HostNamedType param in hostParameters) {
               final String encodedArgument = _wrappedHostApiArgumentExpression(
@@ -683,7 +682,7 @@
             // ignore: missing_whitespace_between_adjacent_strings
             '[on_success = std::move(on_success), on_error = std::move(on_error)]'
             '(const uint8_t* reply, size_t reply_size) ');
-        indent.scoped('{', '});', () {
+        indent.addScoped('{', '});', () {
           final String successCallbackArgument;
           if (func.returnType.isVoid) {
             successCallbackArgument = '';
@@ -725,21 +724,21 @@
         '$_commentPrefix Sets up an instance of `${api.name}` to handle messages through the `binary_messenger`.');
     indent.write(
         'void ${api.name}::SetUp(flutter::BinaryMessenger* binary_messenger, ${api.name}* api) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final Method method in api.methods) {
         final String channelName = makeChannelName(api, method);
         indent.write('');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           indent.writeln(
               'auto channel = std::make_unique<flutter::BasicMessageChannel<>>(binary_messenger, '
               '"$channelName", &GetCodec());');
           indent.write('if (api != nullptr) ');
-          indent.scoped('{', '} else {', () {
+          indent.addScoped('{', '} else {', () {
             indent.write(
                 'channel->SetMessageHandler([api](const flutter::EncodableValue& message, const flutter::MessageReply<flutter::EncodableValue>& reply) ');
-            indent.scoped('{', '});', () {
+            indent.addScoped('{', '});', () {
               indent.write('try ');
-              indent.scoped('{', '}', () {
+              indent.addScoped('{', '}', () {
                 final List<String> methodArgument = <String>[];
                 if (method.arguments.isNotEmpty) {
                   indent.writeln(
@@ -760,7 +759,7 @@
                         'const auto& $encodableArgName = args.at($index);');
                     if (!arg.type.isNullable) {
                       indent.write('if ($encodableArgName.IsNull()) ');
-                      indent.scoped('{', '}', () {
+                      indent.addScoped('{', '}', () {
                         indent.writeln(
                             'reply(WrapError("$argName unexpectedly null."));');
                         indent.writeln('return;');
@@ -793,9 +792,9 @@
                   indent.writeln('$returnTypeName output = $call;');
                   indent.format(_wrapResponse(indent, root, method.returnType));
                 }
-              });
-              indent.write('catch (const std::exception& exception) ');
-              indent.scoped('{', '}', () {
+              }, addTrailingNewline: false);
+              indent.add(' catch (const std::exception& exception) ');
+              indent.addScoped('{', '}', () {
                 // There is a potential here for `reply` to be called twice, which
                 // is a violation of the API contract, because there's no way of
                 // knowing whether or not the plugin code called `reply` before
@@ -808,14 +807,14 @@
               });
             });
           });
-          indent.scoped(null, '}', () {
+          indent.addScoped(null, '}', () {
             indent.writeln('channel->SetMessageHandler(nullptr);');
           });
         });
       }
     });
 
-    indent.addln('');
+    indent.newln();
     indent.format('''
 flutter::EncodableValue ${api.name}::WrapError(std::string_view error_message) {
 \treturn flutter::EncodableValue(flutter::EncodableList{
@@ -831,7 +830,7 @@
 \t\terror.details()
 \t});
 }''');
-    indent.addln('');
+    indent.newln();
   }
 
   void _writeCodec(
@@ -842,12 +841,13 @@
   ) {
     assert(getCodecClasses(api, root).isNotEmpty);
     final String codeSerializerName = _getCodecSerializerName(api);
+    indent.newln();
     indent.writeln('$codeSerializerName::$codeSerializerName() {}');
     indent.write(
         'flutter::EncodableValue $codeSerializerName::ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('switch (type) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
           indent.write('case ${customClass.enumeration}:');
           indent.writeScoped('', '', () {
@@ -862,17 +862,17 @@
         }, addTrailingNewline: false);
       });
     });
-    indent.writeln('');
+    indent.newln();
     indent.write(
         'void $codeSerializerName::WriteValue(const flutter::EncodableValue& value, flutter::ByteStreamWriter* stream) const ');
     indent.writeScoped('{', '}', () {
       indent.write(
           'if (const flutter::CustomEncodableValue* custom_value = std::get_if<flutter::CustomEncodableValue>(&value)) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
           indent.write(
               'if (custom_value->type() == typeid(${customClass.name})) ');
-          indent.scoped('{', '}', () {
+          indent.addScoped('{', '}', () {
             indent.writeln('stream->WriteByte(${customClass.enumeration});');
             indent.writeln(
                 'WriteValue(flutter::EncodableValue(std::any_cast<${customClass.name}>(*custom_value).ToEncodableList()), stream);');
@@ -882,7 +882,7 @@
       });
       indent.writeln('$_defaultCodecSerializer::WriteValue(value, stream);');
     });
-    indent.writeln('');
+    indent.newln();
   }
 
   void _writeCppSourceClassField(CppOptions generatorOptions, Root root,
@@ -919,7 +919,7 @@
       indent.writeln(makeSetter(nonNullType));
     }
 
-    indent.addln('');
+    indent.newln();
   }
 
   String _wrapResponse(Indent indent, Root root, TypeDeclaration returnType,
diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart
index 3b62aff..b45a9a9 100644
--- a/packages/pigeon/lib/dart_generator.dart
+++ b/packages/pigeon/lib/dart_generator.dart
@@ -86,7 +86,7 @@
     indent.writeln(
       '// 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',
     );
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -96,7 +96,7 @@
     indent.writeln(
       "import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;",
     );
-    indent.addln('');
+    indent.newln();
     indent.writeln(
         "import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;");
     indent.writeln("import 'package:flutter/services.dart';");
@@ -105,11 +105,11 @@
   @override
   void writeEnum(
       DartOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
-    indent.writeln('');
+    indent.newln();
     addDocumentationComments(
         indent, anEnum.documentationComments, _docCommentSpec);
     indent.write('enum ${anEnum.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final EnumMember member in anEnum.members) {
         addDocumentationComments(
             indent, member.documentationComments, _docCommentSpec);
@@ -126,25 +126,25 @@
     final Set<String> customEnumNames =
         root.enums.map((Enum x) => x.name).toSet();
 
-    indent.writeln('');
+    indent.newln();
     addDocumentationComments(
         indent, klass.documentationComments, _docCommentSpec);
 
     indent.write('class ${klass.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       _writeConstructor(indent, klass);
-      indent.addln('');
+      indent.newln();
       for (final NamedType field in getFieldsInSerializationOrder(klass)) {
         addDocumentationComments(
             indent, field.documentationComments, _docCommentSpec);
 
         final String datatype = _addGenericTypesNullable(field.type);
         indent.writeln('$datatype ${field.name};');
-        indent.writeln('');
+        indent.newln();
       }
       writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
           customEnumNames);
-      indent.writeln('');
+      indent.newln();
       writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
           customEnumNames);
     });
@@ -152,7 +152,7 @@
 
   void _writeConstructor(Indent indent, Class klass) {
     indent.write(klass.name);
-    indent.scoped('({', '});', () {
+    indent.addScoped('({', '});', () {
       for (final NamedType field in getFieldsInSerializationOrder(klass)) {
         final String required = field.type.isNullable ? '' : 'required ';
         indent.writeln('${required}this.${field.name},');
@@ -170,11 +170,11 @@
     Set<String> customEnumNames,
   ) {
     indent.write('Object encode() ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write(
         'return <Object?>',
       );
-      indent.scoped('[', '];', () {
+      indent.addScoped('[', '];', () {
         for (final NamedType field in getFieldsInSerializationOrder(klass)) {
           final String conditional = field.type.isNullable ? '?' : '';
           if (customClassNames.contains(field.type.baseName)) {
@@ -207,27 +207,25 @@
       if (customClassNames.contains(field.type.baseName)) {
         final String nonNullValue =
             '${field.type.baseName}.decode($resultAt! as List<Object?>)';
-        indent.format(
-            field.type.isNullable
-                ? '''
+        if (field.type.isNullable) {
+          indent.format('''
 $resultAt != null
 \t\t? $nonNullValue
-\t\t: null'''
-                : nonNullValue,
-            leadingSpace: false,
-            trailingNewline: false);
+\t\t: null''', leadingSpace: false, trailingNewline: false);
+        } else {
+          indent.add(nonNullValue);
+        }
       } else if (customEnumNames.contains(field.type.baseName)) {
         final String nonNullValue =
             '${field.type.baseName}.values[$resultAt! as int]';
-        indent.format(
-            field.type.isNullable
-                ? '''
+        if (field.type.isNullable) {
+          indent.format('''
 $resultAt != null
 \t\t? $nonNullValue
-\t\t: null'''
-                : nonNullValue,
-            leadingSpace: false,
-            trailingNewline: false);
+\t\t: null''', leadingSpace: false, trailingNewline: false);
+        } else {
+          indent.add(nonNullValue);
+        }
       } else if (field.type.typeArguments.isNotEmpty) {
         final String genericType = _makeGenericTypeArguments(field.type);
         final String castCall = _makeGenericCastCall(field.type);
@@ -252,10 +250,10 @@
     indent.write(
       'static ${klass.name} decode(Object result) ',
     );
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('result as List<Object?>;');
       indent.write('return ${klass.name}');
-      indent.scoped('(', ');', () {
+      indent.addScoped('(', ');', () {
         enumerate(getFieldsInSerializationOrder(klass),
             (int index, final NamedType field) {
           indent.write('${field.name}: ');
@@ -292,15 +290,15 @@
       codecName = _getCodecName(api);
       _writeCodec(indent, codecName, api, root);
     }
-    indent.addln('');
+    indent.newln();
     addDocumentationComments(
         indent, api.documentationComments, _docCommentSpec);
 
     indent.write('abstract class ${api.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent
           .writeln('static const MessageCodec<Object?> codec = $codecName();');
-      indent.addln('');
+      indent.newln();
       for (final Method func in api.methods) {
         addDocumentationComments(
             indent, func.documentationComments, _docCommentSpec);
@@ -314,14 +312,14 @@
           _getArgumentName,
         );
         indent.writeln('$returnType ${func.name}($argSignature);');
-        indent.writeln('');
+        indent.newln();
       }
       indent.write(
           'static void setup(${api.name}? api, {BinaryMessenger? binaryMessenger}) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         for (final Method func in api.methods) {
           indent.write('');
-          indent.scoped('{', '}', () {
+          indent.addScoped('{', '}', () {
             indent.writeln(
               'final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(',
             );
@@ -337,15 +335,15 @@
             final String messageHandlerSetter =
                 isMockHandler ? 'setMockMessageHandler' : 'setMessageHandler';
             indent.write('if (api == null) ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln('channel.$messageHandlerSetter(null);');
             }, addTrailingNewline: false);
             indent.add(' else ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.write(
                 'channel.$messageHandlerSetter((Object? message) async ',
               );
-              indent.scoped('{', '});', () {
+              indent.addScoped('{', '});', () {
                 final String returnType =
                     _addGenericTypesNullable(func.returnType);
                 final bool isAsync = func.isAsynchronous;
@@ -382,8 +380,9 @@
                           '$leftHandSide = ($argsArray[$count] as $genericArgType?)${castCall.isEmpty ? '' : '?$castCall'};');
                     }
                     if (!arg.type.isNullable) {
+                      indent.writeln('assert($argName != null,');
                       indent.writeln(
-                          "assert($argName != null, 'Argument for $channelName was null, expected non-null $argType.');");
+                          "    'Argument for $channelName was null, expected non-null $argType.');");
                     }
                   });
                   final Iterable<String> argNames =
@@ -446,12 +445,12 @@
       codecName = _getCodecName(api);
       _writeCodec(indent, codecName, api, root);
     }
-    indent.addln('');
+    indent.newln();
     bool first = true;
     addDocumentationComments(
         indent, api.documentationComments, _docCommentSpec);
     indent.write('class ${api.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.format('''
 /// Constructor for [${api.name}].  The [binaryMessenger] named argument is
 /// available for dependency injection.  If it is left null, the default
@@ -463,10 +462,10 @@
 
       indent
           .writeln('static const MessageCodec<Object?> codec = $codecName();');
-      indent.addln('');
+      indent.newln();
       for (final Method func in api.methods) {
         if (!first) {
-          indent.writeln('');
+          indent.newln();
         } else {
           first = false;
         }
@@ -494,7 +493,7 @@
         indent.write(
           'Future<${_addGenericTypesNullable(func.returnType)}> ${func.name}($argSignature) async ',
         );
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           final String channelName = makeChannelName(api, func);
           indent.writeln(
               'final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(');
@@ -585,7 +584,6 @@
           dartHostTestHandler: api.dartHostTestHandler,
           documentationComments: api.documentationComments,
         );
-        indent.writeln('');
         writeFlutterApi(
           generatorOptions,
           root,
@@ -621,7 +619,7 @@
         "import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;");
     indent.writeln("import 'package:flutter/services.dart';");
     indent.writeln("import 'package:flutter_test/flutter_test.dart';");
-    indent.writeln('');
+    indent.newln();
   }
 }
 
@@ -642,33 +640,34 @@
 void _writeCodec(Indent indent, String codecName, Api api, Root root) {
   assert(getCodecClasses(api, root).isNotEmpty);
   final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
+  indent.newln();
   indent.write('class $codecName extends $_standardMessageCodec');
-  indent.scoped(' {', '}', () {
+  indent.addScoped(' {', '}', () {
     indent.writeln('const $codecName();');
     indent.writeln('@override');
     indent.write('void writeValue(WriteBuffer buffer, Object? value) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       enumerate(codecClasses, (int index, final EnumeratedClass customClass) {
         final String ifValue = 'if (value is ${customClass.name}) ';
         if (index == 0) {
           indent.write('');
         }
         indent.add(ifValue);
-        indent.scoped('{', '} else ', () {
+        indent.addScoped('{', '} else ', () {
           indent.writeln('buffer.putUint8(${customClass.enumeration});');
           indent.writeln('writeValue(buffer, value.encode());');
         }, addTrailingNewline: false);
       });
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('super.writeValue(buffer, value);');
       });
     });
-    indent.writeln('');
+    indent.newln();
     indent.writeln('@override');
     indent.write('Object? readValueOfType(int type, ReadBuffer buffer) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('switch (type) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         for (final EnumeratedClass customClass in codecClasses) {
           indent.write('case ${customClass.enumeration}: ');
           indent.writeScoped('', '', () {
@@ -677,7 +676,7 @@
           });
         }
         indent.writeln('default:');
-        indent.scoped('', '', () {
+        indent.nest(1, () {
           indent.writeln('return super.readValueOfType(type, buffer);');
         });
       });
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 5cfbcc5..972cd34 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -9,7 +9,7 @@
 import 'ast.dart';
 
 /// The current version of pigeon. This must match the version in pubspec.yaml.
-const String pigeonVersion = '7.0.0';
+const String pigeonVersion = '7.0.1';
 
 /// Read all the content from [stdin] to a String.
 String readStdin() {
@@ -83,7 +83,7 @@
 
   /// Scoped increase of the ident level.  For the execution of [func] the
   /// indentation will be incremented.
-  void scoped(
+  void addScoped(
     String? begin,
     String? end,
     Function func, {
@@ -102,14 +102,14 @@
     }
   }
 
-  /// Like `scoped` but writes the current indentation level.
+  /// Like `addScoped` but writes the current indentation level.
   void writeScoped(
     String? begin,
     String end,
     Function func, {
     bool addTrailingNewline = true,
   }) {
-    scoped(str() + (begin ?? ''), end, func,
+    addScoped(str() + (begin ?? ''), end, func,
         addTrailingNewline: addTrailingNewline);
   }
 
@@ -144,6 +144,13 @@
   void add(String text) {
     _sink.write(text);
   }
+
+  /// Adds [lines] number of newlines.
+  void newln([int lines = 1]) {
+    for (; lines > 0; lines--) {
+      _sink.write(newline);
+    }
+  }
 }
 
 /// Create the generated channel name for a [func] on a [api].
diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart
index 65d82bf..ec5ead0 100644
--- a/packages/pigeon/lib/java_generator.dart
+++ b/packages/pigeon/lib/java_generator.dart
@@ -98,7 +98,7 @@
     }
     indent.writeln('// $generatedCodeWarning');
     indent.writeln('// $seeAlsoWarning');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -106,6 +106,7 @@
       JavaOptions generatorOptions, Root root, Indent indent) {
     if (generatorOptions.package != null) {
       indent.writeln('package ${generatorOptions.package};');
+      indent.newln();
     }
     indent.writeln('import android.util.Log;');
     indent.writeln('import androidx.annotation.NonNull;');
@@ -116,13 +117,13 @@
     indent.writeln('import io.flutter.plugin.common.StandardMessageCodec;');
     indent.writeln('import java.io.ByteArrayOutputStream;');
     indent.writeln('import java.nio.ByteBuffer;');
-    indent.writeln('import java.util.Arrays;');
     indent.writeln('import java.util.ArrayList;');
+    indent.writeln('import java.util.Arrays;');
     indent.writeln('import java.util.Collections;');
+    indent.writeln('import java.util.HashMap;');
     indent.writeln('import java.util.List;');
     indent.writeln('import java.util.Map;');
-    indent.writeln('import java.util.HashMap;');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -149,22 +150,23 @@
           .toUpperCase();
     }
 
-    indent.writeln('');
+    indent.newln();
     addDocumentationComments(
         indent, anEnum.documentationComments, _docCommentSpec);
 
     indent.write('public enum ${anEnum.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       enumerate(anEnum.members, (int index, final EnumMember member) {
         addDocumentationComments(
             indent, member.documentationComments, _docCommentSpec);
         indent.writeln(
             '${camelToSnake(member.name)}($index)${index == anEnum.members.length - 1 ? ';' : ','}');
       });
-      indent.writeln('');
+      indent.newln();
       indent.writeln('private final int index;');
+      indent.newln();
       indent.write('private ${anEnum.name}(final int index) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('this.index = index;');
       });
     });
@@ -181,24 +183,25 @@
     const List<String> generatedMessages = <String>[
       ' Generated class from Pigeon that represents data sent in messages.'
     ];
-    indent.addln('');
+    indent.newln();
     addDocumentationComments(
         indent, klass.documentationComments, _docCommentSpec,
         generatorComments: generatedMessages);
 
     indent.write('public static final class ${klass.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final NamedType field in getFieldsInSerializationOrder(klass)) {
         _writeClassField(generatorOptions, root, indent, field);
-        indent.addln('');
+        indent.newln();
       }
 
       if (getFieldsInSerializationOrder(klass)
           .map((NamedType e) => !e.type.isNullable)
           .any((bool e) => e)) {
         indent.writeln(
-            '${_docCommentPrefix}Constructor is private to enforce null safety; use Builder.$_docCommentSuffix');
+            '$_docCommentPrefix Constructor is private to enforce null safety; use Builder.$_docCommentSuffix');
         indent.writeln('private ${klass.name}() {}');
+        indent.newln();
       }
 
       _writeClassBuilder(generatorOptions, root, indent, klass);
@@ -219,8 +222,13 @@
 
     indent.writeln(
         'private $nullability ${hostDatatype.datatype} ${field.name};');
-    indent.writeln(
-        'public $nullability ${hostDatatype.datatype} ${_makeGetter(field)}() { return ${field.name}; }');
+    indent.newln();
+    indent.write(
+        'public $nullability ${hostDatatype.datatype} ${_makeGetter(field)}() ');
+    indent.addScoped('{', '}', () {
+      indent.writeln('return ${field.name};');
+    });
+    indent.newln();
     indent.writeScoped(
         'public void ${_makeSetter(field)}($nullability ${hostDatatype.datatype} setterArg) {',
         '}', () {
@@ -241,7 +249,7 @@
     Class klass,
   ) {
     indent.write('public static final class Builder ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final NamedType field in getFieldsInSerializationOrder(klass)) {
         final HostDatatype hostDatatype = getFieldHostDatatype(
             field,
@@ -250,8 +258,10 @@
             (TypeDeclaration x) => _javaTypeForBuiltinDartType(x));
         final String nullability =
             field.type.isNullable ? '@Nullable' : '@NonNull';
+        indent.newln();
         indent.writeln(
             'private @Nullable ${hostDatatype.datatype} ${field.name};');
+        indent.newln();
         indent.writeScoped(
             'public @NonNull Builder ${_makeSetter(field)}($nullability ${hostDatatype.datatype} setterArg) {',
             '}', () {
@@ -259,8 +269,9 @@
           indent.writeln('return this;');
         });
       }
+      indent.newln();
       indent.write('public @NonNull ${klass.name} build() ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         const String returnVal = 'pigeonReturn';
         indent.writeln('${klass.name} $returnVal = new ${klass.name}();');
         for (final NamedType field in getFieldsInSerializationOrder(klass)) {
@@ -280,8 +291,10 @@
     Set<String> customClassNames,
     Set<String> customEnumNames,
   ) {
-    indent.write('@NonNull ArrayList<Object> toList() ');
-    indent.scoped('{', '}', () {
+    indent.newln();
+    indent.writeln('@NonNull');
+    indent.write('ArrayList<Object> toList() ');
+    indent.addScoped('{', '}', () {
       indent.writeln(
           'ArrayList<Object> toListResult = new ArrayList<Object>(${klass.fields.length});');
       for (final NamedType field in getFieldsInSerializationOrder(klass)) {
@@ -316,9 +329,10 @@
     Set<String> customClassNames,
     Set<String> customEnumNames,
   ) {
+    indent.newln();
     indent.write(
         'static @NonNull ${klass.name} fromList(@NonNull ArrayList<Object> list) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       const String result = 'pigeonResult';
       indent.writeln('${klass.name} $result = new ${klass.name}();');
       enumerate(getFieldsInSerializationOrder(klass),
@@ -365,26 +379,28 @@
         generatorComments: generatedMessages);
 
     indent.write('public static final class ${api.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('private final BinaryMessenger binaryMessenger;');
-      indent.write('public ${api.name}(BinaryMessenger argBinaryMessenger)');
-      indent.scoped('{', '}', () {
+      indent.newln();
+      indent.write('public ${api.name}(BinaryMessenger argBinaryMessenger) ');
+      indent.addScoped('{', '}', () {
         indent.writeln('this.binaryMessenger = argBinaryMessenger;');
       });
+      indent.newln();
       indent.write('/** Public interface for sending reply. */ ');
       indent.write('public interface Reply<T> ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('void reply(T reply);');
       });
       final String codecName = _getCodecName(api);
       indent.writeln('/** The codec used by ${api.name}. */');
       indent.write('static MessageCodec<Object> getCodec() ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.write('return ');
         if (getCodecClasses(api, root).isNotEmpty) {
-          indent.writeln('$codecName.INSTANCE;');
+          indent.addln('$codecName.INSTANCE;');
         } else {
-          indent.writeln('new $_standardMessageCodec();');
+          indent.addln('new $_standardMessageCodec();');
         }
       });
 
@@ -418,32 +434,36 @@
           indent.write(
               'public void ${func.name}($argsSignature, Reply<$returnType> callback) ');
         }
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           const String channel = 'channel';
           indent.writeln('BasicMessageChannel<Object> $channel =');
-          indent.inc();
-          indent.inc();
-          indent.writeln(
-              'new BasicMessageChannel<>(binaryMessenger, "$channelName", getCodec());');
-          indent.dec();
-          indent.dec();
-          indent.write('$channel.send($sendArgument, channelReply -> ');
-          if (func.returnType.isVoid) {
-            indent.addln('callback.reply(null));');
-          } else {
-            indent.scoped('{', '});', () {
-              const String output = 'output';
-              indent.writeln('@SuppressWarnings("ConstantConditions")');
-              if (func.returnType.baseName == 'int') {
-                indent.writeln(
-                    '$returnType $output = channelReply == null ? null : ((Number)channelReply).longValue();');
-              } else {
-                indent.writeln(
-                    '$returnType $output = ($returnType)channelReply;');
-              }
-              indent.writeln('callback.reply($output);');
+          indent.nest(2, () {
+            indent.writeln('new BasicMessageChannel<>(');
+            indent.nest(2, () {
+              indent.writeln('binaryMessenger, "$channelName", getCodec());');
             });
-          }
+          });
+          indent.writeln('$channel.send(');
+          indent.nest(2, () {
+            indent.writeln('$sendArgument,');
+            indent.write('channelReply -> ');
+            if (func.returnType.isVoid) {
+              indent.addln('callback.reply(null));');
+            } else {
+              indent.addScoped('{', '});', () {
+                const String output = 'output';
+                indent.writeln('@SuppressWarnings("ConstantConditions")');
+                if (func.returnType.baseName == 'int') {
+                  indent.writeln(
+                      '$returnType $output = channelReply == null ? null : ((Number) channelReply).longValue();');
+                } else {
+                  indent.writeln(
+                      '$returnType $output = ($returnType) channelReply;');
+                }
+                indent.writeln('callback.reply($output);');
+              });
+            }
+          });
         });
       }
     });
@@ -454,7 +474,7 @@
     if (root.apis.any((Api api) =>
         api.location == ApiLocation.host &&
         api.methods.any((Method it) => it.isAsynchronous))) {
-      indent.addln('');
+      indent.newln();
       _writeResultInterface(indent);
     }
     super.writeApis(generatorOptions, root, indent);
@@ -480,20 +500,20 @@
         generatorComments: generatedMessages);
 
     indent.write('public interface ${api.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final Method method in api.methods) {
         _writeInterfaceMethod(generatorOptions, root, indent, api, method);
       }
-      indent.addln('');
+      indent.newln();
       final String codecName = _getCodecName(api);
       indent.writeln('/** The codec used by ${api.name}. */');
       indent.write('static MessageCodec<Object> getCodec() ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.write('return ');
         if (getCodecClasses(api, root).isNotEmpty) {
-          indent.write('$codecName.INSTANCE;');
+          indent.addln('$codecName.INSTANCE;');
         } else {
-          indent.write('new $_standardMessageCodec();');
+          indent.addln('new $_standardMessageCodec();');
         }
       });
 
@@ -501,7 +521,7 @@
           '${_docCommentPrefix}Sets up an instance of `${api.name}` to handle messages through the `binaryMessenger`.$_docCommentSuffix');
       indent.write(
           'static void setup(BinaryMessenger binaryMessenger, ${api.name} api) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         for (final Method method in api.methods) {
           _writeMethodSetup(generatorOptions, root, indent, api, method);
         }
@@ -514,9 +534,12 @@
   ///   int add(int x, int y);
   void _writeInterfaceMethod(JavaOptions generatorOptions, Root root,
       Indent indent, Api api, final Method method) {
+    final String nullableType = method.isAsynchronous
+        ? ''
+        : _nullabilityAnnotationFromType(method.returnType);
     final String returnType = method.isAsynchronous
         ? 'void'
-        : _nullsafeJavaTypeForDartType(method.returnType);
+        : _javaTypeForDartType(method.returnType);
     final List<String> argSignature = <String>[];
     if (method.arguments.isNotEmpty) {
       final Iterable<String> argTypes = method.arguments
@@ -534,9 +557,15 @@
           : _javaTypeForDartType(method.returnType);
       argSignature.add('Result<$resultType> result');
     }
-    addDocumentationComments(
-        indent, method.documentationComments, _docCommentSpec);
-
+    if (method.documentationComments.isNotEmpty) {
+      addDocumentationComments(
+          indent, method.documentationComments, _docCommentSpec);
+    } else {
+      indent.newln();
+    }
+    if (nullableType != '') {
+      indent.writeln(nullableType);
+    }
     indent.writeln('$returnType ${method.name}(${argSignature.join(', ')});');
   }
 
@@ -547,7 +576,7 @@
       Api api, final Method method) {
     final String channelName = makeChannelName(api, method);
     indent.write('');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       String? taskQueue;
       if (method.taskQueueType != TaskQueueType.serial) {
         taskQueue = 'taskQueue';
@@ -555,106 +584,111 @@
             'BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue();');
       }
       indent.writeln('BasicMessageChannel<Object> channel =');
-      indent.inc();
-      indent.inc();
-      indent.write(
-          'new BasicMessageChannel<>(binaryMessenger, "$channelName", getCodec()');
-      if (taskQueue != null) {
-        indent.addln(', $taskQueue);');
-      } else {
-        indent.addln(');');
-      }
-      indent.dec();
-      indent.dec();
-      indent.write('if (api != null) ');
-      indent.scoped('{', '} else {', () {
-        indent.write('channel.setMessageHandler((message, reply) -> ');
-        indent.scoped('{', '});', () {
-          final String returnType = method.returnType.isVoid
-              ? 'Void'
-              : _javaTypeForDartType(method.returnType);
-          indent.writeln('ArrayList wrapped = new ArrayList<>();');
-          indent.write('try ');
-          indent.scoped('{', '}', () {
-            final List<String> methodArgument = <String>[];
-            if (method.arguments.isNotEmpty) {
-              indent.writeln(
-                  'ArrayList<Object> args = (ArrayList<Object>)message;');
-              indent.writeln('assert args != null;');
-              enumerate(method.arguments, (int index, NamedType arg) {
-                // The StandardMessageCodec can give us [Integer, Long] for
-                // a Dart 'int'.  To keep things simple we just use 64bit
-                // longs in Pigeon with Java.
-                final bool isInt = arg.type.baseName == 'int';
-                final String argType =
-                    isInt ? 'Number' : _javaTypeForDartType(arg.type);
-                final String argName = _getSafeArgumentName(index, arg);
-                final String argExpression = isInt
-                    ? '($argName == null) ? null : $argName.longValue()'
-                    : argName;
-                String accessor = 'args.get($index)';
-                if (isEnum(root, arg.type)) {
-                  accessor = _intToEnum(accessor, arg.type.baseName);
-                } else if (argType != 'Object') {
-                  accessor = '($argType)$accessor';
-                }
-                indent.writeln('$argType $argName = $accessor;');
-                if (!arg.type.isNullable) {
-                  indent.write('if ($argName == null) ');
-                  indent.scoped('{', '}', () {
-                    indent.writeln(
-                        'throw new NullPointerException("$argName unexpectedly null.");');
-                  });
-                }
-                methodArgument.add(argExpression);
-              });
-            }
-            if (method.isAsynchronous) {
-              final String resultValue =
-                  method.returnType.isVoid ? 'null' : 'result';
-              const String resultName = 'resultCallback';
-              indent.format('''
-Result<$returnType> $resultName = new Result<$returnType>() {
-\tpublic void success($returnType result) {
-\t\twrapped.add(0, $resultValue);
-\t\treply.reply(wrapped);
-\t}
-\tpublic void error(Throwable error) {
-\t\tArrayList<Object> wrappedError = wrapError(error);
-\t\treply.reply(wrappedError);
-\t}
-};
-''');
-              methodArgument.add(resultName);
-            }
-            final String call =
-                'api.${method.name}(${methodArgument.join(', ')})';
-            if (method.isAsynchronous) {
-              indent.writeln('$call;');
-            } else if (method.returnType.isVoid) {
-              indent.writeln('$call;');
-              indent.writeln('wrapped.add(0, null);');
-            } else {
-              indent.writeln('$returnType output = $call;');
-              indent.writeln('wrapped.add(0, output);');
-            }
-          });
-          indent.write('catch (Error | RuntimeException exception) ');
-          indent.scoped('{', '}', () {
-            indent.writeln(
-                'ArrayList<Object> wrappedError = wrapError(exception);');
-            if (method.isAsynchronous) {
-              indent.writeln('reply.reply(wrappedError);');
-            } else {
-              indent.writeln('wrapped = wrappedError;');
-            }
-          });
-          if (!method.isAsynchronous) {
-            indent.writeln('reply.reply(wrapped);');
+      indent.nest(2, () {
+        indent.writeln('new BasicMessageChannel<>(');
+        indent.nest(2, () {
+          indent.write('binaryMessenger, "$channelName", getCodec()');
+          if (taskQueue != null) {
+            indent.addln(', $taskQueue);');
+          } else {
+            indent.addln(');');
           }
         });
       });
-      indent.scoped(null, '}', () {
+      indent.write('if (api != null) ');
+      indent.addScoped('{', '} else {', () {
+        indent.writeln('channel.setMessageHandler(');
+        indent.nest(2, () {
+          indent.write('(message, reply) -> ');
+          indent.addScoped('{', '});', () {
+            final String returnType = method.returnType.isVoid
+                ? 'Void'
+                : _javaTypeForDartType(method.returnType);
+            indent.writeln('ArrayList wrapped = new ArrayList<>();');
+            indent.write('try ');
+            indent.addScoped('{', '}', () {
+              final List<String> methodArgument = <String>[];
+              if (method.arguments.isNotEmpty) {
+                indent.writeln(
+                    'ArrayList<Object> args = (ArrayList<Object>) message;');
+                indent.writeln('assert args != null;');
+                enumerate(method.arguments, (int index, NamedType arg) {
+                  // The StandardMessageCodec can give us [Integer, Long] for
+                  // a Dart 'int'.  To keep things simple we just use 64bit
+                  // longs in Pigeon with Java.
+                  final bool isInt = arg.type.baseName == 'int';
+                  final String argType =
+                      isInt ? 'Number' : _javaTypeForDartType(arg.type);
+                  final String argName = _getSafeArgumentName(index, arg);
+                  final String argExpression = isInt
+                      ? '($argName == null) ? null : $argName.longValue()'
+                      : argName;
+                  String accessor = 'args.get($index)';
+                  if (isEnum(root, arg.type)) {
+                    accessor = _intToEnum(accessor, arg.type.baseName);
+                  } else if (argType != 'Object') {
+                    accessor = '($argType) $accessor';
+                  }
+                  indent.writeln('$argType $argName = $accessor;');
+                  if (!arg.type.isNullable) {
+                    indent.write('if ($argName == null) ');
+                    indent.addScoped('{', '}', () {
+                      indent.writeln(
+                          'throw new NullPointerException("$argName unexpectedly null.");');
+                    });
+                  }
+                  methodArgument.add(argExpression);
+                });
+              }
+              if (method.isAsynchronous) {
+                final String resultValue =
+                    method.returnType.isVoid ? 'null' : 'result';
+                const String resultName = 'resultCallback';
+                indent.format('''
+Result<$returnType> $resultName = 
+\t\tnew Result<$returnType>() {
+\t\t\tpublic void success($returnType result) {
+\t\t\t\twrapped.add(0, $resultValue);
+\t\t\t\treply.reply(wrapped);
+\t\t\t}
+
+\t\t\tpublic void error(Throwable error) {
+\t\t\t\tArrayList<Object> wrappedError = wrapError(error);
+\t\t\t\treply.reply(wrappedError);
+\t\t\t}
+\t\t};
+''');
+                methodArgument.add(resultName);
+              }
+              final String call =
+                  'api.${method.name}(${methodArgument.join(', ')})';
+              if (method.isAsynchronous) {
+                indent.writeln('$call;');
+              } else if (method.returnType.isVoid) {
+                indent.writeln('$call;');
+                indent.writeln('wrapped.add(0, null);');
+              } else {
+                indent.writeln('$returnType output = $call;');
+                indent.writeln('wrapped.add(0, output);');
+              }
+            }, addTrailingNewline: false);
+            indent.add(' catch (Error | RuntimeException exception) ');
+            indent.addScoped('{', '}', () {
+              indent.writeln(
+                  'ArrayList<Object> wrappedError = wrapError(exception);');
+              if (method.isAsynchronous) {
+                indent.writeln('reply.reply(wrappedError);');
+              } else {
+                indent.writeln('wrapped = wrappedError;');
+              }
+            });
+            if (!method.isAsynchronous) {
+              indent.writeln('reply.reply(wrapped);');
+            }
+          });
+        });
+      });
+      indent.addScoped(null, '}', () {
         indent.writeln('channel.setMessageHandler(null);');
       });
     });
@@ -667,66 +701,78 @@
     assert(getCodecClasses(api, root).isNotEmpty);
     final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
     final String codecName = _getCodecName(api);
+    indent.newln();
     indent.write(
         'private static class $codecName extends $_standardMessageCodec ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln(
           'public static final $codecName INSTANCE = new $codecName();');
+      indent.newln();
       indent.writeln('private $codecName() {}');
+      indent.newln();
       indent.writeln('@Override');
       indent.write(
           'protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.write('switch (type) ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           for (final EnumeratedClass customClass in codecClasses) {
-            indent.write('case (byte)${customClass.enumeration}: ');
+            indent.write('case (byte) ${customClass.enumeration}: ');
             indent.writeScoped('', '', () {
               indent.writeln(
                   'return ${customClass.name}.fromList((ArrayList<Object>) readValue(buffer));');
             });
           }
           indent.write('default:');
-          indent.writeScoped('', '', () {
+          indent.addScoped('', '', () {
             indent.writeln('return super.readValueOfType(type, buffer);');
-          });
+          }, addTrailingNewline: false);
         });
       });
+      indent.newln();
       indent.writeln('@Override');
       indent.write(
           'protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) ');
-      indent.writeScoped('{', '}', () {
+      indent.addScoped('{', '}', () {
+        bool firstClass = true;
         for (final EnumeratedClass customClass in codecClasses) {
-          indent.write('if (value instanceof ${customClass.name}) ');
-          indent.scoped('{', '} else ', () {
+          if (firstClass) {
+            indent.write('');
+            firstClass = false;
+          }
+          indent.add('if (value instanceof ${customClass.name}) ');
+          indent.addScoped('{', '} else ', () {
             indent.writeln('stream.write(${customClass.enumeration});');
             indent.writeln(
                 'writeValue(stream, ((${customClass.name}) value).toList());');
-          });
+          }, addTrailingNewline: false);
         }
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           indent.writeln('super.writeValue(stream, value);');
         });
       });
     });
-    indent.addln('');
+    indent.newln();
   }
 
   void _writeResultInterface(Indent indent) {
     indent.write('public interface Result<T> ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('void success(T result);');
+      indent.newln();
       indent.writeln('void error(Throwable error);');
     });
   }
 
   void _writeWrapError(Indent indent) {
     indent.format('''
-@NonNull private static ArrayList<Object> wrapError(@NonNull Throwable exception) {
+@NonNull
+private static ArrayList<Object> wrapError(@NonNull Throwable exception) {
 \tArrayList<Object> errorList = new ArrayList<>(3);
 \terrorList.add(exception.toString());
 \terrorList.add(exception.getClass().getSimpleName());
-\terrorList.add("Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception));
+\terrorList.add(
+\t\t"Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception));
 \treturn errorList;
 }''');
   }
@@ -751,7 +797,7 @@
 /// Converts an expression that evaluates to an nullable int to an expression
 /// that evaluates to a nullable enum.
 String _intToEnum(String expression, String enumName) =>
-    '$expression == null ? null : $enumName.values()[(int)$expression]';
+    '$expression == null ? null : $enumName.values()[(int) $expression]';
 
 String _getArgumentName(int count, NamedType argument) =>
     argument.name.isEmpty ? 'arg$count' : argument.name;
@@ -815,9 +861,12 @@
   return _javaTypeForBuiltinDartType(type) ?? type.baseName;
 }
 
+String _nullabilityAnnotationFromType(TypeDeclaration type) {
+  return type.isVoid ? '' : (type.isNullable ? '@Nullable ' : '@NonNull ');
+}
+
 String _nullsafeJavaTypeForDartType(TypeDeclaration type) {
-  final String nullSafe =
-      type.isVoid ? '' : (type.isNullable ? '@Nullable ' : '@NonNull ');
+  final String nullSafe = _nullabilityAnnotationFromType(type);
   return '$nullSafe${_javaTypeForDartType(type)}';
 }
 
@@ -829,11 +878,11 @@
   final HostDatatype hostDatatype = getFieldHostDatatype(field, classes, enums,
       (TypeDeclaration x) => _javaTypeForBuiltinDartType(x));
   if (field.type.baseName == 'int') {
-    return '($varName == null) ? null : (($varName instanceof Integer) ? (Integer)$varName : (${hostDatatype.datatype})$varName)';
+    return '($varName == null) ? null : (($varName instanceof Integer) ? (Integer) $varName : (${hostDatatype.datatype}) $varName)';
   } else if (!hostDatatype.isBuiltin &&
       classes.map((Class x) => x.name).contains(field.type.baseName)) {
-    return '($varName == null) ? null : ${hostDatatype.datatype}.fromList((ArrayList<Object>)$varName)';
+    return '($varName == null) ? null : ${hostDatatype.datatype}.fromList((ArrayList<Object>) $varName)';
   } else {
-    return '(${hostDatatype.datatype})$varName';
+    return '(${hostDatatype.datatype}) $varName';
   }
 }
diff --git a/packages/pigeon/lib/kotlin_generator.dart b/packages/pigeon/lib/kotlin_generator.dart
index 178309a..ab2cc2a 100644
--- a/packages/pigeon/lib/kotlin_generator.dart
+++ b/packages/pigeon/lib/kotlin_generator.dart
@@ -83,11 +83,11 @@
   @override
   void writeFileImports(
       KotlinOptions generatorOptions, Root root, Indent indent) {
-    indent.addln('');
+    indent.newln();
     if (generatorOptions.package != null) {
       indent.writeln('package ${generatorOptions.package}');
     }
-    indent.addln('');
+    indent.newln();
     indent.writeln('import android.util.Log');
     indent.writeln('import io.flutter.plugin.common.BasicMessageChannel');
     indent.writeln('import io.flutter.plugin.common.BinaryMessenger');
@@ -100,11 +100,11 @@
   @override
   void writeEnum(
       KotlinOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
-    indent.writeln('');
+    indent.newln();
     addDocumentationComments(
         indent, anEnum.documentationComments, _docCommentSpec);
     indent.write('enum class ${anEnum.name}(val raw: Int) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       enumerate(anEnum.members, (int index, final EnumMember member) {
         addDocumentationComments(
             indent, member.documentationComments, _docCommentSpec);
@@ -116,11 +116,11 @@
         }
       });
 
-      indent.writeln('');
+      indent.newln();
       indent.write('companion object ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.write('fun ofRaw(raw: Int): ${anEnum.name}? ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           indent.writeln('return values().firstOrNull { it.raw == raw }');
         });
       });
@@ -138,24 +138,24 @@
     const List<String> generatedMessages = <String>[
       ' Generated class from Pigeon that represents data sent in messages.'
     ];
-    indent.addln('');
+    indent.newln();
     addDocumentationComments(
         indent, klass.documentationComments, _docCommentSpec,
         generatorComments: generatedMessages);
 
     indent.write('data class ${klass.name} ');
-    indent.scoped('(', '', () {
+    indent.addScoped('(', '', () {
       for (final NamedType element in getFieldsInSerializationOrder(klass)) {
         _writeClassField(indent, element);
         if (getFieldsInSerializationOrder(klass).last != element) {
           indent.addln(',');
         } else {
-          indent.addln('');
+          indent.newln();
         }
       }
     });
 
-    indent.scoped(') {', '}', () {
+    indent.addScoped(') {', '}', () {
       writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
           customEnumNames);
       writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
@@ -173,9 +173,9 @@
     Set<String> customEnumNames,
   ) {
     indent.write('fun toList(): List<Any?> ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('return listOf<Any?>');
-      indent.scoped('(', ')', () {
+      indent.addScoped('(', ')', () {
         for (final NamedType field in getFieldsInSerializationOrder(klass)) {
           final HostDatatype hostDatatype = _getHostDatatype(root, field);
           String toWriteValue = '';
@@ -207,11 +207,11 @@
     final String className = klass.name;
 
     indent.write('companion object ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('@Suppress("UNCHECKED_CAST")');
       indent.write('fun fromList(list: List<Any?>): $className ');
 
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         enumerate(getFieldsInSerializationOrder(klass),
             (int index, final NamedType field) {
           final HostDatatype hostDatatype = _getHostDatatype(root, field);
@@ -229,14 +229,14 @@
                 customClassNames.contains(field.type.baseName)) {
               indent.write('val ${field.name}: $fieldType? = ');
               indent.add('($listValue as? List<Any?>)?.let ');
-              indent.scoped('{', '}', () {
+              indent.addScoped('{', '}', () {
                 indent.writeln('$fieldType.fromList(it)');
               });
             } else if (!hostDatatype.isBuiltin &&
                 customEnumNames.contains(field.type.baseName)) {
               indent.write('val ${field.name}: $fieldType? = ');
               indent.add('($listValue as? Int)?.let ');
-              indent.scoped('{', '}', () {
+              indent.addScoped('{', '}', () {
                 indent.writeln('$fieldType.ofRaw(it)');
               });
             } else if (isInt) {
@@ -290,7 +290,7 @@
     if (root.apis.any((Api api) =>
         api.location == ApiLocation.host &&
         api.methods.any((Method it) => it.isAsynchronous))) {
-      indent.addln('');
+      indent.newln();
     }
     super.writeApis(generatorOptions, root, indent);
   }
@@ -323,12 +323,12 @@
     indent.writeln('@Suppress("UNCHECKED_CAST")');
     indent
         .write('class $apiName(private val binaryMessenger: BinaryMessenger) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('companion object ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('/** The codec used by $apiName. */');
         indent.write('val codec: MessageCodec<Any?> by lazy ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           if (isCustomCodec) {
             indent.writeln(_getCodecName(api));
           } else {
@@ -366,18 +366,18 @@
                 'fun ${func.name}($argsSignature, callback: ($returnType) -> Unit) ');
           }
         }
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           const String channel = 'channel';
           indent.writeln(
               'val $channel = BasicMessageChannel<Any?>(binaryMessenger, "$channelName", codec)');
           indent.write('$channel.send($sendArgument) ');
           if (func.returnType.isVoid) {
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln('callback()');
             });
           } else {
             final String forceUnwrap = func.returnType.isNullable ? '?' : '';
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln('val result = it as$forceUnwrap $returnType');
               indent.writeln('callback(result)');
             });
@@ -418,7 +418,7 @@
         generatorComments: generatedMessages);
 
     indent.write('interface $apiName ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final Method method in api.methods) {
         final List<String> argSignature = <String>[];
         if (method.arguments.isNotEmpty) {
@@ -450,12 +450,12 @@
         }
       }
 
-      indent.addln('');
+      indent.newln();
       indent.write('companion object ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('/** The codec used by $apiName. */');
         indent.write('val codec: MessageCodec<Any?> by lazy ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           if (isCustomCodec) {
             indent.writeln(_getCodecName(api));
           } else {
@@ -467,10 +467,10 @@
         indent.writeln('@Suppress("UNCHECKED_CAST")');
         indent.write(
             'fun setUp(binaryMessenger: BinaryMessenger, api: $apiName?) ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           for (final Method method in api.methods) {
             indent.write('run ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               String? taskQueue;
               if (method.taskQueueType != TaskQueueType.serial) {
                 taskQueue = 'taskQueue';
@@ -490,15 +490,15 @@
               }
 
               indent.write('if (api != null) ');
-              indent.scoped('{', '}', () {
+              indent.addScoped('{', '}', () {
                 final String messageVarName =
                     method.arguments.isNotEmpty ? 'message' : '_';
 
                 indent.write('channel.setMessageHandler ');
-                indent.scoped('{ $messageVarName, reply ->', '}', () {
+                indent.addScoped('{ $messageVarName, reply ->', '}', () {
                   indent.writeln('var wrapped = listOf<Any?>()');
                   indent.write('try ');
-                  indent.scoped('{', '}', () {
+                  indent.addScoped('{', '}', () {
                     final List<String> methodArgument = <String>[];
                     if (method.arguments.isNotEmpty) {
                       indent.writeln('val args = message as List<Any?>');
@@ -516,7 +516,7 @@
                       indent.write('$call ');
                       final String resultValue =
                           method.returnType.isVoid ? 'null' : 'it';
-                      indent.scoped('{', '}', () {
+                      indent.addScoped('{', '}', () {
                         indent.writeln('reply.reply(wrapResult($resultValue))');
                       });
                     } else if (method.returnType.isVoid) {
@@ -527,7 +527,7 @@
                     }
                   }, addTrailingNewline: false);
                   indent.add(' catch (exception: Error) ');
-                  indent.scoped('{', '}', () {
+                  indent.addScoped('{', '}', () {
                     indent.writeln('wrapped = wrapError(exception)');
                     if (method.isAsynchronous) {
                       indent.writeln('reply.reply(wrapped)');
@@ -538,7 +538,7 @@
                   }
                 });
               }, addTrailingNewline: false);
-              indent.scoped(' else {', '}', () {
+              indent.addScoped(' else {', '}', () {
                 indent.writeln('channel.setMessageHandler(null)');
               });
             });
@@ -557,17 +557,17 @@
     final String codecName = _getCodecName(api);
     indent.writeln('@Suppress("UNCHECKED_CAST")');
     indent.write('private object $codecName : StandardMessageCodec() ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write(
           'override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.write('return when (type) ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           for (final EnumeratedClass customClass in codecClasses) {
             indent.write('${customClass.enumeration}.toByte() -> ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.write('return (readValue(buffer) as? List<Any?>)?.let ');
-              indent.scoped('{', '}', () {
+              indent.addScoped('{', '}', () {
                 indent.writeln('${customClass.name}.fromList(it)');
               });
             });
@@ -580,10 +580,10 @@
           'override fun writeValue(stream: ByteArrayOutputStream, value: Any?) ');
       indent.writeScoped('{', '}', () {
         indent.write('when (value) ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           for (final EnumeratedClass customClass in codecClasses) {
             indent.write('is ${customClass.name} -> ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln('stream.write(${customClass.enumeration})');
               indent.writeln('writeValue(stream, value.toList())');
             });
@@ -592,23 +592,23 @@
         });
       });
     });
-    indent.addln('');
+    indent.newln();
   }
 
   void _writeWrapResult(Indent indent) {
-    indent.addln('');
+    indent.newln();
     indent.write('private fun wrapResult(result: Any?): List<Any?> ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('return listOf(result)');
     });
   }
 
   void _writeWrapError(Indent indent) {
-    indent.addln('');
+    indent.newln();
     indent.write('private fun wrapError(exception: Throwable): List<Any> ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('return ');
-      indent.scoped('listOf<Any>(', ')', () {
+      indent.addScoped('listOf<Any>(', ')', () {
         indent.writeln('exception.javaClass.simpleName,');
         indent.writeln('exception.toString(),');
         indent.writeln(
diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart
index 2b165c9..17b3d9c 100644
--- a/packages/pigeon/lib/objc_generator.dart
+++ b/packages/pigeon/lib/objc_generator.dart
@@ -96,20 +96,20 @@
     }
     indent.writeln('// $generatedCodeWarning');
     indent.writeln('// $seeAlsoWarning');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
   void writeFileImports(
       ObjcOptions generatorOptions, Root root, Indent indent) {
     indent.writeln('#import <Foundation/Foundation.h>');
-    indent.addln('');
+    indent.newln();
 
     indent.writeln('@protocol FlutterBinaryMessenger;');
     indent.writeln('@protocol FlutterMessageCodec;');
     indent.writeln('@class FlutterError;');
     indent.writeln('@class FlutterStandardTypedData;');
-    indent.addln('');
+    indent.newln();
     indent.writeln('NS_ASSUME_NONNULL_BEGIN');
   }
 
@@ -117,12 +117,12 @@
   void writeEnum(
       ObjcOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
     final String enumName = _className(generatorOptions.prefix, anEnum.name);
-    indent.writeln('');
+    indent.newln();
     addDocumentationComments(
         indent, anEnum.documentationComments, _docCommentSpec);
 
     indent.write('typedef NS_ENUM(NSUInteger, $enumName) ');
-    indent.scoped('{', '};', () {
+    indent.addScoped('{', '};', () {
       enumerate(anEnum.members, (int index, final EnumMember member) {
         addDocumentationComments(
             indent, member.documentationComments, _docCommentSpec);
@@ -136,12 +136,12 @@
   @override
   void writeDataClasses(
       ObjcOptions generatorOptions, Root root, Indent indent) {
-    indent.writeln('');
+    indent.newln();
     for (final Class klass in root.classes) {
       indent.writeln(
           '@class ${_className(generatorOptions.prefix, klass.name)};');
     }
-    indent.writeln('');
+    indent.newln();
     super.writeDataClasses(generatorOptions, root, indent);
   }
 
@@ -192,7 +192,7 @@
           '@property(nonatomic, $propertyType$nullability) ${hostDatatype.datatype} ${field.name};');
     }
     indent.writeln('@end');
-    indent.writeln('');
+    indent.newln();
   }
 
   @override
@@ -232,7 +232,7 @@
         '$_docCommentPrefix The codec used by ${_className(generatorOptions.prefix, api.name)}.');
     indent.writeln(
         'NSObject<FlutterMessageCodec> *${_getCodecGetterName(generatorOptions.prefix, api.name)}(void);');
-    indent.addln('');
+    indent.newln();
     final String apiName = _className(generatorOptions.prefix, api.name);
     addDocumentationComments(
         indent, api.documentationComments, _docCommentSpec);
@@ -257,7 +257,7 @@
       )};');
     }
     indent.writeln('@end');
-    indent.writeln('');
+    indent.newln();
   }
 
   @override
@@ -271,7 +271,7 @@
         '$_docCommentPrefix The codec used by ${_className(generatorOptions.prefix, api.name)}.');
     indent.writeln(
         'NSObject<FlutterMessageCodec> *${_getCodecGetterName(generatorOptions.prefix, api.name)}(void);');
-    indent.addln('');
+    indent.newln();
     final String apiName = _className(generatorOptions.prefix, api.name);
     addDocumentationComments(
         indent, api.documentationComments, _docCommentSpec);
@@ -287,11 +287,11 @@
       if (func.isAsynchronous) {
         returnType = 'void';
         if (func.returnType.isVoid) {
-          lastArgType = 'void(^)(FlutterError *_Nullable)';
+          lastArgType = 'void (^)(FlutterError *_Nullable)';
           lastArgName = 'completion';
         } else {
           lastArgType =
-              'void(^)(${returnTypeName.ptr}_Nullable, FlutterError *_Nullable)';
+              'void (^)(${returnTypeName.ptr}_Nullable, FlutterError *_Nullable)';
           lastArgName = 'completion';
         }
       } else {
@@ -322,10 +322,10 @@
       indent.writeln('$signature;');
     }
     indent.writeln('@end');
-    indent.writeln('');
+    indent.newln();
     indent.writeln(
         'extern void ${apiName}Setup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<$apiName> *_Nullable api);');
-    indent.writeln('');
+    indent.newln();
   }
 }
 
@@ -342,7 +342,7 @@
     }
     indent.writeln('// $generatedCodeWarning');
     indent.writeln('// $seeAlsoWarning');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -350,24 +350,23 @@
       ObjcOptions generatorOptions, Root root, Indent indent) {
     indent.writeln('#import "${generatorOptions.headerIncludePath}"');
     indent.writeln('#import <Flutter/Flutter.h>');
-    indent.addln('');
+    indent.newln();
 
     indent.writeln('#if !__has_feature(objc_arc)');
     indent.writeln('#error File requires ARC to be enabled.');
     indent.writeln('#endif');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
   void writeDataClasses(
       ObjcOptions generatorOptions, Root root, Indent indent) {
     _writeObjcSourceHelperFunctions(indent);
-    indent.addln('');
 
     for (final Class klass in root.classes) {
       _writeObjcSourceDataClassExtension(generatorOptions, indent, klass);
     }
-    indent.writeln('');
+    indent.newln();
     super.writeDataClasses(generatorOptions, root, indent);
   }
 
@@ -388,7 +387,7 @@
     writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
         customEnumNames);
     indent.writeln('@end');
-    indent.writeln('');
+    indent.newln();
   }
 
   @override
@@ -401,9 +400,9 @@
     Set<String> customEnumNames,
   ) {
     indent.write('- (NSArray *)toList ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('return');
-      indent.scoped(' @[', '];', () {
+      indent.addScoped(' @[', '];', () {
         for (final NamedType field in klass.fields) {
           indent.writeln(
               '${_arrayValue(customClassNames, customEnumNames, field)},');
@@ -423,7 +422,7 @@
   ) {
     final String className = _className(generatorOptions.prefix, klass.name);
     indent.write('+ ($className *)fromList:(NSArray *)list ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       const String resultName = 'pigeonResult';
       indent.writeln('$className *$resultName = [[$className alloc] init];');
       enumerate(getFieldsInSerializationOrder(klass),
@@ -442,8 +441,10 @@
       indent.writeln('return $resultName;');
     });
 
-    indent.writeln(
-        '+ (nullable $className *)nullableFromList:(NSArray *)list { return (list) ? [$className fromList:list] : nil; }');
+    indent.write('+ (nullable $className *)nullableFromList:(NSArray *)list ');
+    indent.addScoped('{', '}', () {
+      indent.writeln('return (list) ? [$className fromList:list] : nil;');
+    });
   }
 
   void _writeCodecAndGetter(
@@ -451,10 +452,10 @@
     final String codecName = _getCodecName(generatorOptions.prefix, api.name);
     if (getCodecClasses(api, root).isNotEmpty) {
       _writeCodec(indent, codecName, generatorOptions, api, root);
-      indent.addln('');
+      indent.newln();
     }
     _writeCodecGetter(indent, codecName, generatorOptions, api, root);
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -470,15 +471,15 @@
     _writeCodecAndGetter(generatorOptions, root, indent, api);
 
     _writeExtension(indent, apiName);
-    indent.addln('');
+    indent.newln();
     indent.writeln('@implementation $apiName');
-    indent.addln('');
+    indent.newln();
     _writeInitializer(indent);
     for (final Method func in api.methods) {
       _writeMethod(generatorOptions, root, indent, api, func);
     }
     indent.writeln('@end');
-    indent.writeln('');
+    indent.newln();
   }
 
   @override
@@ -496,13 +497,12 @@
     const String channelName = 'channel';
     indent.write(
         'void ${apiName}Setup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<$apiName> *api) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final Method func in api.methods) {
-        indent.write('');
         addDocumentationComments(
             indent, func.documentationComments, _docCommentSpec);
 
-        indent.scoped('{', '}', () {
+        indent.writeScoped('{', '}', () {
           String? taskQueue;
           if (func.taskQueueType != TaskQueueType.serial) {
             taskQueue = 'taskQueue';
@@ -512,12 +512,12 @@
           _writeChannelAllocation(
               generatorOptions, indent, api, func, channelName, taskQueue);
           indent.write('if (api) ');
-          indent.scoped('{', '}', () {
+          indent.addScoped('{', '}', () {
             _writeChannelApiBinding(
                 generatorOptions, root, indent, apiName, func, channelName);
-          });
-          indent.write('else ');
-          indent.scoped('{', '}', () {
+          }, addTrailingNewline: false);
+          indent.add(' else ');
+          indent.addScoped('{', '}', () {
             indent.writeln('[$channelName setMessageHandler:nil];');
           });
         });
@@ -595,7 +595,7 @@
         'NSCAssert([api respondsToSelector:@selector($selector)], @"$apiName api (%@) doesn\'t respond to @selector($selector)", api);');
     indent.write(
         '[$channel setMessageHandler:^(id _Nullable message, FlutterReply callback) ');
-    indent.scoped('{', '}];', () {
+    indent.addScoped('{', '}];', () {
       final _ObjcPtr returnType =
           _objcTypeForDartType(generatorOptions.prefix, func.returnType);
       final Iterable<String> selectorComponents =
@@ -624,54 +624,56 @@
   void _writeChannelAllocation(ObjcOptions generatorOptions, Indent indent,
       Api api, Method func, String varName, String? taskQueue) {
     indent.writeln('FlutterBasicMessageChannel *$varName =');
-    indent.inc();
-    indent.writeln('[[FlutterBasicMessageChannel alloc]');
-    indent.inc();
-    indent.writeln('initWithName:@"${makeChannelName(api, func)}"');
-    indent.writeln('binaryMessenger:binaryMessenger');
-    indent.write('codec:');
-    indent.add('${_getCodecGetterName(generatorOptions.prefix, api.name)}()');
+    indent.nest(1, () {
+      indent.writeln('[[FlutterBasicMessageChannel alloc]');
+      indent.nest(1, () {
+        indent.writeln('initWithName:@"${makeChannelName(api, func)}"');
+        indent.writeln('binaryMessenger:binaryMessenger');
+        indent.write('codec:');
+        indent
+            .add('${_getCodecGetterName(generatorOptions.prefix, api.name)}()');
 
-    if (taskQueue != null) {
-      indent.addln('');
-      indent.addln('taskQueue:$taskQueue];');
-    } else {
-      indent.addln('];');
-    }
-    indent.dec();
-    indent.dec();
+        if (taskQueue != null) {
+          indent.newln();
+          indent.addln('taskQueue:$taskQueue];');
+        } else {
+          indent.addln('];');
+        }
+      });
+    });
   }
 
   void _writeObjcSourceHelperFunctions(Indent indent) {
     indent.format('''
 static NSArray *wrapResult(id result, FlutterError *error) {
 \tif (error) {
-\t\treturn @[ error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] ];
+\t\treturn @[
+\t\t\terror.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null]
+\t\t];
 \t}
-\treturn @[ result ?: [NSNull null]  ];
+\treturn @[ result ?: [NSNull null] ];
 }''');
     indent.format('''
-static id GetNullableObject(NSDictionary* dict, id key) {
+static id GetNullableObject(NSDictionary *dict, id key) {
 \tid result = dict[key];
 \treturn (result == [NSNull null]) ? nil : result;
 }
-static id GetNullableObjectAtIndex(NSArray* array, NSInteger key) {
+static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
 \tid result = array[key];
 \treturn (result == [NSNull null]) ? nil : result;
-}
-''');
+}''');
   }
 
   void _writeObjcSourceDataClassExtension(
       ObjcOptions languageOptions, Indent indent, Class klass) {
     final String className = _className(languageOptions.prefix, klass.name);
+    indent.newln();
     indent.writeln('@interface $className ()');
     indent.writeln('+ ($className *)fromList:(NSArray *)list;');
     indent
         .writeln('+ (nullable $className *)nullableFromList:(NSArray *)list;');
     indent.writeln('- (NSArray *)toList;');
     indent.writeln('@end');
-    indent.writeln('');
   }
 
   void _writeObjcSourceClassInitializer(
@@ -715,10 +717,10 @@
     indent.writeln('@interface $readerName : FlutterStandardReader');
     indent.writeln('@end');
     indent.writeln('@implementation $readerName');
-    indent.writeln('- (nullable id)readValueOfType:(UInt8)type ');
-    indent.scoped('{', '}', () {
+    indent.write('- (nullable id)readValueOfType:(UInt8)type ');
+    indent.addScoped('{', '}', () {
       indent.write('switch (type) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         for (final EnumeratedClass customClass in codecClasses) {
           indent.write('case ${customClass.enumeration}: ');
           indent.writeScoped('', '', () {
@@ -726,33 +728,38 @@
                 'return [${_className(options.prefix, customClass.name)} fromList:[self readValue]];');
           });
         }
-        indent.write('default:');
-        indent.writeScoped('', '', () {
+        indent.writeln('default:');
+        indent.nest(1, () {
           indent.writeln('return [super readValueOfType:type];');
         });
       });
     });
     indent.writeln('@end');
-    indent.addln('');
+    indent.newln();
     indent.writeln('@interface $writerName : FlutterStandardWriter');
     indent.writeln('@end');
     indent.writeln('@implementation $writerName');
-    indent.writeln('- (void)writeValue:(id)value ');
-    indent.scoped('{', '}', () {
+    indent.write('- (void)writeValue:(id)value ');
+    indent.addScoped('{', '}', () {
+      bool firstClass = true;
       for (final EnumeratedClass customClass in codecClasses) {
-        indent.write(
+        if (firstClass) {
+          indent.write('');
+          firstClass = false;
+        }
+        indent.add(
             'if ([value isKindOfClass:[${_className(options.prefix, customClass.name)} class]]) ');
-        indent.scoped('{', '} else ', () {
+        indent.addScoped('{', '} else ', () {
           indent.writeln('[self writeByte:${customClass.enumeration}];');
           indent.writeln('[self writeValue:[value toList]];');
-        });
+        }, addTrailingNewline: false);
       }
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('[super writeValue:value];');
       });
     });
     indent.writeln('@end');
-    indent.addln('');
+    indent.newln();
     indent.format('''
 @interface $readerWriterName : FlutterStandardReaderWriter
 @end
@@ -763,8 +770,7 @@
 - (FlutterStandardReader *)readerWithData:(NSData *)data {
 \treturn [[$readerName alloc] initWithData:data];
 }
-@end
-''');
+@end''');
   }
 
   void _writeCodecGetter(
@@ -773,13 +779,13 @@
 
     indent.write(
         'NSObject<FlutterMessageCodec> *${_getCodecGetterName(options.prefix, api.name)}() ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent
           .writeln('static FlutterStandardMessageCodec *sSharedObject = nil;');
       if (getCodecClasses(api, root).isNotEmpty) {
         indent.writeln('static dispatch_once_t sPred = 0;');
         indent.write('dispatch_once(&sPred, ^');
-        indent.scoped('{', '});', () {
+        indent.addScoped('{', '});', () {
           indent.writeln(
               '$readerWriterName *readerWriter = [[$readerWriterName alloc] init];');
           indent.writeln(
@@ -809,7 +815,7 @@
       final void Function(String) printer = isFirst
           ? indent.add
           : (String x) {
-              indent.addln('');
+              indent.newln();
               indent.write(x);
             };
       isFirst = false;
@@ -840,8 +846,8 @@
 /// Calculates callback block signature for for async methods.
 String _callbackForType(TypeDeclaration type, _ObjcPtr objcType) {
   return type.isVoid
-      ? 'void(^)(NSError *_Nullable)'
-      : 'void(^)(${objcType.ptr.trim()}_Nullable, NSError *_Nullable)';
+      ? 'void (^)(NSError *_Nullable)'
+      : 'void (^)(${objcType.ptr.trim()}_Nullable, NSError *_Nullable)';
 }
 
 /// Represents an ObjC pointer (ex 'id', 'NSString *').
@@ -1050,17 +1056,17 @@
 void _writeExtension(Indent indent, String apiName) {
   indent.writeln('@interface $apiName ()');
   indent.writeln(
-      '@property (nonatomic, strong) NSObject<FlutterBinaryMessenger> *binaryMessenger;');
+      '@property(nonatomic, strong) NSObject<FlutterBinaryMessenger> *binaryMessenger;');
   indent.writeln('@end');
 }
 
 void _writeInitializer(Indent indent) {
   indent.write(
       '- (instancetype)initWithBinaryMessenger:(NSObject<FlutterBinaryMessenger> *)binaryMessenger ');
-  indent.scoped('{', '}', () {
+  indent.addScoped('{', '}', () {
     indent.writeln('self = [super init];');
     indent.write('if (self) ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('_binaryMessenger = binaryMessenger;');
     });
     indent.writeln('return self;');
@@ -1091,20 +1097,21 @@
     argNameFunc: argNameFunc,
     isEnum: (TypeDeclaration t) => isEnum(root, t),
   ));
-  indent.scoped(' {', '}', () {
+  indent.addScoped(' {', '}', () {
     indent.writeln('FlutterBasicMessageChannel *channel =');
-    indent.inc();
-    indent.writeln('[FlutterBasicMessageChannel');
-    indent.inc();
-    indent.writeln('messageChannelWithName:@"${makeChannelName(api, func)}"');
-    indent.writeln('binaryMessenger:self.binaryMessenger');
-    indent.write(
-        'codec:${_getCodecGetterName(languageOptions.prefix, api.name)}()');
-    indent.addln('];');
-    indent.dec();
-    indent.dec();
+    indent.nest(1, () {
+      indent.writeln('[FlutterBasicMessageChannel');
+      indent.nest(1, () {
+        indent
+            .writeln('messageChannelWithName:@"${makeChannelName(api, func)}"');
+        indent.writeln('binaryMessenger:self.binaryMessenger');
+        indent.write(
+            'codec:${_getCodecGetterName(languageOptions.prefix, api.name)}()');
+        indent.addln('];');
+      });
+    });
     indent.write('[channel sendMessage:$sendArgument reply:^(id reply) ');
-    indent.scoped('{', '}];', () {
+    indent.addScoped('{', '}];', () {
       if (func.returnType.isVoid) {
         indent.writeln('completion(nil);');
       } else {
diff --git a/packages/pigeon/lib/swift_generator.dart b/packages/pigeon/lib/swift_generator.dart
index d8f5b1a..b0aa98d 100644
--- a/packages/pigeon/lib/swift_generator.dart
+++ b/packages/pigeon/lib/swift_generator.dart
@@ -61,7 +61,7 @@
     }
     indent.writeln('// $generatedCodeWarning');
     indent.writeln('// $seeAlsoWarning');
-    indent.addln('');
+    indent.newln();
   }
 
   @override
@@ -77,18 +77,18 @@
 #error("Unsupported platform.")
 #endif
 ''');
-    indent.writeln('');
+    indent.newln();
   }
 
   @override
   void writeEnum(
       SwiftOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
-    indent.writeln('');
+    indent.newln();
     addDocumentationComments(
         indent, anEnum.documentationComments, _docCommentSpec);
 
     indent.write('enum ${anEnum.name}: Int ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       enumerate(anEnum.members, (int index, final EnumMember member) {
         addDocumentationComments(
             indent, member.documentationComments, _docCommentSpec);
@@ -108,18 +108,18 @@
     const List<String> generatedComments = <String>[
       ' Generated class from Pigeon that represents data sent in messages.'
     ];
-    indent.addln('');
+    indent.newln();
     addDocumentationComments(
         indent, klass.documentationComments, _docCommentSpec,
         generatorComments: generatedComments);
 
     indent.write('struct ${klass.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       getFieldsInSerializationOrder(klass).forEach((NamedType field) {
         _writeClassField(indent, field);
       });
 
-      indent.writeln('');
+      indent.newln();
       writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
           customEnumNames);
       writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
@@ -137,9 +137,9 @@
     Set<String> customEnumNames,
   ) {
     indent.write('func toList() -> [Any?] ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('return ');
-      indent.scoped('[', ']', () {
+      indent.addScoped('[', ']', () {
         for (final NamedType field in getFieldsInSerializationOrder(klass)) {
           final HostDatatype hostDatatype = _getHostDatatype(root, field);
           String toWriteValue = '';
@@ -173,7 +173,7 @@
     final String className = klass.name;
     indent.write('static func fromList(_ list: [Any?]) -> $className? ');
 
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       enumerate(getFieldsInSerializationOrder(klass),
           (int index, final NamedType field) {
         final HostDatatype hostDatatype = _getHostDatatype(root, field);
@@ -186,7 +186,7 @@
               customClassNames.contains(field.type.baseName)) {
             indent.writeln('var ${field.name}: $fieldType? = nil');
             indent.write('if let ${field.name}List = $listValue as? [Any?] ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln(
                   '${field.name} = $fieldType.fromList(${field.name}List)');
             });
@@ -194,7 +194,7 @@
               customEnumNames.contains(field.type.baseName)) {
             indent.writeln('var ${field.name}: $fieldType? = nil');
             indent.write('if let ${field.name}RawValue = $listValue as? Int ');
-            indent.scoped('{', '}', () {
+            indent.addScoped('{', '}', () {
               indent.writeln(
                   '${field.name} = $fieldType(rawValue: ${field.name}RawValue)');
             });
@@ -216,9 +216,9 @@
         }
       });
 
-      indent.writeln('');
+      indent.newln();
       indent.write('return ');
-      indent.scoped('$className(', ')', () {
+      indent.addScoped('$className(', ')', () {
         for (final NamedType field in getFieldsInSerializationOrder(klass)) {
           final String comma =
               getFieldsInSerializationOrder(klass).last == field ? '' : ',';
@@ -247,7 +247,7 @@
     if (root.apis.any((Api api) =>
         api.location == ApiLocation.host &&
         api.methods.any((Method it) => it.isAsynchronous))) {
-      indent.addln('');
+      indent.newln();
     }
     super.writeApis(generatorOptions, root, indent);
   }
@@ -278,10 +278,10 @@
         generatorComments: generatedComments);
 
     indent.write('class ${api.name} ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('private let binaryMessenger: FlutterBinaryMessenger');
       indent.write('init(binaryMessenger: FlutterBinaryMessenger)');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('self.binaryMessenger = binaryMessenger');
       });
       final String codecName = _getCodecName(api);
@@ -289,7 +289,7 @@
       if (getCodecClasses(api, root).isNotEmpty) {
         codecArgumentString = ', codec: codec';
         indent.write('var codec: FlutterStandardMessageCodec ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           indent.writeln('return $codecName.shared');
         });
       }
@@ -328,17 +328,17 @@
                 'func ${func.name}($argsSignature, completion: @escaping ($returnType) -> Void) ');
           }
         }
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           const String channel = 'channel';
           indent.writeln(
               'let $channel = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger$codecArgumentString)');
           indent.write('$channel.sendMessage($sendArgument) ');
           if (func.returnType.isVoid) {
-            indent.scoped('{ _ in', '}', () {
+            indent.addScoped('{ _ in', '}', () {
               indent.writeln('completion()');
             });
           } else {
-            indent.scoped('{ response in', '}', () {
+            indent.addScoped('{ response in', '}', () {
               indent.writeln(
                   'let result = ${_castForceUnwrap("response", func.returnType, root)}');
               indent.writeln('completion(result)');
@@ -377,7 +377,7 @@
         generatorComments: generatedComments);
 
     indent.write('protocol $apiName ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       for (final Method method in api.methods) {
         final List<String> argSignature = <String>[];
         if (method.arguments.isNotEmpty) {
@@ -409,11 +409,11 @@
       }
     });
 
-    indent.addln('');
+    indent.newln();
     indent.writeln(
         '$_docCommentPrefix Generated setup class from Pigeon to handle messages through the `binaryMessenger`.');
     indent.write('class ${apiName}Setup ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       final String codecName = _getCodecName(api);
       indent.writeln('$_docCommentPrefix The codec used by $apiName.');
       String codecArgumentString = '';
@@ -426,7 +426,7 @@
           '$_docCommentPrefix Sets up an instance of `$apiName` to handle messages through the `binaryMessenger`.');
       indent.write(
           'static func setUp(binaryMessenger: FlutterBinaryMessenger, api: $apiName?) ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         for (final Method method in api.methods) {
           final String channelName = makeChannelName(api, method);
           final String varChannelName = '${method.name}Channel';
@@ -436,11 +436,11 @@
           indent.writeln(
               'let $varChannelName = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger$codecArgumentString)');
           indent.write('if let api = api ');
-          indent.scoped('{', '}', () {
+          indent.addScoped('{', '}', () {
             indent.write('$varChannelName.setMessageHandler ');
             final String messageVarName =
                 method.arguments.isNotEmpty ? 'message' : '_';
-            indent.scoped('{ $messageVarName, reply in', '}', () {
+            indent.addScoped('{ $messageVarName, reply in', '}', () {
               final List<String> methodArgument = <String>[];
               if (method.arguments.isNotEmpty) {
                 indent.writeln('let args = message as! [Any?]');
@@ -457,11 +457,11 @@
               if (method.isAsynchronous) {
                 indent.write('$call ');
                 if (method.returnType.isVoid) {
-                  indent.scoped('{', '}', () {
+                  indent.addScoped('{', '}', () {
                     indent.writeln('reply(wrapResult(nil))');
                   });
                 } else {
-                  indent.scoped('{ result in', '}', () {
+                  indent.addScoped('{ result in', '}', () {
                     indent.writeln('reply(wrapResult(result))');
                   });
                 }
@@ -476,7 +476,7 @@
               }
             });
           }, addTrailingNewline: false);
-          indent.scoped(' else {', '}', () {
+          indent.addScoped(' else {', '}', () {
             indent.writeln('$varChannelName.setMessageHandler(nil)');
           });
         }
@@ -498,22 +498,22 @@
 
     // Generate Reader
     indent.write('private class $readerName: FlutterStandardReader ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       if (getCodecClasses(api, root).isNotEmpty) {
         indent.write('override func readValue(ofType type: UInt8) -> Any? ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           indent.write('switch type ');
-          indent.scoped('{', '}', () {
+          indent.addScoped('{', '}', () {
             for (final EnumeratedClass customClass
                 in getCodecClasses(api, root)) {
-              indent.write('case ${customClass.enumeration}:');
-              indent.scoped('', '', () {
-                indent.write(
+              indent.writeln('case ${customClass.enumeration}:');
+              indent.nest(1, () {
+                indent.writeln(
                     'return ${customClass.name}.fromList(self.readValue() as! [Any])');
               });
             }
-            indent.write('default:');
-            indent.scoped('', '', () {
+            indent.writeln('default:');
+            indent.nest(1, () {
               indent.writeln('return super.readValue(ofType: type)');
             });
           });
@@ -522,69 +522,70 @@
     });
 
     // Generate Writer
+    indent.newln();
     indent.write('private class $writerName: FlutterStandardWriter ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       if (getCodecClasses(api, root).isNotEmpty) {
         indent.write('override func writeValue(_ value: Any) ');
-        indent.scoped('{', '}', () {
+        indent.addScoped('{', '}', () {
           indent.write('');
           for (final EnumeratedClass customClass
               in getCodecClasses(api, root)) {
             indent.add('if let value = value as? ${customClass.name} ');
-            indent.scoped('{', '} else ', () {
+            indent.addScoped('{', '} else ', () {
               indent.writeln('super.writeByte(${customClass.enumeration})');
               indent.writeln('super.writeValue(value.toList())');
             }, addTrailingNewline: false);
           }
-          indent.scoped('{', '}', () {
+          indent.addScoped('{', '}', () {
             indent.writeln('super.writeValue(value)');
           });
         });
       }
     });
-    indent.writeln('');
+    indent.newln();
 
     // Generate ReaderWriter
     indent
         .write('private class $readerWriterName: FlutterStandardReaderWriter ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write(
           'override func reader(with data: Data) -> FlutterStandardReader ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('return $readerName(data: data)');
       });
-      indent.writeln('');
+      indent.newln();
       indent.write(
           'override func writer(with data: NSMutableData) -> FlutterStandardWriter ');
-      indent.scoped('{', '}', () {
+      indent.addScoped('{', '}', () {
         indent.writeln('return $writerName(data: data)');
       });
     });
-    indent.writeln('');
+    indent.newln();
 
     // Generate Codec
     indent.write('class $codecName: FlutterStandardMessageCodec ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln(
           'static let shared = $codecName(readerWriter: $readerWriterName())');
     });
-    indent.addln('');
+    indent.newln();
   }
 
   void _writeWrapResult(Indent indent) {
-    indent.addln('');
+    indent.newln();
     indent.write('private func wrapResult(_ result: Any?) -> [Any?] ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.writeln('return [result]');
     });
   }
 
   void _writeWrapError(Indent indent) {
-    indent.addln('');
+    indent.newln();
     indent.write('private func wrapError(_ error: FlutterError) -> [Any?] ');
-    indent.scoped('{', '}', () {
+    indent.addScoped('{', '}', () {
       indent.write('return ');
-      indent.scoped('[', ']', () {
+      indent.addScoped('[', ']', () {
         indent.writeln('error.code,');
         indent.writeln('error.message,');
         indent.writeln('error.details');
diff --git a/packages/pigeon/mock_handler_tester/test/message.dart b/packages/pigeon/mock_handler_tester/test/message.dart
index 8b15d22..d9010c1 100644
--- a/packages/pigeon/mock_handler_tester/test/message.dart
+++ b/packages/pigeon/mock_handler_tester/test/message.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/mock_handler_tester/test/test.dart b/packages/pigeon/mock_handler_tester/test/test.dart
index 7ca3642..582a60f 100644
--- a/packages/pigeon/mock_handler_tester/test/test.dart
+++ b/packages/pigeon/mock_handler_tester/test/test.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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, unnecessary_import
 // ignore_for_file: avoid_relative_lib_imports
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 fc6a620..947ca16 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 package com.example.alternate_language_test_plugin;
@@ -196,6 +196,7 @@
     private AllTypes() {}
 
     public static final class Builder {
+
       private @Nullable Boolean aBool;
 
       public @NonNull Builder setABool(@NonNull Boolean setterArg) {
@@ -479,6 +480,7 @@
     }
 
     public static final class Builder {
+
       private @Nullable Boolean aNullableBool;
 
       public @NonNull Builder setANullableBool(@Nullable Boolean setterArg) {
@@ -675,6 +677,7 @@
     private AllNullableTypesWrapper() {}
 
     public static final class Builder {
+
       private @Nullable AllNullableTypes values;
 
       public @NonNull Builder setValues(@NonNull AllNullableTypes setterArg) {
@@ -2177,6 +2180,7 @@
     public FlutterIntegrationCoreApi(BinaryMessenger argBinaryMessenger) {
       this.binaryMessenger = argBinaryMessenger;
     }
+
     /** Public interface for sending reply. */
     public interface Reply<T> {
       void reply(T reply);
@@ -2459,6 +2463,7 @@
    * <p>Generated interface from Pigeon that represents a handler of messages from Flutter.
    */
   public interface HostTrivialApi {
+
     void noop();
 
     /** The codec used by HostTrivialApi. */
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 11e6a1c..da0a19f 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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 6e276ac..4936726 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "CoreTests.gen.h"
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart
index 585b73d..9ff225b 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart
index c549d7f..d74904e 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart
index 83bfa88..218dcb4 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/flutter_null_safe_unit_tests/lib/null_fields.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart
index 688334d..040c5c4 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart
index 9b49e63..df1a5e9 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart
index 2ac5d48..118d7fa 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/flutter_null_safe_unit_tests/lib/primitive.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart
index 8475c62..96eddd1 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/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 585b73d..9ff225b 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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 2103ad1..0c74d9f 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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/ios/Classes/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift
index 10208bc..a22d39e 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 import Foundation
@@ -187,17 +187,17 @@
   override func readValue(ofType type: UInt8) -> Any? {
     switch type {
       case 128:
-        return AllNullableTypes.fromList(self.readValue() as! [Any])      
+        return AllNullableTypes.fromList(self.readValue() as! [Any])
       case 129:
-        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])      
+        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
       case 130:
-        return AllTypes.fromList(self.readValue() as! [Any])      
+        return AllTypes.fromList(self.readValue() as! [Any])
       default:
         return super.readValue(ofType: type)
-      
     }
   }
 }
+
 private class HostIntegrationCoreApiCodecWriter: FlutterStandardWriter {
   override func writeValue(_ value: Any) {
     if let value = value as? AllNullableTypes {
@@ -769,17 +769,17 @@
   override func readValue(ofType type: UInt8) -> Any? {
     switch type {
       case 128:
-        return AllNullableTypes.fromList(self.readValue() as! [Any])      
+        return AllNullableTypes.fromList(self.readValue() as! [Any])
       case 129:
-        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])      
+        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
       case 130:
-        return AllTypes.fromList(self.readValue() as! [Any])      
+        return AllTypes.fromList(self.readValue() as! [Any])
       default:
         return super.readValue(ofType: type)
-      
     }
   }
 }
+
 private class FlutterIntegrationCoreApiCodecWriter: FlutterStandardWriter {
   override func writeValue(_ value: Any) {
     if let value = value as? AllNullableTypes {
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 10208bc..a22d39e 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 import Foundation
@@ -187,17 +187,17 @@
   override func readValue(ofType type: UInt8) -> Any? {
     switch type {
       case 128:
-        return AllNullableTypes.fromList(self.readValue() as! [Any])      
+        return AllNullableTypes.fromList(self.readValue() as! [Any])
       case 129:
-        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])      
+        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
       case 130:
-        return AllTypes.fromList(self.readValue() as! [Any])      
+        return AllTypes.fromList(self.readValue() as! [Any])
       default:
         return super.readValue(ofType: type)
-      
     }
   }
 }
+
 private class HostIntegrationCoreApiCodecWriter: FlutterStandardWriter {
   override func writeValue(_ value: Any) {
     if let value = value as? AllNullableTypes {
@@ -769,17 +769,17 @@
   override func readValue(ofType type: UInt8) -> Any? {
     switch type {
       case 128:
-        return AllNullableTypes.fromList(self.readValue() as! [Any])      
+        return AllNullableTypes.fromList(self.readValue() as! [Any])
       case 129:
-        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])      
+        return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
       case 130:
-        return AllTypes.fromList(self.readValue() as! [Any])      
+        return AllTypes.fromList(self.readValue() as! [Any])
       default:
         return super.readValue(ofType: type)
-      
     }
   }
 }
+
 private class FlutterIntegrationCoreApiCodecWriter: FlutterStandardWriter {
   override func writeValue(_ value: Any) {
     if let value = value as? AllNullableTypes {
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 41bf167..2905839 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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 36a56eb..c2e06eb 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.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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 f4a883c..1c26d35 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.0 # This must match the version in lib/generator_tools.dart
+version: 7.0.1 # This must match the version in lib/generator_tools.dart
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart
index e79eee0..2e5b264 100644
--- a/packages/pigeon/test/java_generator_test.dart
+++ b/packages/pigeon/test/java_generator_test.dart
@@ -36,8 +36,8 @@
     expect(code, contains('private @Nullable Long field1;'));
     expect(
         code,
-        contains(
-            '@NonNull private static ArrayList<Object> wrapError(@NonNull Throwable exception)'));
+        contains(RegExp(
+            r'@NonNull\s*private static ArrayList<Object> wrapError\(@NonNull Throwable exception\)')));
   });
 
   test('gen one enum', () {
@@ -386,7 +386,7 @@
     generator.generate(javaOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('doSomething(Reply<Output>'));
-    expect(code, contains('channel.send(null'));
+    expect(code, contains(RegExp(r'channel.send\(\s*null')));
   });
 
   test('gen list', () {
@@ -469,7 +469,7 @@
     expect(
         code,
         contains(
-            '(nested == null) ? null : Nested.fromList((ArrayList<Object>)nested)'));
+            '(nested == null) ? null : Nested.fromList((ArrayList<Object>) nested)'));
     expect(code, contains('add((nested == null) ? null : nested.toList());'));
   });
 
@@ -613,7 +613,7 @@
     expect(
         code,
         contains(
-            'pigeonResult.setEnum1(enum1 == null ? null : Enum1.values()[(int)enum1])'));
+            'pigeonResult.setEnum1(enum1 == null ? null : Enum1.values()[(int) enum1])'));
   });
 
   test('primitive enum host', () {
@@ -644,7 +644,7 @@
     expect(
         code,
         contains(
-            'Foo fooArg = args.get(0) == null ? null : Foo.values()[(int)args.get(0)];'));
+            'Foo fooArg = args.get(0) == null ? null : Foo.values()[(int) args.get(0)];'));
   });
 
   Iterable<String> makeIterable(String string) sync* {
@@ -859,7 +859,7 @@
     expect(
         code,
         contains(
-            'Long output = channelReply == null ? null : ((Number)channelReply).longValue();'));
+            'Long output = channelReply == null ? null : ((Number) channelReply).longValue();'));
   });
 
   test('host multiple args', () {
@@ -888,10 +888,10 @@
     final String code = sink.toString();
     expect(code, contains('class Messages'));
     expect(code, contains('Long add(@NonNull Long x, @NonNull Long y)'));
-    expect(
-        code, contains('ArrayList<Object> args = (ArrayList<Object>)message;'));
-    expect(code, contains('Number xArg = (Number)args.get(0)'));
-    expect(code, contains('Number yArg = (Number)args.get(1)'));
+    expect(code,
+        contains('ArrayList<Object> args = (ArrayList<Object>) message;'));
+    expect(code, contains('Number xArg = (Number) args.get(0)'));
+    expect(code, contains('Number yArg = (Number) args.get(1)'));
     expect(
         code,
         contains(
@@ -954,8 +954,8 @@
             'public void add(@NonNull Long xArg, @NonNull Long yArg, Reply<Long> callback)'));
     expect(
         code,
-        contains(
-            'channel.send(new ArrayList<Object>(Arrays.asList(xArg, yArg)), channelReply ->'));
+        contains(RegExp(
+            r'channel.send\(\s*new ArrayList<Object>\(Arrays.asList\(xArg, yArg\)\),\s*channelReply ->')));
   });
 
   test('flutter single args', () {
@@ -980,8 +980,8 @@
     final String code = sink.toString();
     expect(
         code,
-        contains(
-            'channel.send(new ArrayList<Object>(Collections.singletonList(xArg)), channelReply ->'));
+        contains(RegExp(
+            r'channel.send\(\s*new ArrayList<Object>\(Collections.singletonList\(xArg\)\),\s*channelReply ->')));
   });
 
   test('return nullable host', () {
@@ -1005,7 +1005,7 @@
     const JavaGenerator generator = JavaGenerator();
     generator.generate(javaOptions, root, sink);
     final String code = sink.toString();
-    expect(code, contains('@Nullable Long doit();'));
+    expect(code, contains(RegExp(r'@Nullable\s*Long doit\(\);')));
   });
 
   test('return nullable host async', () {
@@ -1125,8 +1125,8 @@
             'BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue();'));
     expect(
         code,
-        contains(
-            'new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.Api.doit", getCodec(), taskQueue)'));
+        contains(RegExp(
+            r'new BasicMessageChannel<>\(\s*binaryMessenger, "dev.flutter.pigeon.Api.doit", getCodec\(\), taskQueue\)')));
   });
 
   test('generated annotation', () {
diff --git a/packages/pigeon/test/objc_generator_test.dart b/packages/pigeon/test/objc_generator_test.dart
index 64f92c8..e54bf59 100644
--- a/packages/pigeon/test/objc_generator_test.dart
+++ b/packages/pigeon/test/objc_generator_test.dart
@@ -801,7 +801,7 @@
     );
     generator.generate(generatorOptions, root, sink);
     final String code = sink.toString();
-    expect(code, contains('completion:(void(^)(NSError *_Nullable))'));
+    expect(code, contains('completion:(void (^)(NSError *_Nullable))'));
   });
 
   test('gen flutter void return source', () {
@@ -836,7 +836,7 @@
     );
     generator.generate(generatorOptions, root, sink);
     final String code = sink.toString();
-    expect(code, contains('completion:(void(^)(NSError *_Nullable))'));
+    expect(code, contains('completion:(void (^)(NSError *_Nullable))'));
     expect(code, contains('completion(nil)'));
   });
 
@@ -927,7 +927,7 @@
     expect(
         code,
         contains(
-            '(void)doSomethingWithCompletion:(void(^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
+            '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
   });
 
   test('gen flutter void arg source', () {
@@ -959,7 +959,7 @@
     expect(
         code,
         contains(
-            '(void)doSomethingWithCompletion:(void(^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
+            '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
     expect(code, contains('channel sendMessage:nil'));
   });
 
@@ -1066,7 +1066,7 @@
     expect(code, contains('(NSDictionary<NSString *, id> *)foo'));
   });
 
-  test('async void(input) HostApi header', () {
+  test('async void (input) HostApi header', () {
     final Root root = Root(apis: <Api>[
       Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
         Method(
@@ -1107,7 +1107,7 @@
     expect(
         code,
         contains(
-            '(void)doSomethingInput:(ABCInput *)input completion:(void(^)(FlutterError *_Nullable))completion'));
+            '(void)doSomethingInput:(ABCInput *)input completion:(void (^)(FlutterError *_Nullable))completion'));
   });
 
   test('async output(input) HostApi header', () {
@@ -1152,7 +1152,7 @@
     expect(
         code,
         contains(
-            '(void)doSomethingInput:(ABCInput *)input completion:(void(^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
+            '(void)doSomethingInput:(ABCInput *)input completion:(void (^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
   });
 
   test('async output(void) HostApi header', () {
@@ -1185,10 +1185,10 @@
     expect(
         code,
         contains(
-            '(void)doSomethingWithCompletion:(void(^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
+            '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
   });
 
-  test('async void(void) HostApi header', () {
+  test('async void (void) HostApi header', () {
     final Root root = Root(apis: <Api>[
       Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
         Method(
@@ -1211,7 +1211,7 @@
     expect(
         code,
         contains(
-            '(void)doSomethingWithCompletion:(void(^)(FlutterError *_Nullable))completion'));
+            '(void)doSomethingWithCompletion:(void (^)(FlutterError *_Nullable))completion'));
   });
 
   test('async output(input) HostApi source', () {
@@ -1259,7 +1259,7 @@
             '[api doSomething:arg0 completion:^(ABCOutput *_Nullable output, FlutterError *_Nullable error) {'));
   });
 
-  test('async void(input) HostApi source', () {
+  test('async void (input) HostApi source', () {
     final Root root = Root(apis: <Api>[
       Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
         Method(
@@ -1303,7 +1303,7 @@
             '[api doSomethingFoo:arg_foo completion:^(FlutterError *_Nullable error) {'));
   });
 
-  test('async void(void) HostApi source', () {
+  test('async void (void) HostApi source', () {
     final Root root = Root(apis: <Api>[
       Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
         Method(
@@ -1655,7 +1655,7 @@
       generator.generate(generatorOptions, root, sink);
       final String code = sink.toString();
       expect(
-          code, contains('doitWithCompletion:(void(^)(NSArray<NSNumber *> *'));
+          code, contains('doitWithCompletion:(void (^)(NSArray<NSNumber *> *'));
     }
     {
       final StringBuffer sink = StringBuffer();
@@ -1669,7 +1669,7 @@
       generator.generate(generatorOptions, root, sink);
       final String code = sink.toString();
       expect(
-          code, contains('doitWithCompletion:(void(^)(NSArray<NSNumber *> *'));
+          code, contains('doitWithCompletion:(void (^)(NSArray<NSNumber *> *'));
     }
   });
 
@@ -1763,7 +1763,7 @@
       expect(
           code,
           contains(
-              '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void(^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;'));
+              '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;'));
     }
     {
       final StringBuffer sink = StringBuffer();
@@ -1818,7 +1818,7 @@
       expect(
           code,
           contains(
-              '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void(^)(NSNumber *_Nullable, NSError *_Nullable))completion;'));
+              '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;'));
     }
     {
       final StringBuffer sink = StringBuffer();
@@ -1834,7 +1834,7 @@
       expect(
           code,
           contains(
-              '- (void)addX:(NSNumber *)arg_x y:(NSNumber *)arg_y completion:(void(^)(NSNumber *_Nullable, NSError *_Nullable))completion {'));
+              '- (void)addX:(NSNumber *)arg_x y:(NSNumber *)arg_y completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {'));
       expect(
           code,
           contains(
