OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart_style.src.source_visitor; | 5 library dart_style.src.source_visitor; |
6 | 6 |
7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
8 import 'package:analyzer/src/generated/scanner.dart'; | 8 import 'package:analyzer/src/generated/scanner.dart'; |
9 import 'package:analyzer/src/generated/source.dart'; | 9 import 'package:analyzer/src/generated/source.dart'; |
10 | 10 |
11 import '../dart_style.dart'; | 11 import '../dart_style.dart'; |
12 import 'chunk.dart'; | 12 import 'chunk.dart'; |
13 import 'line_writer.dart'; | 13 import 'line_writer.dart'; |
14 import 'whitespace.dart'; | 14 import 'whitespace.dart'; |
15 | 15 |
16 /// An AST visitor that drives formatting heuristics. | 16 /// An AST visitor that drives formatting heuristics. |
17 class SourceVisitor implements AstVisitor { | 17 class SourceVisitor implements AstVisitor { |
| 18 final DartFormatter _formatter; |
| 19 |
18 /// The writer to which the output lines are written. | 20 /// The writer to which the output lines are written. |
19 final LineWriter _writer; | 21 final LineWriter _writer; |
20 | 22 |
21 /// Cached line info for calculating blank lines. | 23 /// Cached line info for calculating blank lines. |
22 LineInfo _lineInfo; | 24 LineInfo _lineInfo; |
23 | 25 |
24 /// The source being formatted. | 26 /// The source being formatted. |
25 final SourceCode _source; | 27 final SourceCode _source; |
26 | 28 |
27 /// `true` if the visitor has written past the beginning of the selection in | 29 /// `true` if the visitor has written past the beginning of the selection in |
28 /// the original source text. | 30 /// the original source text. |
29 bool _passedSelectionStart = false; | 31 bool _passedSelectionStart = false; |
30 | 32 |
31 /// `true` if the visitor has written past the end of the selection in the | 33 /// `true` if the visitor has written past the end of the selection in the |
32 /// original source text. | 34 /// original source text. |
33 bool _passedSelectionEnd = false; | 35 bool _passedSelectionEnd = false; |
34 | 36 |
35 /// Initialize a newly created visitor to write source code representing | 37 /// Initialize a newly created visitor to write source code representing |
36 /// the visited nodes to the given [writer]. | 38 /// the visited nodes to the given [writer]. |
37 SourceVisitor(DartFormatter formatter, this._lineInfo, SourceCode source) | 39 SourceVisitor(formatter, this._lineInfo, SourceCode source) |
38 : _source = source, | 40 : _formatter = formatter, |
| 41 _source = source, |
39 _writer = new LineWriter(formatter, source); | 42 _writer = new LineWriter(formatter, source); |
40 | 43 |
41 /// Runs the visitor on [node], formatting its contents. | 44 /// Runs the visitor on [node], formatting its contents. |
42 /// | 45 /// |
43 /// Returns a [SourceCode] containing the resulting formatted source and | 46 /// Returns a [SourceCode] containing the resulting formatted source and |
44 /// updated selection, if any. | 47 /// updated selection, if any. |
45 /// | 48 /// |
46 /// This is the only method that should be called externally. Everything else | 49 /// This is the only method that should be called externally. Everything else |
47 /// is effectively private. | 50 /// is effectively private. |
48 SourceCode run(AstNode node) { | 51 SourceCode run(AstNode node) { |
(...skipping 1533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1582 bool _isLambda(AstNode node) => | 1585 bool _isLambda(AstNode node) => |
1583 node.parent is FunctionExpression && | 1586 node.parent is FunctionExpression && |
1584 node.parent.parent is! FunctionDeclaration; | 1587 node.parent.parent is! FunctionDeclaration; |
1585 | 1588 |
1586 /// Writes the string literal [string] to the output. | 1589 /// Writes the string literal [string] to the output. |
1587 /// | 1590 /// |
1588 /// Splits multiline strings into separate chunks so that the line splitter | 1591 /// Splits multiline strings into separate chunks so that the line splitter |
1589 /// can handle them correctly. | 1592 /// can handle them correctly. |
1590 void _writeStringLiteral(String string, int offset) { | 1593 void _writeStringLiteral(String string, int offset) { |
1591 // Split each line of a multiline string into separate chunks. | 1594 // Split each line of a multiline string into separate chunks. |
1592 var lines = string.split("\n"); | 1595 var lines = string.split(_formatter.lineEnding); |
1593 | 1596 |
1594 _writeText(lines.first, offset); | 1597 _writeText(lines.first, offset); |
1595 offset += lines.first.length; | 1598 offset += lines.first.length; |
1596 | 1599 |
1597 for (var line in lines.skip(1)) { | 1600 for (var line in lines.skip(1)) { |
1598 _writer.writeWhitespace(Whitespace.newlineFlushLeft); | 1601 _writer.writeWhitespace(Whitespace.newlineFlushLeft); |
1599 offset++; | 1602 offset++; |
1600 _writeText(line, offset); | 1603 _writeText(line, offset); |
1601 offset += line.length; | 1604 offset += line.length; |
1602 } | 1605 } |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1798 /// Gets the 1-based line number that the beginning of [token] lies on. | 1801 /// Gets the 1-based line number that the beginning of [token] lies on. |
1799 int _startLine(Token token) => _lineInfo.getLocation(token.offset).lineNumber; | 1802 int _startLine(Token token) => _lineInfo.getLocation(token.offset).lineNumber; |
1800 | 1803 |
1801 /// Gets the 1-based line number that the end of [token] lies on. | 1804 /// Gets the 1-based line number that the end of [token] lies on. |
1802 int _endLine(Token token) => _lineInfo.getLocation(token.end).lineNumber; | 1805 int _endLine(Token token) => _lineInfo.getLocation(token.end).lineNumber; |
1803 | 1806 |
1804 /// Gets the 1-based column number that the beginning of [token] lies on. | 1807 /// Gets the 1-based column number that the beginning of [token] lies on. |
1805 int _startColumn(Token token) => | 1808 int _startColumn(Token token) => |
1806 _lineInfo.getLocation(token.offset).columnNumber; | 1809 _lineInfo.getLocation(token.offset).columnNumber; |
1807 } | 1810 } |
OLD | NEW |