# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# The analysis_options.yaml file at the repository root is the source of truth.
analyzer:
  exclude:
    - '**/generated/**'
linter:
  # Full list available at http://dart-lang.github.io/linter/lints/options/options.html.
  rules:
    - always_declare_return_types
    # This conflicts with the rules used by fx format-code:
    # - always_put_control_body_on_new_line
    - always_put_required_named_parameters_first
    - always_require_non_null_named_parameters
    # No longer useful with Dart 2.
    # - always_specify_types
    - annotate_overrides
    # Actively discouraged with Dart 2.
    # - avoid_annotating_with_dynamic
    # - avoid_as
    - avoid_bool_literals_in_conditional_expressions
    - avoid_catches_without_on_clauses
    - avoid_catching_errors
    # - avoid_classes_with_only_static_members
    # JS only.
    # - avoid_double_and_int_checks
    - avoid_empty_else
    # Not compatible with VS Code yet.
    # - avoid_field_initializers_in_const_classes
    - avoid_function_literals_in_foreach_calls
    - avoid_init_to_null
    # JS only.
    # - avoid_js_rounded_ints
    - avoid_null_checks_in_equality_operators
    - avoid_positional_boolean_parameters
    - avoid_private_typedef_functions
    - avoid_relative_lib_imports
    # This puts an unnecessary burden on API clients.
    # - avoid_renaming_method_parameters
    - avoid_return_types_on_setters
    - avoid_returning_null
    - avoid_returning_this
    - avoid_single_cascade_in_expression_statements
    # Conflicts with our dependency injection convention.
    # - avoid_setters_without_getters
    - avoid_slow_async_io
    - avoid_types_as_parameter_names
    # Not requiring this yet as it requires extensive changes to code base.
    # - avoid_types_on_closure_parameters
    - avoid_unused_constructor_parameters
    - await_only_futures
    - camel_case_types
    - cancel_subscriptions
    - cascade_invocations
    - close_sinks
    - constant_identifier_names
    - control_flow_in_finally
    # - directives_ordering
    - empty_catches
    - empty_constructor_bodies
    - empty_statements
    - hash_and_equals
    - implementation_imports
    - invariant_booleans
    - iterable_contains_unrelated_type
    - join_return_with_assignment
    - library_names
    - library_prefixes
    - list_remove_unrelated_type
    - literal_only_boolean_expressions
    - no_adjacent_strings_in_list
    - no_duplicate_case_values
    - non_constant_identifier_names
    # Not requiring this yet as it requires extensive changes to code base.
    # - omit_local_variable_types
    - one_member_abstracts
    - only_throw_errors
    - overridden_fields
    - package_api_docs
    - package_names
    - package_prefixed_library_names
    - parameter_assignments
    - prefer_adjacent_string_concatenation
    - prefer_asserts_in_initializer_lists
    - prefer_collection_literals
    - prefer_conditional_assignment
    # Disabled until bug is fixed
    # https://github.com/dart-lang/linter/issues/995
    # - prefer_const_constructors
    - prefer_const_constructors_in_immutables
    - prefer_const_declarations
    # Disabled until bug is fixed
    # https://github.com/dart-lang/linter/issues/995
    # - prefer_const_literals_to_create_immutables
    - prefer_constructors_over_static_methods
    - prefer_contains
    - prefer_equal_for_default_values
    # Add this when 'short' is better defined.
    # - prefer_expression_function_bodies
    - prefer_final_fields
    # The cruft/value ratio of this rule seems low.
    # - prefer_final_locals
    - prefer_foreach
    - prefer_function_declarations_over_variables
    - prefer_generic_function_type_aliases
    - prefer_initializing_formals
    - prefer_interpolation_to_compose_strings
    - prefer_is_empty
    - prefer_is_not_empty
    - prefer_iterable_whereType
    - prefer_single_quotes
    - prefer_typing_uninitialized_variables
    # This seems to create some cruft.
    # Disable and evaluate if this is causing underdocumentation
    # - public_member_api_docs
    - recursive_getters
    - slash_for_doc_comments
    - sort_unnamed_constructors_first
    - test_types_in_equals
    - throw_in_finally
    - type_annotate_public_apis
    - type_init_formals
    - unawaited_futures
    - unnecessary_brace_in_string_interps
    - unnecessary_const
    - unnecessary_getters_setters
    - unnecessary_lambdas
    - unnecessary_new
    - unnecessary_null_aware_assignments
    - unnecessary_null_in_if_null_operators
    - unnecessary_overrides
    # Turn on when https://github.com/dart-lang/linter/issues/997 is in flutter's version of dart.
    # - unnecessary_parenthesis
    - unnecessary_statements
    - unnecessary_this
    - unrelated_type_equality_checks
    - use_rethrow_when_possible
    - use_setters_to_change_properties
    - use_string_buffers
    - use_to_and_as_if_applicable
    - valid_regexps
    # Not compatible with VS Code yet.
    # - void_checks
