Index: dart_style/lib/src/rule/argument.dart |
diff --git a/dart_style/lib/src/rule/argument.dart b/dart_style/lib/src/rule/argument.dart |
deleted file mode 100644 |
index 813bfb1087dba662b5bf0bbfaaf10fa54ab317ee..0000000000000000000000000000000000000000 |
--- a/dart_style/lib/src/rule/argument.dart |
+++ /dev/null |
@@ -1,310 +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.rule.argument; |
- |
-import '../chunk.dart'; |
-import 'rule.dart'; |
- |
-/// Base class for a rule that handles argument or parameter lists. |
-abstract class ArgumentRule extends Rule { |
- /// The rule used to split collections in the argument list, if any. |
- final Rule _collectionRule; |
- |
- /// If true, then inner rules that are written will force this rule to split. |
- /// |
- /// Temporarily disabled while writing collectio arguments so that they can be |
- /// multi-line without forcing the whole argument list to split. |
- bool _trackInnerRules = true; |
- |
- /// Don't split when an inner collection rule splits. |
- bool get splitsOnInnerRules => _trackInnerRules; |
- |
- /// Creates a new rule for a positional argument list. |
- /// |
- /// If [_collectionRule] is given, it is the rule used to split the |
- /// collections in the list. |
- ArgumentRule(this._collectionRule); |
- |
- /// Called before a collection argument is written. |
- /// |
- /// Disables tracking inner rules while a collection argument is written. |
- void beforeCollection() { |
- assert(_trackInnerRules == true); |
- _trackInnerRules = false; |
- } |
- |
- /// Called after a collection argument is complete. |
- /// |
- /// Re-enables tracking inner rules. |
- void afterCollection() { |
- assert(_trackInnerRules == false); |
- _trackInnerRules = true; |
- } |
-} |
- |
-/// Base class for a rule for handling positional argument lists. |
-abstract class PositionalRule extends ArgumentRule { |
- /// The chunks prior to each positional argument. |
- final List<Chunk> _arguments = []; |
- |
- /// If there are named arguments following these positional ones, this will |
- /// be their rule. |
- Rule _namedArgsRule; |
- |
- /// Creates a new rule for a positional argument list. |
- /// |
- /// If [collectionRule] is given, it is the rule used to split the collection |
- /// arguments in the list. |
- PositionalRule(Rule collectionRule) : super(collectionRule); |
- |
- /// Remembers [chunk] as containing the split that occurs right before an |
- /// argument in the list. |
- void beforeArgument(Chunk chunk) { |
- _arguments.add(chunk); |
- } |
- |
- /// Remembers that [rule] is the [NamedArgsRule] immediately following this |
- /// positional argument list. |
- void setNamedArgsRule(NamedRule rule) { |
- _namedArgsRule = rule; |
- } |
- |
- /// Constrains the named argument list to at least move to the next line if |
- /// there are any splits in the positional arguments. Prevents things like: |
- /// |
- /// function( |
- /// argument, |
- /// argument, named: argument); |
- int constrain(int value, Rule other) { |
- var constrained = super.constrain(value, other); |
- if (constrained != null) return constrained; |
- |
- // Handle the relationship between the positional and named args. |
- if (other == _namedArgsRule) { |
- // If the positional args are one-per-line, the named args are too. |
- if (value == fullySplitValue) return _namedArgsRule.fullySplitValue; |
- |
- // Otherwise, if there is any split in the positional arguments, don't |
- // allow the named arguments on the same line as them. |
- if (value != 0) return -1; |
- } |
- |
- return null; |
- } |
-} |
- |
-/// Split rule for a call with a single positional argument (which may or may |
-/// not be a collection argument.) |
-class SinglePositionalRule extends PositionalRule { |
- int get numValues => 2; |
- |
- /// If there is only a single non-collection argument, allow it to split |
- /// internally without forcing a split before the argument. |
- final bool splitsOnInnerRules; |
- |
- bool hack = false; |
- |
- /// Creates a new rule for a positional argument list. |
- /// |
- /// If [collectionRule] is given, it is the rule used to split the |
- /// collections in the list. If [splitsOnInnerRules] is `true`, then we will |
- /// split before the argument if the argument itself contains a split. |
- SinglePositionalRule(Rule collectionRule, {bool splitsOnInnerRules}) |
- : super(collectionRule), |
- splitsOnInnerRules = |
- splitsOnInnerRules != null ? splitsOnInnerRules : false; |
- |
- bool isSplit(int value, Chunk chunk) => value == 1; |
- |
- int constrain(int value, Rule other) { |
- var constrained = super.constrain(value, other); |
- if (constrained != null) return constrained; |
- |
- if (other != _collectionRule) return null; |
- |
- // If we aren't splitting any args, we can split the collection. |
- if (value == 0) return null; |
- |
- // We are splitting before a collection, so don't let it split internally. |
- return 0; |
- } |
- |
- String toString() => "1Pos${super.toString()}"; |
-} |
- |
-/// Split rule for a call with more than one positional argument. |
-/// |
-/// The number of values is based on the number of arguments and whether or not |
-/// there are bodies. The first two values are always: |
-/// |
-/// * 0: Do not split at all. |
-/// * 1: Split only before the first argument. |
-/// |
-/// Then there is a value for each argument, to split before that argument. |
-/// These values work back to front. So, for a two-argument list, value 2 splits |
-/// after the second argument and value 3 splits after the first. |
-/// |
-/// Then there is a value that splits before every argument. |
-/// |
-/// Finally, if there are collection arguments, there is another value that |
-/// splits before all of the non-collection arguments, but does not split |
-/// before the collections, so that they can split internally. |
-class MultiplePositionalRule extends PositionalRule { |
- /// The number of leading collection arguments. |
- /// |
- /// This and [_trailingCollections] cannot both be positive. If every |
- /// argument is a collection, this will be [_arguments.length] and |
- /// [_trailingCollections] will be 0. |
- final int _leadingCollections; |
- |
- /// The number of trailing collections. |
- /// |
- /// This and [_leadingCollections] cannot both be positive. |
- final int _trailingCollections; |
- |
- int get numValues { |
- // Can split before any one argument, none, or all. |
- var result = 2 + _arguments.length; |
- |
- // When there are collection arguments, there are two ways we can split on |
- // "all" arguments: |
- // |
- // - Split on just the non-collection arguments, and force the collection |
- // arguments to split internally. |
- // - Split on all of them including the collection arguments, and do not |
- // allow the collection arguments to split internally. |
- if (_leadingCollections > 0 || _trailingCollections > 0) result++; |
- |
- return result; |
- } |
- |
- MultiplePositionalRule( |
- Rule collectionRule, this._leadingCollections, this._trailingCollections) |
- : super(collectionRule); |
- |
- String toString() => "*Pos${super.toString()}"; |
- |
- bool isSplit(int value, Chunk chunk) { |
- // Don't split at all. |
- if (value == 0) return false; |
- |
- // Split only before the first argument. Keep the entire argument list |
- // together on the next line. |
- if (value == 1) return chunk == _arguments.first; |
- |
- // Split before a single argument. Try later arguments before earlier ones |
- // to try to keep as much on the first line as possible. |
- if (value <= _arguments.length) { |
- var argument = _arguments.length - value + 1; |
- return chunk == _arguments[argument]; |
- } |
- |
- // Only split before the non-collection arguments. |
- if (value == _arguments.length + 1) { |
- for (var i = 0; i < _leadingCollections; i++) { |
- if (chunk == _arguments[i]) return false; |
- } |
- |
- for (var i = _arguments.length - _trailingCollections; |
- i < _arguments.length; |
- i++) { |
- if (chunk == _arguments[i]) return false; |
- } |
- |
- return true; |
- } |
- |
- // Split before all of the arguments, even the collections. |
- return true; |
- } |
- |
- int constrain(int value, Rule other) { |
- var constrained = super.constrain(value, other); |
- if (constrained != null) return constrained; |
- |
- if (other != _collectionRule) return null; |
- |
- // If we aren't splitting any args, we can split the collection. |
- if (value == 0) return null; |
- |
- // Split only before the first argument. |
- if (value == 1) { |
- if (_leadingCollections > 0) { |
- // We are splitting before a collection, so don't let it split |
- // internally. |
- return 0; |
- } else { |
- // The split is outside of the collections so they can split or not. |
- return null; |
- } |
- } |
- |
- // Split before a single argument. If it's in the middle of the collection |
- // arguments, don't allow them to split. |
- if (value <= _arguments.length) { |
- var argument = _arguments.length - value + 1; |
- if (argument < _leadingCollections) return 0; |
- if (argument >= _arguments.length - _trailingCollections) return 0; |
- |
- return null; |
- } |
- |
- // Only split before the non-collection arguments. This case only comes into |
- // play when we do want to split the collection, so force that here. |
- if (value == _arguments.length + 1) return 1; |
- |
- // Split before all of the arguments, even the collection, so don't let |
- // them split. |
- return 0; |
- } |
-} |
- |
-/// Splitting rule for a list of named arguments or parameters. Its values mean: |
-/// |
-/// * 0: Do not split at all. |
-/// * 1: Split only before first argument. |
-/// * 2: Split before all arguments, including the first. |
-class NamedRule extends ArgumentRule { |
- /// The chunk prior to the first named argument. |
- Chunk _first; |
- |
- int get numValues => 3; |
- |
- NamedRule(Rule collectionRule) : super(collectionRule); |
- |
- void beforeArguments(Chunk chunk) { |
- assert(_first == null); |
- _first = chunk; |
- } |
- |
- bool isSplit(int value, Chunk chunk) { |
- switch (value) { |
- case 0: |
- return false; |
- case 1: |
- return chunk == _first; |
- case 2: |
- return true; |
- } |
- |
- throw "unreachable"; |
- } |
- |
- int constrain(int value, Rule other) { |
- var constrained = super.constrain(value, other); |
- if (constrained != null) return constrained; |
- |
- if (other != _collectionRule) return null; |
- |
- // If we aren't splitting any args, we can split the collection. |
- if (value == 0) return null; |
- |
- // Split before all of the arguments, even the collections, so don't let |
- // them split. |
- return 0; |
- } |
- |
- String toString() => "Named${super.toString()}"; |
-} |