# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

---
# Get colors when outputting through `bazel build --config=clang-tidy`.
UseColor: true
# This is necessary for `--config=clang-tidy` to catch errors.
WarningsAsErrors: '*'

Checks:
  # We turn on all of a few categories by default.
  - '-*'
  - 'bugprone-*'
  - 'google-*'
  - 'misc-*'
  - 'modernize-*'
  - 'performance-*'
  - 'readability-*'

  # Disabled due to the implied style choices.
  - '-misc-const-correctness'
  - '-misc-include-cleaner'
  - '-misc-use-anonymous-namespace'
  - '-modernize-deprecated-headers'
  - '-modernize-return-braced-init-list'
  - '-modernize-use-default-member-init'
  - '-modernize-use-integer-sign-comparison'
  - '-modernize-use-emplace'
  - '-readability-avoid-nested-conditional-operator'
  - '-readability-convert-member-functions-to-static'
  - '-readability-else-after-return'
  - '-readability-identifier-length'
  - '-readability-implicit-bool-conversion'
  - '-readability-make-member-function-const'
  - '-readability-math-missing-parentheses'
  - '-readability-static-definition-in-anonymous-namespace'
  - '-readability-use-anyofallof'

  # Warns when we have multiple empty cases in switches, which we do for comment
  # reasons.
  - '-bugprone-branch-clone'
  # Frequently warns on multiple parameters of the same type.
  - '-bugprone-easily-swappable-parameters'
  # Finds issues like out-of-memory in main(). We don't use exceptions, so it's
  # unlikely to find real issues.
  - '-bugprone-exception-escape'
  # Has false positives in places such as using an argument to declare a name,
  # which cannot have parentheses. For our limited use of macros, this is a
  # common conflict.
  - '-bugprone-macro-parentheses'
  # Conflicts with integer type C++ style.
  - '-bugprone-narrowing-conversions'
  # Has false positives for `enum_base.h`. Clang's built-in switch warnings
  # cover most of our risk of bugs here.
  - '-bugprone-switch-missing-default-case'
  # In clang-tidy 16, has false positives on code like:
  #     while (auto name_ref = insts().Get(inst_id).TryAs<SemIR::NameRef>()) {
  #       inst_id = name_ref->value_id;
  #                 ^ unchecked access to optional value
  #     }
  - '-bugprone-unchecked-optional-access'
  # Overlaps with `readability-function-size`.
  - '-google-readability-function-size'
  # Suggests usernames on TODOs, which we don't want.
  - '-google-readability-todo'
  # Extremely slow. TODO: Re-enable once
  # https://github.com/llvm/llvm-project/issues/128797 is fixed.
  - '-misc-confusable-identifiers'
  # Overlaps with `-Wno-missing-prototypes`.
  - '-misc-use-internal-linkage'
  # Suggests `std::array`, which we could migrate to, but conflicts with the
  # status quo.
  - '-modernize-avoid-c-arrays'
  # Warns on creation of SemIR typed insts, for which we do not currently want
  # to use designated initialization.
  - '-modernize-use-designated-initializers'
  # Only fixes const methods, not non-const, which yields distracting results on
  # accessors.
  - '-modernize-use-nodiscard'
  # We aren't using the ranges library due to performance concerns.
  - '-modernize-use-ranges'
  # Low value compared to the engineering cost.
  - '-performance-enum-size'
  # Duplicates `modernize-pass-by-value`.
  - '-performance-unnecessary-value-param'
  # Warns on enums which use the `LastValue = Value` pattern if all the other
  # discriminants aren't given an explicit value.
  - '-readability-enum-initial-value'
  # Warns too frequently.
  - '-readability-function-cognitive-complexity'
  # Warns in reasonably documented situations.
  - '-readability-magic-numbers'
  # Warns on `= {}` which is also used to indicate which fields do not need to
  # be explicitly initialized in aggregate initialization.
  - '-readability-redundant-member-init'
  # Warns when callers use similar names as different parameters.
  - '-readability-suspicious-call-argument'

CheckOptions:
  # Don't warn on structs; done by ignoring when there are only public members.
  - key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic
    value: true

  # CamelCase names.
  - key: readability-identifier-naming.ClassCase
    value: CamelCase
  - key: readability-identifier-naming.ClassConstantCase
    value: CamelCase
  - key: readability-identifier-naming.ConstexprVariableCase
    value: CamelCase
  - key: readability-identifier-naming.NamespaceCase
    value: CamelCase
  - key: readability-identifier-naming.StructCase
    value: CamelCase
  - key: readability-identifier-naming.TemplateParameterCase
    value: CamelCase
  - key: readability-identifier-naming.TypeAliasCase
    value: CamelCase
  - key: readability-identifier-naming.TypedefCase
    value: CamelCase
  - key: readability-identifier-naming.UnionCase
    value: CamelCase

  # lower_case names.
  - key: readability-identifier-naming.ClassMemberCase
    value: lower_case
  - key: readability-identifier-naming.ParameterCase
    value: lower_case
  - key: readability-identifier-naming.VariableCase
    value: lower_case

  # TODO: This is for explorer's use of LLVM casting support, so we should be
  # able to remove it once explorer is deleted.
  - key: readability-identifier-naming.MethodIgnoredRegexp
    value: '^classof$'

  # This erroneously fires in C++20 mode with LLVM 16 clang-tidy, due to:
  # https://github.com/llvm/llvm-project/issues/46097
  - key: readability-identifier-naming.TemplateParameterIgnoredRegexp
    value: '^expr-type$'

  # Don't require writing a return type on lambdas.
  - key: modernize-use-trailing-return-type.TransformLambdas
    value: none

  # Use lines rather than statements to measure function size, because
  # for readability purposes we care about the code as written, before
  # preprocessing.
  - key: readability-function-size.StatementThreshold
    value: none
  - key: readability-function-size.LineThreshold
    # Chose 800 to match the default for StatementThreshold.
    value: 800
