Clean up a few things:

- Refactor out some copy/paste code.

- Rename the typedef fix to "function typedef". Since there's a good
  chance we'll extend typedefs to non-function types and we may add
  fixes for those too, it seems smart to use a specific name for the
  fix.
diff --git a/lib/src/source_visitor.dart b/lib/src/source_visitor.dart
index f8a74b0..e744dd6 100644
--- a/lib/src/source_visitor.dart
+++ b/lib/src/source_visitor.dart
@@ -1036,17 +1036,14 @@
 
   visitFieldFormalParameter(FieldFormalParameter node) {
     visitParameterMetadata(node.metadata, () {
-      builder.startLazyRule(new Rule(Cost.parameterType));
-      builder.nestExpression();
-      modifier(node.covariantKeyword);
+      _beginFormalParameter(node);
       token(node.keyword, after: space);
       visit(node.type, after: split);
       token(node.thisKeyword);
       token(node.period);
       visit(node.identifier);
       visit(node.parameters);
-      builder.unnest();
-      builder.endRule();
+      _endFormalParameter(node);
     });
   }
 
@@ -1313,7 +1310,7 @@
   visitFunctionTypeAlias(FunctionTypeAlias node) {
     visitMetadata(node.metadata);
 
-    if (_formatter.fixes.contains(StyleFix.typedefs)) {
+    if (_formatter.fixes.contains(StyleFix.functionTypedefs)) {
       _simpleStatement(node, () {
         // Inlined visitGenericTypeAlias
         _visitGenericTypeAliasHeader(node.typedefKeyword, node.name,
@@ -1351,28 +1348,12 @@
         _visitParameterSignature(node.typeParameters, node.parameters);
         builder.endSpan();
       } else {
-        // In-lined from visitSimpleFormalParameter.
-        builder.startLazyRule(new Rule(Cost.parameterType));
-        builder.nestExpression();
-        modifier(node.covariantKeyword);
-
-        // In-lined vistGenericFunctionType
-        builder.startLazyRule();
-        builder.nestExpression();
-
-        visit(node.returnType, after: split);
-        _writeText("Function", node.identifier.offset);
-
-        builder.unnest();
-        builder.endRule();
-        _visitParameterSignature(node.typeParameters, node.parameters);
-        // End of visitGenericFunctionType
+        _beginFormalParameter(node);
+        _visitGenericFunctionType(node.returnType, null, node.identifier.offset,
+            node.typeParameters, node.parameters);
         split();
-
         visit(node.identifier);
-        builder.unnest();
-        builder.endRule();
-        // End of visitSimpleFormalParameter
+        _endFormalParameter(node);
       }
     });
   }
@@ -1858,12 +1839,10 @@
 
   visitSimpleFormalParameter(SimpleFormalParameter node) {
     visitParameterMetadata(node.metadata, () {
-      builder.startLazyRule(new Rule(Cost.parameterType));
-      builder.nestExpression();
-      modifier(node.covariantKeyword);
-      modifier(node.keyword);
+      _beginFormalParameter(node);
 
-      bool hasType = node.type != null;
+      modifier(node.keyword);
+      var hasType = node.type != null;
       if (_insideNewTypedefFix && !hasType) {
         // In function declarations and the old typedef syntax, you can have a
         // parameter name without a type. In the new syntax, you can have a type
@@ -1881,8 +1860,8 @@
 
         visit(node.identifier);
       }
-      builder.unnest();
-      builder.endRule();
+
+      _endFormalParameter(node);
     });
   }
 
@@ -2622,6 +2601,19 @@
     }
   }
 
+  /// Begins writing a formal parameter of any kind.
+  void _beginFormalParameter(FormalParameter node) {
+    builder.startLazyRule(new Rule(Cost.parameterType));
+    builder.nestExpression();
+    modifier(node.covariantKeyword);
+  }
+
+  /// Ends writing a formal parameter of any kind.
+  void _endFormalParameter(FormalParameter node) {
+    builder.unnest();
+    builder.endRule();
+  }
+
   /// Writes a `Function` function type.
   ///
   /// Used also by a fix, so there may not be a [functionKeyword].
diff --git a/lib/src/style_fix.dart b/lib/src/style_fix.dart
index 91b1dab..f15d7f6 100644
--- a/lib/src/style_fix.dart
+++ b/lib/src/style_fix.dart
@@ -6,6 +6,12 @@
 /// Enum-like class for the different syntactic fixes that can be applied while
 /// formatting.
 class StyleFix {
+  static const docComments = const StyleFix._(
+      "doc-comments", 'Use triple slash for documentation comments.');
+
+  static const functionTypedefs = const StyleFix._(
+      "function-typedefs", 'Use new syntax for function type typedefs.');
+
   static const namedDefaultSeparator = const StyleFix._(
       "named-default-separator",
       'Use "=" as the separator before named parameter default values.');
@@ -16,18 +22,12 @@
   static const optionalNew =
       const StyleFix._("optional-new", 'Remove "new" keyword.');
 
-  static const docComments = const StyleFix._(
-      "doc-comments", 'Use triple slash for documentation comments.');
-
-  static const typedefs =
-      const StyleFix._("typedefs", 'Use new typedef syntax for typedefs.');
-
   static const all = const [
+    docComments,
+    functionTypedefs,
     namedDefaultSeparator,
     optionalConst,
-    optionalNew,
-    docComments,
-    typedefs,
+    optionalNew
   ];
 
   final String name;
diff --git a/test/fix_test.dart b/test/fix_test.dart
index 9db6107..0cf3964 100644
--- a/test/fix_test.dart
+++ b/test/fix_test.dart
@@ -15,7 +15,7 @@
   testFile(
       "fixes/named_default_separator.unit", [StyleFix.namedDefaultSeparator]);
   testFile("fixes/doc_comments.stmt", [StyleFix.docComments]);
+  testFile("fixes/function_typedefs.unit", [StyleFix.functionTypedefs]);
   testFile("fixes/optional_const.unit", [StyleFix.optionalConst]);
   testFile("fixes/optional_new.stmt", [StyleFix.optionalNew]);
-  testFile("fixes/typedefs.unit", [StyleFix.typedefs]);
 }
diff --git a/test/fixes/typedefs.unit b/test/fixes/function_typedefs.unit
similarity index 100%
rename from test/fixes/typedefs.unit
rename to test/fixes/function_typedefs.unit