| Index: lib/src/source_visitor.dart
|
| diff --git a/lib/src/source_visitor.dart b/lib/src/source_visitor.dart
|
| index 45aaabb45fb92de765d5859f6d2a7dda76cb3c20..a80a960697d51f91462c4496d291856c1a871bd0 100644
|
| --- a/lib/src/source_visitor.dart
|
| +++ b/lib/src/source_visitor.dart
|
| @@ -253,18 +253,43 @@ class SourceVisitor implements AstVisitor {
|
| return;
|
| }
|
|
|
| - // For a block that is not a function body, just bump the indentation and
|
| - // keep it in the current block.
|
| - if (node.parent is! BlockFunctionBody) {
|
| - _writeBody(node.leftBracket, node.rightBracket, body: () {
|
| - visitNodes(node.statements, between: oneOrTwoNewlines, after: newline);
|
| - });
|
| - return;
|
| + // If the block is a function body, it may get expression-level indentation,
|
| + // so handle it specially. Otherwise, just bump the indentation and keep it
|
| + // in the current block.
|
| + if (node.parent is BlockFunctionBody) {
|
| + _startLiteralBody(node.leftBracket);
|
| + } else {
|
| + _beginBody(node.leftBracket);
|
| + }
|
| +
|
| + var needsDouble = true;
|
| + for (var statement in node.statements) {
|
| + if (needsDouble) {
|
| + twoNewlines();
|
| + } else {
|
| + oneOrTwoNewlines();
|
| + }
|
| +
|
| + visit(statement);
|
| +
|
| + needsDouble = false;
|
| + if (statement is FunctionDeclarationStatement) {
|
| + // Add a blank line after non-empty block functions.
|
| + var body = statement.functionDeclaration.functionExpression.body;
|
| + if (body is BlockFunctionBody) {
|
| + needsDouble = body.block.statements.isNotEmpty;
|
| + }
|
| + }
|
| }
|
|
|
| - _startLiteralBody(node.leftBracket);
|
| - visitNodes(node.statements, between: oneOrTwoNewlines, after: newline);
|
| - _endLiteralBody(node.rightBracket, forceSplit: node.statements.isNotEmpty);
|
| + if (node.statements.isNotEmpty) newline();
|
| +
|
| + if (node.parent is BlockFunctionBody) {
|
| + _endLiteralBody(node.rightBracket,
|
| + forceSplit: node.statements.isNotEmpty);
|
| + } else {
|
| + _endBody(node.rightBracket);
|
| + }
|
| }
|
|
|
| visitBlockFunctionBody(BlockFunctionBody node) {
|
| @@ -406,38 +431,40 @@ class SourceVisitor implements AstVisitor {
|
| space();
|
|
|
| builder.unnest();
|
| - _writeBody(node.leftBracket, node.rightBracket, body: () {
|
| - if (node.members.isNotEmpty) {
|
| - for (var member in node.members) {
|
| - visit(member);
|
| -
|
| - if (member == node.members.last) {
|
| - newline();
|
| - break;
|
| - }
|
| + _beginBody(node.leftBracket);
|
|
|
| - var needsDouble = false;
|
| - if (member is ClassDeclaration) {
|
| - // Add a blank line after classes.
|
| - twoNewlines();
|
| - } else if (member is MethodDeclaration) {
|
| - // Add a blank line after non-empty block methods.
|
| - if (member.body is BlockFunctionBody) {
|
| - var body = member.body as BlockFunctionBody;
|
| - needsDouble = body.block.statements.isNotEmpty;
|
| - }
|
| - }
|
| + if (node.members.isNotEmpty) {
|
| + for (var member in node.members) {
|
| + visit(member);
|
|
|
| - if (needsDouble) {
|
| - twoNewlines();
|
| - } else {
|
| - // Variables and arrow-bodied members can be more tightly packed if
|
| - // the user wants to group things together.
|
| - oneOrTwoNewlines();
|
| + if (member == node.members.last) {
|
| + newline();
|
| + break;
|
| + }
|
| +
|
| + var needsDouble = false;
|
| + if (member is ClassDeclaration) {
|
| + // Add a blank line after classes.
|
| + twoNewlines();
|
| + } else if (member is MethodDeclaration) {
|
| + // Add a blank line after non-empty block methods.
|
| + if (member.body is BlockFunctionBody) {
|
| + var body = member.body as BlockFunctionBody;
|
| + needsDouble = body.block.statements.isNotEmpty;
|
| }
|
| }
|
| +
|
| + if (needsDouble) {
|
| + twoNewlines();
|
| + } else {
|
| + // Variables and arrow-bodied members can be more tightly packed if
|
| + // the user wants to group things together.
|
| + oneOrTwoNewlines();
|
| + }
|
| }
|
| - });
|
| + }
|
| +
|
| + _endBody(node.rightBracket);
|
| }
|
|
|
| visitClassTypeAlias(ClassTypeAlias node) {
|
| @@ -480,33 +507,30 @@ class SourceVisitor implements AstVisitor {
|
|
|
| visitNodes(directives, between: oneOrTwoNewlines);
|
|
|
| - if (node.declarations.isNotEmpty) {
|
| - var needsDouble = true;
|
| -
|
| - for (var declaration in node.declarations) {
|
| - // Add a blank line before classes.
|
| - if (declaration is ClassDeclaration) needsDouble = true;
|
| -
|
| - if (needsDouble) {
|
| - twoNewlines();
|
| - } else {
|
| - // Variables and arrow-bodied members can be more tightly packed if
|
| - // the user wants to group things together.
|
| - oneOrTwoNewlines();
|
| - }
|
| + var needsDouble = true;
|
| + for (var declaration in node.declarations) {
|
| + // Add a blank line before classes.
|
| + if (declaration is ClassDeclaration) needsDouble = true;
|
|
|
| - visit(declaration);
|
| + if (needsDouble) {
|
| + twoNewlines();
|
| + } else {
|
| + // Variables and arrow-bodied members can be more tightly packed if
|
| + // the user wants to group things together.
|
| + oneOrTwoNewlines();
|
| + }
|
|
|
| - needsDouble = false;
|
| - if (declaration is ClassDeclaration) {
|
| - // Add a blank line after classes.
|
| - needsDouble = true;
|
| - } else if (declaration is FunctionDeclaration) {
|
| - // Add a blank line after non-empty block functions.
|
| - if (declaration.functionExpression.body is BlockFunctionBody) {
|
| - var body = declaration.functionExpression.body as BlockFunctionBody;
|
| - needsDouble = body.block.statements.isNotEmpty;
|
| - }
|
| + visit(declaration);
|
| +
|
| + needsDouble = false;
|
| + if (declaration is ClassDeclaration) {
|
| + // Add a blank line after classes.
|
| + needsDouble = true;
|
| + } else if (declaration is FunctionDeclaration) {
|
| + // Add a blank line after non-empty block functions.
|
| + var body = declaration.functionExpression.body;
|
| + if (body is BlockFunctionBody) {
|
| + needsDouble = body.block.statements.isNotEmpty;
|
| }
|
| }
|
| }
|
| @@ -734,9 +758,9 @@ class SourceVisitor implements AstVisitor {
|
| visit(node.name);
|
| space();
|
|
|
| - _writeBody(node.leftBracket, node.rightBracket, space: true, body: () {
|
| - visitCommaSeparatedNodes(node.constants, between: split);
|
| - });
|
| + _beginBody(node.leftBracket, space: true);
|
| + visitCommaSeparatedNodes(node.constants, between: split);
|
| + _endBody(node.rightBracket, space: true);
|
| }
|
|
|
| visitExportDirective(ExportDirective node) {
|
| @@ -2156,13 +2180,9 @@ class SourceVisitor implements AstVisitor {
|
| _collectionArgumentLists[leftBracket] = argumentList;
|
| }
|
|
|
| - /// Writes an bracket-delimited body and handles indenting and starting the
|
| - /// rule used to split the contents.
|
| - ///
|
| - /// If [space] is `true`, then the contents and delimiters will have a space
|
| - /// between then when unsplit.
|
| - void _writeBody(Token leftBracket, Token rightBracket,
|
| - {bool space: false, body()}) {
|
| + /// Writes the beginning of a brace-delimited body and handles indenting and
|
| + /// starting the rule used to split the contents.
|
| + void _beginBody(Token leftBracket, {bool space: false}) {
|
| token(leftBracket);
|
|
|
| // Indent the body.
|
| @@ -2171,9 +2191,10 @@ class SourceVisitor implements AstVisitor {
|
| // Split after the bracket.
|
| builder.startRule();
|
| builder.split(isDouble: false, nest: false, space: space);
|
| + }
|
|
|
| - body();
|
| -
|
| + /// Finishes the body started by a call to [_beginBody].
|
| + void _endBody(Token rightBracket, {bool space: false}) {
|
| token(rightBracket, before: () {
|
| // Split before the closing bracket character.
|
| builder.unindent();
|
|
|