// 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/lint/config.dart';
import 'package:analyzer/src/lint/linter.dart';

/**
 * Registry of lint rules.
 */
class Registry extends Object with IterableMixin<LintRule> {
  /**
   * The default registry to be used by clients.
   */
  static final Registry ruleRegistry = new Registry();

  /**
   * A table mapping rule names to rules.
   */
  Map<String, LintRule> _ruleMap = <String, LintRule>{};

  /**
   * A list of the default lint rules.
   */
  List<LintRule> _defaultRules = <LintRule>[];

  /**
   * Return a list of the default lint rules.
   */
  List<LintRule> get defaultRules => _defaultRules;

  @override
  Iterator<LintRule> get iterator => _ruleMap.values.iterator;

  /**
   * Return a list of the rules that are defined.
   */
  Iterable<LintRule> get rules => _ruleMap.values;

  /**
   * Return the lint rule with the given [name].
   */
  LintRule operator [](String name) => _ruleMap[name];

  /**
   * Return a list of the lint rules explicitly enabled by the given [config].
   *
   * For example:
   *     my_rule: true
   *
   * enables `my_rule`.
   *
   * Unspecified rules are treated as disabled by default.
   */
  Iterable<LintRule> enabled(LintConfig config) => rules
      .where((rule) => config.ruleConfigs.any((rc) => rc.enables(rule.name)));

  /**
   * Return the lint rule with the given [name].
   */
  LintRule getRule(String name) => _ruleMap[name];

  /**
   * Add the given lint [rule] to this registry.
   */
  void register(LintRule rule) {
    _ruleMap[rule.name] = rule;
  }

  /**
   * Add the given lint [rule] to this registry and mark it as being a default
   * lint (one that will be run if lints are requested but no rules are enabled.
   */
  void registerDefault(LintRule rule) {
    register(rule);
    _defaultRules.add(rule);
  }
}
