| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| 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. | |
| 4 | |
| 5 library dart_style.src.nesting_level; | |
| 6 | |
| 7 import 'fast_hash.dart'; | |
| 8 | |
| 9 /// A single level of expression nesting. | |
| 10 /// | |
| 11 /// When a line is split in the middle of an expression, this tracks the | |
| 12 /// context of where in the expression that split occurs. It ensures that the | |
| 13 /// [LineSplitter] obeys the expression nesting when deciding what column to | |
| 14 /// start lines at when split inside an expression. | |
| 15 /// | |
| 16 /// Each instance of this represents a single level of expression nesting. If we | |
| 17 /// split at to chunks with different levels of nesting, the splitter ensures | |
| 18 /// they each get assigned to different columns. | |
| 19 /// | |
| 20 /// In addition, each level has an indent. This is the number of spaces it is | |
| 21 /// indented relative to the outer expression. It's almost always | |
| 22 /// [Indent.expression], but cascades are special magic snowflakes and use | |
| 23 /// [Indent.cascade]. | |
| 24 class NestingLevel extends FastHash { | |
| 25 /// The nesting level surrounding this one, or `null` if this is represents | |
| 26 /// top level code in a block. | |
| 27 NestingLevel get parent => _parent; | |
| 28 NestingLevel _parent; | |
| 29 | |
| 30 /// The number of characters that this nesting level is indented relative to | |
| 31 /// the containing level. | |
| 32 /// | |
| 33 /// Normally, this is [Indent.expression], but cascades use [Indent.cascade]. | |
| 34 final int indent; | |
| 35 | |
| 36 /// The total number of characters of indentation from this level and all of | |
| 37 /// its parents, after determining which nesting levels are actually used. | |
| 38 /// | |
| 39 /// This is only valid during line splitting. | |
| 40 int get totalUsedIndent => _totalUsedIndent; | |
| 41 int _totalUsedIndent; | |
| 42 | |
| 43 bool get isNested => _parent != null; | |
| 44 | |
| 45 NestingLevel() : indent = 0; | |
| 46 | |
| 47 NestingLevel._(this._parent, this.indent); | |
| 48 | |
| 49 /// Creates a new deeper level of nesting indented [spaces] more characters | |
| 50 /// that the outer level. | |
| 51 NestingLevel nest(int spaces) => new NestingLevel._(this, spaces); | |
| 52 | |
| 53 /// Clears the previously calculated total indent of this nesting level. | |
| 54 void clearTotalUsedIndent() { | |
| 55 _totalUsedIndent = null; | |
| 56 if (_parent != null) _parent.clearTotalUsedIndent(); | |
| 57 } | |
| 58 | |
| 59 /// Calculates the total amount of indentation from this nesting level and | |
| 60 /// all of its parents assuming only [usedNesting] levels are in use. | |
| 61 void refreshTotalUsedIndent(Set<NestingLevel> usedNesting) { | |
| 62 if (_totalUsedIndent != null) return; | |
| 63 | |
| 64 _totalUsedIndent = 0; | |
| 65 | |
| 66 if (_parent != null) { | |
| 67 _parent.refreshTotalUsedIndent(usedNesting); | |
| 68 _totalUsedIndent += _parent.totalUsedIndent; | |
| 69 } | |
| 70 | |
| 71 if (usedNesting.contains(this)) _totalUsedIndent += indent; | |
| 72 } | |
| 73 | |
| 74 String toString() { | |
| 75 if (_parent == null) return indent.toString(); | |
| 76 return "$parent:$indent"; | |
| 77 } | |
| 78 } | |
| OLD | NEW |