# 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 (this file)
#   - .analysis_options_repo
#   - packages/flutter/lib/analysis_options_user.yaml
#
# This file contains the analysis options used by Flutter editors, such as Atom.
# It is very similar to the .analysis_options_repo file in this same directory;
# the only difference (currently) is the public_member_api_docs option,
# which triggers too many messages to be used in editors.

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
  exclude:
    - 'bin/cache/**'
    # the following two are relative to the stocks example and the flutter package respectively
    # see https://github.com/dart-lang/sdk/issues/28463
    - 'lib/i18n/stock_messages_*.dart'
    - 'lib/src/http/**'

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_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 # not yet tested
    # - 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_collection_literals
    # - prefer_conditional_assignment # not yet tested
    - prefer_const_constructors
    # - 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
    # - public_member_api_docs # this is the only difference from .analysis_options_repo
    # - 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 # not yet tested
    # - use_setters_to_change_properties # not yet tested
    # - use_string_buffers # not yet tested
    # - use_to_and_as_if_applicable # not yet tested

    # === pub rules ===
    - package_names
