---
# Configure clang-tidy for this project.

# Here is an explanation for why some of the checks are disabled:
#
#  -google-readability-namespace-comments: the *_CLIENT_NS is a macro, and
#      clang-tidy fails to match it against the initial value.
#
#  -modernize-use-trailing-return-type: clang-tidy recommends using
#      `auto Foo() -> std::string { return ...; }`, we think the code is less
#      readable in this form.
#
#  --modernize-concat-nested-namespaces: clang-tidy recommends
#      `namespace google::cloud {}` over `namespace google { namespace cloud { } }`
#      We need to support C++14, which does not supported nested namespaces.
#
#  --modernize-use-nodiscard: clang-tidy recommends adding a nodiscard annotation
#      to functions where the return value should not be ignored.
#      We need to support C++14, which does not supported the annotation.
#
#  -modernize-return-braced-init-list: We think removing typenames and using
#      only braced-init can hurt readability.
#
#  -modernize-avoid-c-arrays: We only use C arrays when they seem to be the
#      right tool for the job, such as `char foo[] = "hello"`. In these cases,
#      avoiding C arrays often makes the code less readable, and std::array is
#      not a drop-in replacement because it doesn't deduce the size.
#
#  -performance-move-const-arg: This warning requires the developer to
#      know/care more about the implementation details of types/functions than
#      should be necessary. For example, `A a; F(std::move(a));` will trigger a
#      warning IFF `A` is a trivial type (and therefore the move is
#      meaningless). It would also warn if `F` accepts by `const&`, which is
#      another detail that the caller need not care about.
#
#  -readability-redundant-declaration: A friend declaration inside a class
#      counts as a declaration, so if we also declare that friend outside the
#      class in order to document it as part of the public API, that will
#      trigger a redundant declaration warning from this check.
#
#  -readability-function-cognitive-complexity: too many false positives with
#      clang-tidy-12. We need to disable this check in macros, and that setting
#      only appears in clang-tidy-13.
#
#  -bugprone-narrowing-conversions: too many false positives around
#      `std::size_t`  vs. `*::difference_type`.
#
#  -bugprone-easily-swappable-parameters: too many false positives.
#
#  -bugprone-implicit-widening-of-multiplication-result: too many false positives.
#     Almost any expression of the form `2 * variable` or `long x = a_int * b_int;`
#     generates an error.
#
#  -bugprone-unchecked-optional-access: too many false positives in tests.
#     Despite what the documentation says, this warning appears after
#     `ASSERT_TRUE(variable)` or `ASSERT_TRUE(variable.has_value())`.
#
Checks: >
  -*,
  abseil-*,
  bugprone-*,GetGame
  google-*,
  misc-*,
  modernize-*,
  performance-*,
  portability-*,
  readability-*,
  -google-readability-braces-around-statements,
  -google-readability-namespace-comments,
  -google-runtime-references,
  -misc-non-private-member-variables-in-classes,
  -misc-const-correctness,
  -modernize-return-braced-init-list,
  -modernize-use-trailing-return-type,
  -modernize-concat-nested-namespaces,
  -modernize-use-nodiscard,
  -modernize-avoid-c-arrays,
  -performance-move-const-arg,
  -readability-braces-around-statements,
  -readability-identifier-length,
  -readability-magic-numbers,
  -readability-named-parameter,
  -readability-redundant-declaration,
  -readability-function-cognitive-complexity,
  -readability-convert-member-functions-to-static,
  -readability-implicit-bool-conversion,
  -bugprone-narrowing-conversions,
  -bugprone-easily-swappable-parameters,
  -bugprone-implicit-widening-of-multiplication-result,
  -bugprone-unchecked-optional-access

# Turn all the warnings from the checks above into errors.
WarningsAsErrors: "*"

CheckOptions:
  google-readability-braces-around-statements.ShortStatementLines: '1'
  google-readability-function-size.StatementThreshold: '800'
  google-readability-namespace-comments.ShortNamespaceLines: '10'
  google-readability-namespace-comments.SpacesBeforeComments: '2'
  readability-identifier-naming.PrivateMemberPrefix: 'm_'
  readability-identifier-naming.ProtectedMemberPrefix: 'm_'
  readability-identifier-naming.MemberPrefix: 'm_'
  readability-identifier-naming.ClassCase: CamelCase
  readability-identifier-naming.MemberCase: CamelCase
  readability-identifier-naming.EnumCase: CamelCase
  readability-identifier-naming.FunctionCase: CamelCase
  readability-identifier-naming.ParameterCase: CamelCase
  readability-identifier-naming.UnionCase: CamelCase
  readability-identifier-naming.VariableCase: CamelCase
  readability-identifier-naming.LocalConstantPointerPrefix: 'p'
  readability-identifier-naming.VariableHungarianPrefix: On
  readability-identifier-naming.ParameterHungarianPrefix: On
  readability-identifier-naming.MemberHungarianPrefix: On
  readability-identifier-naming.PointerParameterHungarianPrefix: On
  readability-identifier-naming.PointerParameterCase: CamelCase
  readability-identifier-naming.HungarianNotation.UserDefinedType.std::string: s

