1 //==-- SemanticHighlighting.h - Generating highlights from the AST-- C++ -*-==//
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
7 //===----------------------------------------------------------------------===//
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
18 //===----------------------------------------------------------------------===//
20 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H
21 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H
24 #include "llvm/ADT/StringRef.h"
25 #include "llvm/Support/raw_ostream.h"
31 enum class HighlightingKind {
56 // This one is different from the other kinds as it's a line style
57 // rather than a token style.
60 LastKind = InactiveCode
63 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingKind K);
64 std::optional<HighlightingKind>
65 highlightingKindFromString(llvm::StringRef Name);
67 enum class HighlightingModifier {
78 UsedAsMutableReference,
80 ConstructorOrDestructor,
88 LastModifier = GlobalScope
90 static_assert(static_cast<unsigned>(HighlightingModifier::LastModifier) < 32,
91 "Increase width of modifiers bitfield!");
92 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingModifier K);
93 std::optional<HighlightingModifier>
94 highlightingModifierFromString(llvm::StringRef Name);
96 // Contains all information needed for the highlighting a token.
97 struct HighlightingToken {
98 HighlightingKind Kind;
99 uint32_t Modifiers = 0;
102 HighlightingToken &addModifier(HighlightingModifier M) {
103 Modifiers |= 1 << static_cast<unsigned>(M);
108 bool operator==(const HighlightingToken &L, const HighlightingToken &R);
109 bool operator<(const HighlightingToken &L, const HighlightingToken &R);
111 // Returns all HighlightingTokens from an AST. Only generates highlights for the
113 std::vector<HighlightingToken>
114 getSemanticHighlightings(ParsedAST &AST, bool IncludeInactiveRegionTokens);
116 std::vector<SemanticToken> toSemanticTokens(llvm::ArrayRef<HighlightingToken>,
117 llvm::StringRef Code);
118 llvm::StringRef toSemanticTokenType(HighlightingKind Kind);
119 llvm::StringRef toSemanticTokenModifier(HighlightingModifier Modifier);
120 std::vector<SemanticTokensEdit> diffTokens(llvm::ArrayRef<SemanticToken> Before,
121 llvm::ArrayRef<SemanticToken> After);
123 // Returns ranges of the file that are inside an inactive preprocessor branch.
124 // The preprocessor directives at the beginning and end of a branch themselves
126 std::vector<Range> getInactiveRegions(ParsedAST &AST);
128 } // namespace clangd