---
# clang-tidy configuration
#
# clang-tidy can be run manually like this:
#
#     run-clang-tidy -p build 'Source.*'
#
# To apply fixes suggested by clang-tidy, run:
#
#     run-clang-tidy -p build -fix -format 'Source.*'
#
# To limit the run to certain checks:
#
#     run-clang-tidy -checks='-*,modernize-use-nullptr' -p build 'Source.*'
#
# clang-tidy also has several IDE integrations listed here:
# https://clang.llvm.org/extra/clang-tidy/Integrations.html

# Enable most checks.
#
# Built-in checks:
# https://clang.llvm.org/extra/clang-tidy/checks/list.html
#
# Exclusions:
#
# -modernize-avoid-c-arrays
#   We use C-arrays throughout, e.g. for `constexpr char []`.
#   `std::array` is not a replacement because its length is
#   not deduced.
#
# -modernize-use-trailing-return-type
#   A purely stylistic change that we do not want.
Checks: >
  -*,
  bugprone-*,
  cppcoreguidelines-pro-type-cstyle-cast,
  google-runtime-int,
  llvm-include-order,
  llvm-namespace-comment,
  misc-*,
  modernize-*,
  performance-*,
  portability-*,
  readability-*,
  -modernize-avoid-c-arrays,
  -modernize-use-trailing-return-type,

HeaderFilterRegex: "^Source[SXT].*\\.h$"

CheckOptions:
  # Identifier names per the Google Style Guide:
  # https://google.github.io/styleguide/cppguide.html#General_Naming_Rules
  - { key: readability-identifier-naming.NamespaceCase,           value: lower_case }
  - { key: readability-identifier-naming.ClassCase,               value: CamelCase  }
  - { key: readability-identifier-naming.StructCase,              value: CamelCase  }
  - { key: readability-identifier-naming.TemplateParameterCase,   value: CamelCase  }
  - { key: readability-identifier-naming.FunctionCase,            value: aNy_CasE   }
  - { key: readability-identifier-naming.VariableCase,            value: lower_case }
  - { key: readability-identifier-naming.ClassMemberCase,         value: lower_case }
  - { key: readability-identifier-naming.ClassMemberSuffix,       value: _          }
  - { key: readability-identifier-naming.PrivateMemberSuffix,     value: _          }
  - { key: readability-identifier-naming.ProtectedMemberSuffix,   value: _          }
  - { key: readability-identifier-naming.EnumConstantCase,        value: CamelCase  }
  - { key: readability-identifier-naming.EnumConstantPrefix,      value: k          }
  - { key: readability-identifier-naming.ConstexprVariableCase,   value: CamelCase  }
  - { key: readability-identifier-naming.ConstexprVariablePrefix, value: k          }
  - { key: readability-identifier-naming.GlobalConstantCase,      value: CamelCase  }
  - { key: readability-identifier-naming.GlobalConstantPrefix,    value: k          }
  - { key: readability-identifier-naming.MemberConstantCase,      value: CamelCase  }
  - { key: readability-identifier-naming.MemberConstantPrefix,    value: k          }
  - { key: readability-identifier-naming.StaticConstantCase,      value: CamelCase  }
  - { key: readability-identifier-naming.StaticConstantPrefix,    value: k          }

  # Allow short if-statements without braces
  - { key: readability-braces-around-statements.ShortStatementLines, value: 2 }

  # Use <cstdint> fixed-width integer types instead of short, long and long long
  - { key: google-runtime-int.UnsignedTypePrefix, value: "std::uint" }
  - { key: google-runtime-int.SignedTypePrefix, value: "std::int" }
  - { key: google-runtime-int.TypeSuffix, value: "_t" }
