# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0

# See Clang docs: http://clang.llvm.org/docs/ClangFormatStyleOptions.html
BasedOnStyle: Chromium

# Allow double brackets such as std::vector<std::vector<int>>.
Standard: Cpp11

# Indent 2 spaces at a time.
IndentWidth: 2

# Keep lines under 100 columns long.
ColumnLimit: 100

# Always break before braces
BreakBeforeBraces: Custom
BraceWrapping:
#  TODO(lujc) wait for clang-format-9 support in Chromium tools
#  AfterCaseLabel: true
  AfterClass: true
  AfterControlStatement: true
  AfterEnum: true
  AfterFunction: true
  AfterNamespace: true
  AfterStruct: true
  AfterUnion: true
  BeforeCatch: true
  BeforeElse: true
  IndentBraces: false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false

  # Keeps extern "C" blocks unindented.
  AfterExternBlock: false

# Indent case labels.
IndentCaseLabels: true

# Right-align pointers and references
PointerAlignment: Right

# ANGLE likes to align things as much as possible.
AlignOperands: true
AlignConsecutiveAssignments: true

# Use 2 space negative offset for access modifiers
AccessModifierOffset: -2

# TODO(jmadill): Decide if we want this on. Doesn't have an "all or none" mode.
AllowShortCaseLabelsOnASingleLine: false

# Useful for spacing out functions in classes
KeepEmptyLinesAtTheStartOfBlocks: true

# Indent nested PP directives.
IndentPPDirectives: AfterHash

# Include blocks style
IncludeBlocks: Preserve

AttributeMacros:
  - OPENTELEMETRY_UNLIKELY
  - OPENTELEMETRY_LIKELY
  - OPENTELEMETRY_MAYBE_UNUSED
  - OPENTELEMETRY_DEPRECATED
  - OPENTELEMETRY_API_SINGLETON
  - OPENTELEMETRY_LOCAL_SYMBOL
  - OPENTELEMETRY_EXPORT
  - OPENTELEMETRY_SANITIZER_NO_MEMORY
  - OPENTELEMETRY_SANITIZER_NO_THREAD
  - OPENTELEMETRY_SANITIZER_NO_ADDRESS