# Copyright 2025 The Flutter Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
include: package:flutter_lints/flutter.yaml

analyzer:
  language:
    # strict-casts: true # Over 300 issues; mostly parsing JSON
    # Enabling strict-inference requires adding type annotations to a bunch of
    # silly locations; namely `Future.delayed`. Does not seem pragmatic right
    # now.
    # strict-inference: true # 34 issues
    # strict-raw-types: true # Over 100 issues.
  errors:
    # treat missing required parameters as a warning (not a hint)
    missing_required_param: warning
  exclude:
    - '**/build/**'
    - '**.freezed.dart'
    - tool/flutter-sdk/

linter:
  rules:
    # Added on top of the flutter/flutter lints:
    - prefer_generic_function_type_aliases

    # From flutter/flutter:
    # these rules are documented on and in the same order as
    # the Dart Lint rules page to make maintenance easier
    # https://github.com/dart-lang/linter/blob/master/example/all.yaml
    - 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_specify_types
    - annotate_overrides
    # - avoid_annotating_with_dynamic # conflicts with always_specify_types
    # - avoid_as # we use 'as' in this codebase
    # - avoid_bool_literals_in_conditional_expressions # not yet tested
    # - avoid_catches_without_on_clauses # we do this commonly
    # - avoid_catching_errors # we do this commonly
    - avoid_classes_with_only_static_members
    # - avoid_double_and_int_checks # only useful when targeting JS runtime
    - avoid_empty_else
    - avoid_dynamic_calls
    - avoid_field_initializers_in_const_classes
    - avoid_function_literals_in_foreach_calls
    - avoid_init_to_null
    # - avoid_js_rounded_ints # only useful when targeting JS runtime
    # - avoid_positional_boolean_parameters # not yet tested
    - avoid_print
    # - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
    - avoid_redundant_argument_values
    - avoid_relative_lib_imports
    - avoid_renaming_method_parameters
    - avoid_return_types_on_setters
    # - avoid_returning_null # we do this commonly
    # - avoid_returning_this # https://github.com/dart-lang/linter/issues/842
    # - avoid_setters_without_getters # not yet tested
    # - avoid_single_cascade_in_expression_statements # not yet tested
    - avoid_slow_async_io
    # - avoid_types_as_parameter_names # https://github.com/dart-lang/linter/pull/954/files
    # - avoid_types_on_closure_parameters # conflicts with always_specify_types
    - avoid_unnecessary_containers
    # - avoid_unused_constructor_parameters # https://github.com/dart-lang/linter/pull/847
    - await_only_futures
    - camel_case_types
    - cancel_subscriptions
    # - cascade_invocations # not yet tested
    # - close_sinks # https://github.com/flutter/flutter/issues/5789
    # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153
    # - constant_identifier_names # https://github.com/dart-lang/linter/issues/204
    - control_flow_in_finally
    - directives_ordering
    - discarded_futures
    - empty_catches
    - empty_constructor_bodies
    - empty_statements
    - hash_and_equals
    - implementation_imports
    # - join_return_with_assignment # not yet tested
    - library_names
    - library_prefixes
    # - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791
    - no_adjacent_strings_in_list
    - no_duplicate_case_values
    - 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_names
    - package_prefixed_library_names
    # - parameter_assignments # we do this commonly
    - prefer_adjacent_string_concatenation
    - prefer_asserts_in_initializer_lists
    - prefer_collection_literals
    - prefer_conditional_assignment
    - prefer_const_constructors
    - prefer_const_constructors_in_immutables
    - prefer_const_declarations
    - prefer_const_literals_to_create_immutables
    # - prefer_constructors_over_static_methods # not yet tested
    - prefer_contains
    # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md#consider-using--for-short-functions-and-methods
    - prefer_final_fields
    - prefer_final_in_for_each
    - prefer_final_locals
    - prefer_foreach
    # - prefer_function_declarations_over_variables # not yet tested
    - prefer_initializing_formals
    # - prefer_interpolation_to_compose_strings # not yet tested
    # - prefer_iterable_whereType # https://github.com/dart-lang/sdk/issues/32463
    - prefer_is_empty
    - prefer_is_not_empty
    - prefer_relative_imports
    - prefer_single_quotes
    - prefer_typing_uninitialized_variables
    # Obsolete with the new Dart formatter.
    # - require_trailing_commas
    - recursive_getters
    - slash_for_doc_comments
    - sort_child_properties_last
    - sort_constructors_first
    - sort_unnamed_constructors_first
    - test_types_in_equals
    - throw_in_finally
    # - type_annotate_public_apis # subset of always_specify_types
    - type_init_formals
    - unawaited_futures
    - unnecessary_brace_in_string_interps
    - unnecessary_const
    - unnecessary_getters_setters
    # - unnecessary_lambdas # https://github.com/dart-lang/linter/issues/498
    - unnecessary_library_directive
    - unnecessary_new
    - unnecessary_null_aware_assignments
    - unnecessary_null_in_if_null_operators
    - unnecessary_overrides
    - unnecessary_parenthesis
    - unnecessary_statements
    - unnecessary_this
    - unrelated_type_equality_checks
    - use_rethrow_when_possible
    # - use_setters_to_change_properties # not yet tested
    # - use_string_buffers # https://github.com/dart-lang/linter/pull/664
    - use_string_in_part_of_directives
    # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
    - valid_regexps
    # - void_checks # not yet tested

dart_code_metrics:
  metrics:
    cyclomatic-complexity: 20
    number-of-parameters: 4
    maximum-nesting-level: 5
  metrics-exclude:
    - test/**
  rules:
#    - arguments-ordering Too strict
#    - avoid-banned-imports # TODO(polina-c): add configuration
    - avoid-importing-entrypoint-exports:
        only-in-src: true
    - avoid-cascade-after-if-null
    - avoid-collection-methods-with-unrelated-types
    - avoid-duplicate-exports
    - avoid-dynamic
#    - avoid-global-state   TODO(jacobr): bunch of false positives around boolean flags.
#    - avoid-ignoring-return-values
#    - avoid-late-keyword
    - avoid-missing-enum-constant-in-map
#    - avoid-nested-conditional-expressions Worth enabling but currently too many violators.
#    - avoid-non-ascii-symbols  TODO(jacobr): probably worth enabling.
#    - avoid-non-null-assertion
#    - avoid-passing-async-when-sync-expected TODO(jacobr): consider re-enabliing.
    - avoid-redundant-async
    - avoid-throw-in-catch-block:
        exclude:
          - '*test.dart'

#    - avoid-top-level-members-in-tests Doesn't seem to match our style.
    - avoid-unnecessary-type-assertions
    - avoid-unnecessary-type-casts
    - avoid-unrelated-type-assertions
    - avoid-unused-parameters
    - avoid-explicit-type-declaration
    # - ban-name # TODO(polina-c): add configuration
    # - binary-expression-operand-order Some nice catches but too many false positives to enable.
    - double-literal-format
    # - format-comment TODO(jacobr): enable this one after fixing violations.
    # TODO(jacobr): enable member-ordering. This catches a bunch of real style
    # issues but would be alot of work to migrate.
    # - member-ordering
    # - newline-before-return TODO(jacobr): should be in the formatter if it was a rule to adopt.
    - no-boolean-literal-compare
    # - no-empty-block Too many false positives. However it does flag a bunch of code smells so possibly worth re-enabling.
    # This one seems interesting but has too many false positives. Gave it a try.
    # - no-equal-arguments:
    #    ignored-parameters:
    #      - height
    #      - width
    #      - double-literal-format
    #      - defaultSortColumn
    #      - left
    #      - right
    #      - top
    #      - bottom
    #      - bottomLeft
    #      - topLeft
    #      - enabledBorder
    - no-equal-then-else
 #   - no-magic-number
 #   - no-object-declaration Too difficult to use along with avoiding dynamic particular for JSON decoding logic.
 #   - prefer-async-await TODO(jacobr): evaluate enabling.
    - prefer-commenting-analyzer-ignores
  #  - prefer-conditional-expressions Too many false positives involving large conditional expressions.
  #  - prefer-correct-identifier-length Too many false positives with fine names like i and id.
  #  - prefer-correct-test-file-name TODO(jacobr): enable and fix violations.
    - prefer-correct-type-name
  #  - prefer-enums-by-name Cannot able unless lint adds a special case for orElse
  #  - prefer-first TODO(jacobr): enable as a follow up PR.
  #  - prefer-immediate-return TODO(jacobr): enable as a follow up PR.
    - prefer-iterable-of
    - prefer-last
    # - prefer-match-file-name
    # TODO(jacobr): consider enabling or enabling to periodically audit.
    # This one has a lot of false positives but is also quite nice.
    # - prefer-moving-to-variable:
    #    allowed-duplicated-chains: 2
    # - prefer-static-class
    # Obsolete with the new Dart formatter.
    # - prefer-trailing-comma
    - always-remove-listener
    # - avoid-border-all Micro-optimization to avoid a const constructor.
    # - avoid-returning-widgets  This one is nice but has a lot of false positives.
    - avoid-shrink-wrap-in-lists
    # - avoid-unnecessary-setstate It is unclear why to "Avoid calling sync methods that call 'setState'."
    - avoid-expanded-as-spacer
    - avoid-wrapping-in-padding
    - check-for-equals-in-render-object-setters
    - consistent-update-render-object
    # - prefer-const-border-radius TODO(jacobr): enable.
    - prefer-correct-edge-insets-constructor
    # - prefer-extracting-callbacks I'm not clear this is always a good idea. Seems like a workaround.
    # - prefer-single-widget-per-file
    - prefer-using-list-view
    - prefer-explicit-type-arguments
    - prefer-explicit-function-type
