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.rule.metadata; | |
6 | |
7 import 'argument.dart'; | |
8 import 'rule.dart'; | |
9 | |
10 /// Rule for handling splits between parameter metadata annotations and the | |
11 /// following parameter. | |
12 /// | |
13 /// Metadata annotations for parameters (and type parameters) get some special | |
14 /// handling. We use a single rule for all annotations in the parameter list. | |
15 /// If any of the annotations split, they all do. | |
16 /// | |
17 /// Also, if the annotations split, we force the entire parameter list to fully | |
18 /// split, both named and positional. | |
19 class MetadataRule extends SimpleRule { | |
20 Rule _positionalRule; | |
21 Rule _namedRule; | |
22 | |
23 /// Remembers that [rule] is the [PositionalRule] used by the argument list | |
24 /// containing the parameter metadata using this rule. | |
25 void bindPositionalRule(PositionalRule rule) { | |
26 _positionalRule = rule; | |
27 } | |
28 | |
29 /// Remembers that [rule] is the [NamedRule] used by the argument list | |
30 /// containing the parameter metadata using this rule. | |
31 void bindNamedRule(NamedRule rule) { | |
32 _namedRule = rule; | |
33 } | |
34 | |
35 /// Constrains the surrounding argument list rules to fully split if the | |
36 /// metadata does. | |
37 int constrain(int value, Rule other) { | |
38 var constrained = super.constrain(value, other); | |
39 if (constrained != null) return constrained; | |
40 | |
41 // If the metadata doesn't split, we don't care what the arguments do. | |
42 if (value == 0) return null; | |
nweiz
2015/11/30 19:17:01
Consider making a getter for "value == 0", like is
Bob Nystrom
2015/11/30 21:36:14
Done.
| |
43 | |
44 // Otherwise, they have to split. | |
45 if (other == _positionalRule) return _positionalRule.fullySplitValue; | |
46 if (other == _namedRule) return _namedRule.fullySplitValue; | |
47 | |
48 return null; | |
49 } | |
50 | |
51 void addConstrainedRules(Set<Rule> rules) { | |
52 if (_positionalRule != null) rules.add(_positionalRule); | |
53 if (_namedRule != null) rules.add(_namedRule); | |
54 } | |
55 | |
56 void forgetUnusedRules() { | |
57 super.forgetUnusedRules(); | |
58 if (_positionalRule != null && _positionalRule.index == null) { | |
59 _positionalRule = null; | |
60 } | |
61 | |
62 if (_namedRule != null && _namedRule.index == null) { | |
63 _namedRule = null; | |
64 } | |
65 } | |
66 } | |
OLD | NEW |