[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / clang-tools-extra / clangd / SemanticHighlighting.h
blob17863fce5ae87b247672a7bd5c85e36cc5233ada
1 //==-- SemanticHighlighting.h - Generating highlights from the AST-- 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 // This file supports semantic highlighting: categorizing tokens in the file so
10 // that the editor can color/style them differently.
11 // This is particularly valuable for C++: its complex and context-dependent
12 // grammar is a challenge for simple syntax-highlighting techniques.
14 // Semantic highlightings are calculated for an AST by visiting every AST node
15 // and classifying nodes that are interesting to highlight (variables/function
16 // calls etc.).
18 //===----------------------------------------------------------------------===//
20 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H
21 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H
23 #include "Protocol.h"
24 #include "llvm/ADT/StringRef.h"
25 #include "llvm/Support/raw_ostream.h"
27 namespace clang {
28 namespace clangd {
29 class ParsedAST;
31 enum class HighlightingKind {
32 Variable = 0,
33 LocalVariable,
34 Parameter,
35 Function,
36 Method,
37 StaticMethod,
38 Field,
39 StaticField,
40 Class,
41 Interface,
42 Enum,
43 EnumConstant,
44 Typedef,
45 Type,
46 Unknown,
47 Namespace,
48 TemplateParameter,
49 Concept,
50 Primitive,
51 Macro,
53 // This one is different from the other kinds as it's a line style
54 // rather than a token style.
55 InactiveCode,
57 LastKind = InactiveCode
60 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingKind K);
62 enum class HighlightingModifier {
63 Declaration,
64 // FIXME: Definition (needs findExplicitReferences support)
65 Deprecated,
66 Deduced,
67 Readonly,
68 Static,
69 Abstract,
70 Virtual,
71 DependentName,
72 DefaultLibrary,
73 UsedAsMutableReference,
75 FunctionScope,
76 ClassScope,
77 FileScope,
78 GlobalScope,
80 LastModifier = GlobalScope
82 static_assert(static_cast<unsigned>(HighlightingModifier::LastModifier) < 32,
83 "Increase width of modifiers bitfield!");
84 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingModifier K);
86 // Contains all information needed for the highlighting a token.
87 struct HighlightingToken {
88 HighlightingKind Kind;
89 uint32_t Modifiers = 0;
90 Range R;
92 HighlightingToken &addModifier(HighlightingModifier M) {
93 Modifiers |= 1 << static_cast<unsigned>(M);
94 return *this;
98 bool operator==(const HighlightingToken &L, const HighlightingToken &R);
99 bool operator<(const HighlightingToken &L, const HighlightingToken &R);
101 // Returns all HighlightingTokens from an AST. Only generates highlights for the
102 // main AST.
103 std::vector<HighlightingToken> getSemanticHighlightings(ParsedAST &AST);
105 std::vector<SemanticToken> toSemanticTokens(llvm::ArrayRef<HighlightingToken>,
106 llvm::StringRef Code);
107 llvm::StringRef toSemanticTokenType(HighlightingKind Kind);
108 llvm::StringRef toSemanticTokenModifier(HighlightingModifier Modifier);
109 std::vector<SemanticTokensEdit> diffTokens(llvm::ArrayRef<SemanticToken> Before,
110 llvm::ArrayRef<SemanticToken> After);
112 } // namespace clangd
113 } // namespace clang
115 #endif