blob: 3d59e9694c0ca181a770bfeb739498c2aaebce6d [file] [log] [blame]
// 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.
import 'argument.dart';
import 'rule.dart';
/// Rule for handling splits between parameter metadata annotations and the
/// following parameter.
///
/// Metadata annotations for parameters (and type parameters) get some special
/// handling. We use a single rule for all annotations in the parameter list.
/// If any of the annotations split, they all do.
///
/// Also, if the annotations split, we force the entire parameter list to fully
/// split, both named and positional.
class MetadataRule extends Rule {
Rule? _positionalRule;
Rule? _namedRule;
/// Remembers that [rule] is the [PositionalRule] used by the argument list
/// containing the parameter metadata using this rule.
void bindPositionalRule(PositionalRule rule) {
_positionalRule = rule;
}
/// Remembers that [rule] is the [NamedRule] used by the argument list
/// containing the parameter metadata using this rule.
void bindNamedRule(NamedRule rule) {
_namedRule = rule;
}
/// Constrains the surrounding argument list rules to fully split if the
/// metadata does.
@override
int? constrain(int value, Rule other) {
var constrained = super.constrain(value, other);
if (constrained != null) return constrained;
// If the metadata doesn't split, we don't care what the arguments do.
if (value == Rule.unsplit) return null;
// Otherwise, they have to split.
if (other == _positionalRule) return _positionalRule!.fullySplitValue;
if (other == _namedRule) return _namedRule!.fullySplitValue;
return null;
}
@override
void addConstrainedRules(Set<Rule> rules) {
if (_positionalRule != null) rules.add(_positionalRule!);
if (_namedRule != null) rules.add(_namedRule!);
}
@override
void forgetUnusedRules() {
super.forgetUnusedRules();
if (_positionalRule?.index == null) _positionalRule = null;
if (_namedRule?.index == null) _namedRule = null;
}
}