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.chunk; | 5 library dart_style.src.chunk; |
6 | 6 |
7 import 'fast_hash.dart'; | 7 import 'fast_hash.dart'; |
8 import 'nesting_level.dart'; | 8 import 'nesting_level.dart'; |
9 import 'rule/rule.dart'; | 9 import 'rule/rule.dart'; |
10 | 10 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 /// called, no more text should be added to the chunk since it would appear | 107 /// called, no more text should be added to the chunk since it would appear |
108 /// *before* the split. | 108 /// *before* the split. |
109 bool get canAddText => _rule == null; | 109 bool get canAddText => _rule == null; |
110 | 110 |
111 /// The [Rule] that controls when a split should occur after this chunk. | 111 /// The [Rule] that controls when a split should occur after this chunk. |
112 /// | 112 /// |
113 /// Multiple splits may share a [Rule]. | 113 /// Multiple splits may share a [Rule]. |
114 Rule get rule => _rule; | 114 Rule get rule => _rule; |
115 Rule _rule; | 115 Rule _rule; |
116 | 116 |
117 /// Whether this chunk is always followed by a newline or whether the line | |
118 /// splitter may choose to keep the next chunk on the same line. | |
119 bool get isHardSplit => _rule is HardSplitRule; | |
120 | |
121 /// Whether or not an extra blank line should be output after this chunk if | 117 /// Whether or not an extra blank line should be output after this chunk if |
122 /// it's split. | 118 /// it's split. |
123 /// | 119 /// |
124 /// Internally, this can be either `true`, `false`, or `null`. The latter is | 120 /// Internally, this can be either `true`, `false`, or `null`. The latter is |
125 /// an indeterminate state that lets later modifications to the split decide | 121 /// an indeterminate state that lets later modifications to the split decide |
126 /// whether it should be double or not. | 122 /// whether it should be double or not. |
127 /// | 123 /// |
128 /// However, this getter does not expose that. It will return `false` if the | 124 /// However, this getter does not expose that. It will return `false` if the |
129 /// chunk is still indeterminate. | 125 /// chunk is still indeterminate. |
130 bool get isDouble => _isDouble != null ? _isDouble : false; | 126 bool get isDouble => _isDouble != null ? _isDouble : false; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 void allowText() { | 186 void allowText() { |
191 _rule = null; | 187 _rule = null; |
192 } | 188 } |
193 | 189 |
194 /// Append [text] to the end of the split's text. | 190 /// Append [text] to the end of the split's text. |
195 void appendText(String text) { | 191 void appendText(String text) { |
196 assert(canAddText); | 192 assert(canAddText); |
197 _text += text; | 193 _text += text; |
198 } | 194 } |
199 | 195 |
200 /// Forces this soft split to become a hard split. | |
201 /// | |
202 /// This is called on the soft splits owned by a rule that decides to harden | |
203 /// when it finds out another hard split occurs within its chunks. | |
204 void harden() { | |
205 _rule = new HardSplitRule(); | |
206 spans.clear(); | |
207 } | |
208 | |
209 /// Finishes off this chunk with the given [rule] and split information. | 196 /// Finishes off this chunk with the given [rule] and split information. |
210 /// | 197 /// |
211 /// This may be called multiple times on the same split since the splits | 198 /// This may be called multiple times on the same split since the splits |
212 /// produced by walking the source and the splits coming from comments and | 199 /// produced by walking the source and the splits coming from comments and |
213 /// preserved whitespace often overlap. When that happens, this has logic to | 200 /// preserved whitespace often overlap. When that happens, this has logic to |
214 /// combine that information into a single split. | 201 /// combine that information into a single split. |
215 void applySplit(Rule rule, int indent, NestingLevel nesting, | 202 void applySplit(Rule rule, int indent, NestingLevel nesting, |
216 {bool flushLeft, bool isDouble, bool space}) { | 203 {bool flushLeft, bool isDouble, bool space}) { |
217 if (flushLeft == null) flushLeft = false; | 204 if (flushLeft == null) flushLeft = false; |
218 if (space == null) space = false; | 205 if (space == null) space = false; |
219 if (isHardSplit || rule is HardSplitRule) { | 206 if (rule.isHardened) { |
220 // A hard split always wins. | 207 // A hard split always wins. |
221 _rule = rule; | 208 _rule = rule; |
222 } else if (_rule == null) { | 209 } else if (_rule == null) { |
223 // If the chunk hasn't been initialized yet, just inherit the rule. | 210 // If the chunk hasn't been initialized yet, just inherit the rule. |
224 _rule = rule; | 211 _rule = rule; |
225 } | 212 } |
226 | 213 |
227 // Last split settings win. | 214 // Last split settings win. |
228 _flushLeft = flushLeft; | 215 _flushLeft = flushLeft; |
229 _nesting = nesting; | 216 _nesting = nesting; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 | 251 |
265 if (text.isNotEmpty) parts.add(text); | 252 if (text.isNotEmpty) parts.add(text); |
266 | 253 |
267 if (_indent != null) parts.add("indent:$_indent"); | 254 if (_indent != null) parts.add("indent:$_indent"); |
268 if (spaceWhenUnsplit == true) parts.add("space"); | 255 if (spaceWhenUnsplit == true) parts.add("space"); |
269 if (_isDouble == true) parts.add("double"); | 256 if (_isDouble == true) parts.add("double"); |
270 if (_flushLeft == true) parts.add("flush"); | 257 if (_flushLeft == true) parts.add("flush"); |
271 | 258 |
272 if (_rule == null) { | 259 if (_rule == null) { |
273 parts.add("(no split)"); | 260 parts.add("(no split)"); |
274 } else if (isHardSplit) { | |
275 parts.add("hard"); | |
276 } else { | 261 } else { |
277 parts.add(rule.toString()); | 262 parts.add(rule.toString()); |
| 263 if (rule.isHardened) parts.add("(hard)"); |
278 | 264 |
279 if (_rule.constrainedRules.isNotEmpty) { | 265 if (_rule.constrainedRules.isNotEmpty) { |
280 parts.add("-> ${_rule.constrainedRules.join(' ')}"); | 266 parts.add("-> ${_rule.constrainedRules.join(' ')}"); |
281 } | 267 } |
282 } | 268 } |
283 | 269 |
284 return parts.join(" "); | 270 return parts.join(" "); |
285 } | 271 } |
286 } | 272 } |
287 | 273 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 /// output. This way, commented out chunks of code do not get erroneously | 389 /// output. This way, commented out chunks of code do not get erroneously |
404 /// re-indented. | 390 /// re-indented. |
405 final bool flushLeft; | 391 final bool flushLeft; |
406 | 392 |
407 /// Whether this comment is an inline block comment. | 393 /// Whether this comment is an inline block comment. |
408 bool get isInline => linesBefore == 0 && !isLineComment; | 394 bool get isInline => linesBefore == 0 && !isLineComment; |
409 | 395 |
410 SourceComment(this.text, this.linesBefore, | 396 SourceComment(this.text, this.linesBefore, |
411 {this.isLineComment, this.flushLeft}); | 397 {this.isLineComment, this.flushLeft}); |
412 } | 398 } |
OLD | NEW |