blob: 263e5b737c4603cb622ea6dc3cd171c4f1011fdf [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 'dart:collection';
import 'package:analyzer/src/dart/error/lint_codes.dart';
import 'package:analyzer/src/lint/config.dart';
import 'package:analyzer/src/lint/linter.dart';
/// Registry of lint rules and warning rules.
class Registry with IterableMixin<AnalysisRule> {
/// The default registry to be used by clients.
static final Registry ruleRegistry = Registry();
/// A table mapping rule names to rules.
final Map<String, AnalysisRule> _lintRules = {};
final Map<String, AnalysisRule> _warningRules = {};
/// A table mapping unique names to lint codes.
final Map<String, LintCode> _codeMap = {};
@override
Iterator<AnalysisRule> get iterator => _rules.values.iterator;
/// Returns a list of the rules that are defined.
Iterable<AnalysisRule> get rules => _rules.values;
// TODO(srawlins): This process can result in collisions. Guard against this
// somehow.
Map<String, AnalysisRule> get _rules => {..._lintRules, ..._warningRules};
/// Returns the rule with the given [name].
AnalysisRule? operator [](String name) => _rules[name];
/// Returns the lint code that has the given [uniqueName].
LintCode? codeForUniqueName(String uniqueName) => _codeMap[uniqueName];
/// Returns a list of the enabled rules.
///
/// This includes any warning rules, which are enabled by default and are not
/// disabled by the given [ruleConfigs], and any lint rules which are
/// explicitly enabled by the given [ruleConfigs].
///
/// For example:
/// my_rule: true
///
/// enables `my_rule`.
Iterable<AnalysisRule> enabled(Map<String, RuleConfig> ruleConfigs) => [
// All warning rules that haven't explicitly been disabled.
..._warningRules.values
.where((rule) => ruleConfigs[rule.name]?.isEnabled ?? true),
// All lint rules that have explicitly been enabled.
..._lintRules.values
.where((rule) => ruleConfigs[rule.name]?.isEnabled ?? false),
];
/// Returns the rule with the given [name].
AnalysisRule? getRule(String name) => _rules[name];
/// Adds the given lint [rule] to this registry.
void registerLintRule(AnalysisRule rule) {
_lintRules[rule.name] = rule;
for (var lintCode in rule.lintCodes) {
_codeMap[lintCode.uniqueName] = lintCode;
}
}
/// Adds the given warning [rule] to this registry.
void registerWarningRule(AnalysisRule rule) {
_warningRules[rule.name] = rule;
for (var lintCode in rule.lintCodes) {
_codeMap[lintCode.uniqueName] = lintCode;
}
}
/// Removes the given lint [rule] from this registry.
void unregisterLintRule(AnalysisRule rule) {
_lintRules.remove(rule.name);
for (var lintCode in rule.lintCodes) {
_codeMap.remove(lintCode.uniqueName);
}
}
/// Removes the given warning [rule] from this registry.
void unregisterWarningRule(AnalysisRule rule) {
_warningRules.remove(rule.name);
for (var lintCode in rule.lintCodes) {
_codeMap.remove(lintCode.uniqueName);
}
}
}