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