#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H
#include "Protocol.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/raw_ostream.h"
namespace clang {
namespace clangd {
class ParsedAST;
enum class HighlightingKind {
Variable = 0,
LocalVariable,
Parameter,
Function,
Method,
StaticMethod,
Field,
StaticField,
Class,
Interface,
Enum,
EnumConstant,
Typedef,
Type,
Unknown,
Namespace,
TemplateParameter,
Concept,
Primitive,
Macro,
Modifier,
Operator,
Bracket,
Label,
InactiveCode,
LastKind = InactiveCode
};
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingKind K);
std::optional<HighlightingKind>
highlightingKindFromString(llvm::StringRef Name);
enum class HighlightingModifier {
Declaration,
Definition,
Deprecated,
Deduced,
Readonly,
Static,
Abstract,
Virtual,
DependentName,
DefaultLibrary,
UsedAsMutableReference,
UsedAsMutablePointer,
ConstructorOrDestructor,
UserDefined,
FunctionScope,
ClassScope,
FileScope,
GlobalScope,
LastModifier = GlobalScope
};
static_assert(static_cast<unsigned>(HighlightingModifier::LastModifier) < 32,
"Increase width of modifiers bitfield!");
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingModifier K);
std::optional<HighlightingModifier>
highlightingModifierFromString(llvm::StringRef Name);
struct HighlightingToken {
HighlightingKind Kind;
uint32_t Modifiers = 0;
Range R;
HighlightingToken &addModifier(HighlightingModifier M) {
Modifiers |= 1 << static_cast<unsigned>(M);
return *this;
}
};
bool operator==(const HighlightingToken &L, const HighlightingToken &R);
bool operator<(const HighlightingToken &L, const HighlightingToken &R);
std::vector<HighlightingToken>
getSemanticHighlightings(ParsedAST &AST, bool IncludeInactiveRegionTokens);
std::vector<SemanticToken> toSemanticTokens(llvm::ArrayRef<HighlightingToken>,
llvm::StringRef Code);
llvm::StringRef toSemanticTokenType(HighlightingKind Kind);
llvm::StringRef toSemanticTokenModifier(HighlightingModifier Modifier);
std::vector<SemanticTokensEdit> diffTokens(llvm::ArrayRef<SemanticToken> Before,
llvm::ArrayRef<SemanticToken> After);
std::vector<Range> getInactiveRegions(ParsedAST &AST);
}
}
#endif