133 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file supports semantic highlighting: categorizing tokens in the file so10// that the editor can color/style them differently.11// This is particularly valuable for C++: its complex and context-dependent12// grammar is a challenge for simple syntax-highlighting techniques.13//14// Semantic highlightings are calculated for an AST by visiting every AST node15// and classifying nodes that are interesting to highlight (variables/function16// calls etc.).17//18//===----------------------------------------------------------------------===//19 20#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H21#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICHIGHLIGHTING_H22 23#include "Protocol.h"24#include "llvm/ADT/StringRef.h"25#include "llvm/Support/raw_ostream.h"26 27namespace clang {28namespace clangd {29class ParsedAST;30 31enum 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,52 Modifier,53 Operator,54 Bracket,55 Label,56 57 // This one is different from the other kinds as it's a line style58 // rather than a token style.59 InactiveCode,60 61 LastKind = InactiveCode62};63 64llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingKind K);65std::optional<HighlightingKind>66highlightingKindFromString(llvm::StringRef Name);67 68enum class HighlightingModifier {69 Declaration,70 Definition,71 Deprecated,72 Deduced,73 Readonly,74 Static,75 Abstract,76 Virtual,77 DependentName,78 DefaultLibrary,79 UsedAsMutableReference,80 UsedAsMutablePointer,81 ConstructorOrDestructor,82 UserDefined,83 84 FunctionScope,85 ClassScope,86 FileScope,87 GlobalScope,88 89 LastModifier = GlobalScope90};91static_assert(static_cast<unsigned>(HighlightingModifier::LastModifier) < 32,92 "Increase width of modifiers bitfield!");93llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingModifier K);94std::optional<HighlightingModifier>95highlightingModifierFromString(llvm::StringRef Name);96 97// Contains all information needed for the highlighting a token.98struct HighlightingToken {99 HighlightingKind Kind;100 uint32_t Modifiers = 0;101 Range R;102 103 HighlightingToken &addModifier(HighlightingModifier M) {104 Modifiers |= 1 << static_cast<unsigned>(M);105 return *this;106 }107};108 109bool operator==(const HighlightingToken &L, const HighlightingToken &R);110bool operator<(const HighlightingToken &L, const HighlightingToken &R);111 112// Returns all HighlightingTokens from an AST. Only generates highlights for the113// main AST.114std::vector<HighlightingToken>115getSemanticHighlightings(ParsedAST &AST, bool IncludeInactiveRegionTokens);116 117std::vector<SemanticToken> toSemanticTokens(llvm::ArrayRef<HighlightingToken>,118 llvm::StringRef Code);119llvm::StringRef toSemanticTokenType(HighlightingKind Kind);120llvm::StringRef toSemanticTokenModifier(HighlightingModifier Modifier);121std::vector<SemanticTokensEdit> diffTokens(llvm::ArrayRef<SemanticToken> Before,122 llvm::ArrayRef<SemanticToken> After);123 124// Returns ranges of the file that are inside an inactive preprocessor branch.125// The preprocessor directives at the beginning and end of a branch themselves126// are not included.127std::vector<Range> getInactiveRegions(ParsedAST &AST);128 129} // namespace clangd130} // namespace clang131 132#endif133