xref: /llvm-project/clang-tools-extra/clangd/support/Bracket.h (revision ed8f78827895050442f544edef2933a60d4a7935)
1 //===--- Bracket.h - Analyze bracket structure --------------------*-C++-*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Bracket structure (particularly braces) is key to isolating broken regions
10 // of code and preventing parsing from going "off the rails".
11 //
12 // For correct C++ code, brackets are well-nested and identifying pairs and
13 // therefore blocks is simple. In broken code, brackets are not properly nested.
14 // We cannot match them all and must choose which pairs to form.
15 //
16 // Rather than have the grammar-based parser make these choices, we pair
17 // brackets up-front based on textual features like indentation.
18 // This mirrors the way humans read code, and so is likely to produce the
19 // "correct" interpretation of broken code.
20 //
21 // This interpretation then guides the parse: a rule containing a bracket pair
22 // must match against paired bracket tokens.
23 //
24 //===----------------------------------------------------------------------===//
25 
26 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_BRACKET_H
27 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_BRACKET_H
28 
29 #include "Token.h"
30 
31 namespace clang {
32 namespace clangd {
33 
34 /// Identifies bracket token in the stream which should be paired.
35 /// Sets Token::Pair accordingly.
36 void pairBrackets(TokenStream &);
37 
38 } // namespace clangd
39 } // namespace clang
40 
41 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_BRACKET_H
42