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
{
53 // This one is different from the other kinds as it's a line style
54 // rather than a token style.
57 LastKind
= InactiveCode
60 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, HighlightingKind K
);
62 enum class HighlightingModifier
{
64 // FIXME: Definition (needs findExplicitReferences support)
73 UsedAsMutableReference
,
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;
92 HighlightingToken
&addModifier(HighlightingModifier M
) {
93 Modifiers
|= 1 << static_cast<unsigned>(M
);
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
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