# Specify analysis options.
#
# Until there are meta linter rules, each desired lint must be explicitly enabled.
# See: https://github.com/dart-lang/linter/issues/288
#
# For a list of lints, see: http://dart-lang.github.io/linter/lints/
# See the configuration guide for more
# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
#
# There are three similar analysis options files in the flutter repo:
#   - analysis_options.yaml
#   - analysis_options_repo.yaml (this file)
#   - packages/flutter/lib/analysis_options_user.yaml
#
# This file contains the analysis options used by 'flutter analyze' when analyzing
# the flutter repository. It is very similar to analysis_options.yaml;
# the only difference (currently) is the public_member_api_docs option,
# which is turned on and programmatically reduced to a single output line
# indicating the # of violations for that rule.

analyzer:
  language:
    enableStrictCallChecks: true
    enableSuperMixins: true
    enableAssertInitializer: true
  strong-mode:
    implicit-dynamic: false
  errors:
    # treat missing required parameters as a warning (not a hint)
    missing_required_param: warning
    # treat missing returns as a warning (not a hint)
    missing_return: warning
    # allow having TODOs in the code
    todo: ignore
  # `flutter analyze` (without `--watch`) just ignores directories
  # that contain a .dartignore file, and this file does not have any
  # effect on what files are actually analyzed.

linter:
  rules:
    # these rules are documented on and in the same order as
    # the Dart Lint rules page to make maintenance easier
    # http://dart-lang.github.io/linter/lints/

    # === error rules ===
    - avoid_empty_else
    - avoid_slow_async_io
    - cancel_subscriptions
    # - close_sinks # https://github.com/flutter/flutter/issues/5789
    # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153
    - control_flow_in_finally
    - empty_statements
    - hash_and_equals
    # - invariant_booleans # https://github.com/flutter/flutter/issues/5790
    - iterable_contains_unrelated_type
    - list_remove_unrelated_type
    # - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791
    - no_adjacent_strings_in_list
    - no_duplicate_case_values
    - test_types_in_equals
    - throw_in_finally
    - unrelated_type_equality_checks
    - valid_regexps

    # === style rules ===
    - always_declare_return_types
    - always_put_control_body_on_new_line
    # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
    - always_require_non_null_named_parameters
    - always_specify_types
    - annotate_overrides
    # - avoid_annotating_with_dynamic # not yet tested
    - avoid_as
    # - avoid_catches_without_on_clauses # not yet tested
    # - avoid_catching_errors # not yet tested
    # - avoid_classes_with_only_static_members # not yet tested
    # - avoid_function_literals_in_foreach_calls # not yet tested
    - avoid_init_to_null
    - avoid_null_checks_in_equality_operators
    # - avoid_positional_boolean_parameters # not yet tested
    - avoid_return_types_on_setters
    # - avoid_returning_null # not yet tested
    # - avoid_returning_this # not yet tested
    # - avoid_setters_without_getters # not yet tested
    # - avoid_types_on_closure_parameters # not yet tested
    - await_only_futures
    - camel_case_types
    # - cascade_invocations # not yet tested
    # - constant_identifier_names # https://github.com/dart-lang/linter/issues/204
    - directives_ordering
    - empty_catches
    - empty_constructor_bodies
    - implementation_imports
    # - join_return_with_assignment # not yet tested
    - library_names
    - library_prefixes
    - non_constant_identifier_names
    # - omit_local_variable_types # opposite of always_specify_types
    # - one_member_abstracts # too many false positives
    # - only_throw_errors # https://github.com/flutter/flutter/issues/5792
    - overridden_fields
    - package_api_docs
    - package_prefixed_library_names
    # - parameter_assignments # we do this commonly
    - prefer_adjacent_string_concatenation
    # - prefer_asserts_in_initializer_lists # not yet tested
    - prefer_collection_literals
    # - prefer_conditional_assignment # not yet tested
    - prefer_const_constructors
    # - prefer_const_constructors_in_immutables # not yet tested
    # - prefer_constructors_over_static_methods # not yet tested
    - prefer_contains
    # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
    # - prefer_final_fields # https://github.com/dart-lang/linter/issues/506
    - prefer_final_locals
    # - prefer_foreach # not yet tested
    # - prefer_function_declarations_over_variables # not yet tested
    - prefer_initializing_formals
    # - prefer_interpolation_to_compose_strings # not yet tested
    - prefer_is_empty
    - prefer_is_not_empty
    # - prefer_single_quote_strings # not yet tested
    - public_member_api_docs # this is the only difference from analysis_options_repo.yaml
    # - recursive_getters # https://github.com/dart-lang/linter/issues/452
    - slash_for_doc_comments
    - sort_constructors_first
    - sort_unnamed_constructors_first
    - super_goes_last
    # - type_annotate_public_apis # subset of always_specify_types
    - type_init_formals
    # - unawaited_futures # https://github.com/flutter/flutter/issues/5793
    - unnecessary_brace_in_string_interps
    - unnecessary_getters_setters
    # - unnecessary_lambdas # https://github.com/dart-lang/linter/issues/498
    - unnecessary_null_aware_assignments
    - unnecessary_null_in_if_null_operators
    # - unnecessary_overrides # https://github.com/dart-lang/linter/issues/626 and https://github.com/dart-lang/linter/issues/627
    - unnecessary_this
    - use_rethrow_when_possible
    # - use_setters_to_change_properties # not yet tested
    # - use_string_buffers # https://github.com/dart-lang/linter/pull/664
    # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review

    # === pub rules ===
    - package_names
