| Index: dart_style/lib/src/line_splitting/rule_set.dart
|
| diff --git a/dart_style/lib/src/line_splitting/rule_set.dart b/dart_style/lib/src/line_splitting/rule_set.dart
|
| deleted file mode 100644
|
| index 709b3739e671db0c1e2188e14ddd551ca5e82eb7..0000000000000000000000000000000000000000
|
| --- a/dart_style/lib/src/line_splitting/rule_set.dart
|
| +++ /dev/null
|
| @@ -1,157 +0,0 @@
|
| -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -library dart_style.src.line_splitting.rule_set;
|
| -
|
| -import '../rule/rule.dart';
|
| -
|
| -/// An optimized data structure for storing a set of values for some rules.
|
| -///
|
| -/// This conceptually behaves roughly like a `Map<Rule, int>`, but is much
|
| -/// faster since it avoids hashing. Instead, it assumes the line splitter has
|
| -/// provided an ordered list of [Rule]s and that each rule's [index] field has
|
| -/// been set to point to the rule in the list.
|
| -///
|
| -/// Internally, this then just stores the values in a sparse list whose indices
|
| -/// are the indices of the rules.
|
| -class RuleSet {
|
| - List<int> _values;
|
| -
|
| - RuleSet(int numRules) : this._(new List(numRules));
|
| -
|
| - RuleSet._(this._values);
|
| -
|
| - /// Returns `true` of [rule] is bound in this set.
|
| - bool contains(Rule rule) => _values[rule.index] != null;
|
| -
|
| - /// Gets the bound value for [rule] or `0` if it is not bound.
|
| - int getValue(Rule rule) {
|
| - var value = _values[rule.index];
|
| - if (value != null) return value;
|
| -
|
| - return 0;
|
| - }
|
| -
|
| - /// Invokes [callback] for each rule in [rules] with the rule's value, which
|
| - /// will be `null` if it is not bound.
|
| - void forEach(List<Rule> rules, callback(Rule rule, int value)) {
|
| - var i = 0;
|
| - for (var rule in rules) {
|
| - var value = _values[i];
|
| - if (value != null) callback(rule, value);
|
| - i++;
|
| - }
|
| - }
|
| -
|
| - /// Creates a new [RuleSet] with the same bound rule values as this one.
|
| - RuleSet clone() => new RuleSet._(_values.toList(growable: false));
|
| -
|
| - /// Binds [rule] to [value] then checks to see if that violates any
|
| - /// constraints.
|
| - ///
|
| - /// Returns `true` if all constraints between the bound rules are valid. Even
|
| - /// if not, this still modifies the [RuleSet].
|
| - ///
|
| - /// If an unbound rule gets constrained to `-1` (meaning it must split, but
|
| - /// can split any way it wants), invokes [onSplitRule] with it.
|
| - bool tryBind(List<Rule> rules, Rule rule, int value, onSplitRule(Rule rule)) {
|
| - _values[rule.index] = value;
|
| -
|
| - // Test this rule against the other rules being bound.
|
| - for (var other in rules) {
|
| - if (rule == other) continue;
|
| -
|
| - var otherValue = _values[other.index];
|
| - var constraint = rule.constrain(value, other);
|
| -
|
| - if (otherValue == null) {
|
| - // The other rule is unbound, so see if we can constrain it eagerly to
|
| - // a value now.
|
| - if (constraint == -1) {
|
| - // If we know the rule has to split and there's only one way it can,
|
| - // just bind that.
|
| - if (other.numValues == 2) {
|
| - if (!tryBind(rules, other, 1, onSplitRule)) return false;
|
| - } else {
|
| - onSplitRule(other);
|
| - }
|
| - } else if (constraint != null) {
|
| - // Bind the other rule to its value and recursively propagate its
|
| - // constraints.
|
| - if (!tryBind(rules, other, constraint, onSplitRule)) return false;
|
| - }
|
| - } else {
|
| - // It's already bound, so see if the new rule's constraint disallows
|
| - // that value.
|
| - if (constraint == -1) {
|
| - if (otherValue == 0) return false;
|
| - } else if (constraint != null) {
|
| - if (otherValue != constraint) return false;
|
| - }
|
| -
|
| - // See if the other rule's constraint allows us to use this value.
|
| - constraint = other.constrain(otherValue, rule);
|
| - if (constraint == -1) {
|
| - if (value == 0) return false;
|
| - } else if (constraint != null) {
|
| - if (value != constraint) return false;
|
| - }
|
| - }
|
| - }
|
| -
|
| - return true;
|
| - }
|
| -
|
| - String toString() =>
|
| - _values.map((value) => value == null ? "?" : value).join(" ");
|
| -}
|
| -
|
| -/// For each chunk, this tracks if it has been split and, if so, what the
|
| -/// chosen column is for the following line.
|
| -///
|
| -/// Internally, this uses a list where each element corresponds to the column
|
| -/// of the chunk at that index in the chunk list, or `null` if that chunk did
|
| -/// not split. This had about a 10% perf improvement over using a [Set] of
|
| -/// splits.
|
| -class SplitSet {
|
| - List<int> _columns;
|
| -
|
| - /// The cost of the solution that led to these splits.
|
| - int get cost => _cost;
|
| - int _cost;
|
| -
|
| - /// Creates a new empty split set for a line with [numChunks].
|
| - SplitSet(int numChunks) : _columns = new List(numChunks - 1);
|
| -
|
| - /// Marks the line after chunk [index] as starting at [column].
|
| - void add(int index, int column) {
|
| - _columns[index] = column;
|
| - }
|
| -
|
| - /// Returns `true` if the chunk at [splitIndex] should be split.
|
| - bool shouldSplitAt(int index) =>
|
| - index < _columns.length && _columns[index] != null;
|
| -
|
| - /// Gets the zero-based starting column for the chunk at [index].
|
| - int getColumn(int index) => _columns[index];
|
| -
|
| - /// Sets the resulting [cost] for the splits.
|
| - ///
|
| - /// This can only be called once.
|
| - void setCost(int cost) {
|
| - assert(_cost == null);
|
| - _cost = cost;
|
| - }
|
| -
|
| - String toString() {
|
| - var result = [];
|
| - for (var i = 0; i < _columns.length; i++) {
|
| - if (_columns[i] != null) {
|
| - result.add("$i:${_columns[i]}");
|
| - }
|
| - }
|
| -
|
| - return result.join(" ");
|
| - }
|
| -}
|
|
|