13#include "clang/Basic/SourceLocation.h"
14#include "clang/Tooling/Syntax/Tokens.h"
15#include "llvm/ADT/STLExtras.h"
27void CollectMainFileMacros::add(
const Token &MacroNameTok,
const MacroInfo *MI,
28 bool IsDefinition,
bool InIfCondition) {
31 auto Loc = MacroNameTok.getLocation();
32 if (
Loc.isInvalid() ||
Loc.isMacroID())
36 auto Name = MacroNameTok.getIdentifierInfo()->getName();
38 size_t Start = SM.getFileOffset(
Loc);
39 size_t End = SM.getFileOffset(MacroNameTok.getEndLoc());
41 Out.
MacroRefs[SID].push_back({Start, End, IsDefinition, InIfCondition});
43 Out.
UnknownMacros.push_back({Start, End, IsDefinition, InIfCondition});
47 SrcMgr::CharacteristicKind, FileID) {
52 const MacroDefinition &MD,
54 const MacroArgs *
Args) {
59 const clang::MacroDefinition &MD,
60 const clang::MacroDirective *Undef) {
65 const MacroDefinition &MD) {
71 const MacroDefinition &MD) {
77 const MacroDefinition &MD) {
83 const MacroDefinition &MD) {
89 const MacroDefinition &MD,
96 SourceLocation EndifLoc) {
107 std::vector<clangd::PragmaMark> &Out)
121 const SourceManager &SM;
122 std::vector<clangd::PragmaMark> &Out;
125std::unique_ptr<PPCallbacks>
127 std::vector<PragmaMark> &
Out) {
128 return std::make_unique<CollectPragmaMarks>(SM,
Out);
132 const MacroDirective *MD) {
136 const auto *MI = MD->getMacroInfo();
137 add(
MacroName, MD->getMacroInfo(),
true);
139 for (
const auto &Tok : MI->tokens()) {
140 auto *II = Tok.getIdentifierInfo();
142 if (!II || !II->hadMacroDefinition() ||
143 llvm::is_contained(MI->params(), II))
145 if (
const MacroInfo *MI = PP.getMacroInfo(II))
llvm::SmallString< 256U > Name
CompiledFragmentImpl & Out
void MacroDefined(const Token &MacroName, const MacroDirective *MD) override
void FileChanged(SourceLocation Loc, FileChangeReason, SrcMgr::CharacteristicKind, FileID) override
void MacroExpands(const Token &MacroName, const MacroDefinition &MD, SourceRange Range, const MacroArgs *Args) override
void Elifndef(SourceLocation Loc, const Token &MacroNameTok, const MacroDefinition &MD) override
void Defined(const Token &MacroName, const MacroDefinition &MD, SourceRange Range) override
void MacroUndefined(const clang::Token &MacroName, const clang::MacroDefinition &MD, const clang::MacroDirective *Undef) override
void Ifndef(SourceLocation Loc, const Token &MacroName, const MacroDefinition &MD) override
void SourceRangeSkipped(SourceRange R, SourceLocation EndifLoc) override
void Ifdef(SourceLocation Loc, const Token &MacroName, const MacroDefinition &MD) override
void Elifdef(SourceLocation Loc, const Token &MacroNameTok, const MacroDefinition &MD) override
CollectPragmaMarks(const SourceManager &SM, std::vector< clangd::PragmaMark > &Out)
void PragmaMark(SourceLocation Loc, StringRef Trivia) override
SymbolID getSymbolID(const Decl *D)
Gets the symbol ID for a declaration. Returned SymbolID might be null.
Range halfOpenToRange(const SourceManager &SM, CharSourceRange R)
bool isInsideMainFile(SourceLocation Loc, const SourceManager &SM)
Returns true iff Loc is inside the main file.
std::unique_ptr< PPCallbacks > collectPragmaMarksCallback(const SourceManager &SM, std::vector< PragmaMark > &Out)
Collect all pragma marks from the main file.
Position sourceLocToPosition(const SourceManager &SM, SourceLocation Loc)
Turn a SourceLocation into a [line, column] pair.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Range toRange(const SourceManager &SM) const
std::vector< MacroOccurrence > UnknownMacros
llvm::DenseMap< SymbolID, std::vector< MacroOccurrence > > MacroRefs
std::vector< Range > SkippedRanges
Represents a #pragma mark in the main file.
A single C++ or preprocessor token.