13#include "clang/Basic/SourceLocation.h"
14#include "clang/Tooling/Syntax/Tokens.h"
15#include "llvm/ADT/STLExtras.h"
22 auto MainFile = SM.getMainFileID();
30void CollectMainFileMacros::add(
const Token &MacroNameTok,
const MacroInfo *MI,
31 bool IsDefinition,
bool InIfCondition) {
34 auto Loc = MacroNameTok.getLocation();
35 if (Loc.isInvalid() || Loc.isMacroID())
39 auto Name = MacroNameTok.getIdentifierInfo()->getName();
40 Out.
Names.insert(Name);
41 size_t Start = SM.getFileOffset(Loc);
42 size_t End = SM.getFileOffset(MacroNameTok.getEndLoc());
44 Out.
MacroRefs[SID].push_back({Start, End, IsDefinition, InIfCondition});
46 Out.
UnknownMacros.push_back({Start, End, IsDefinition, InIfCondition});
50 SrcMgr::CharacteristicKind, FileID) {
55 const MacroDefinition &MD,
57 const MacroArgs *Args) {
58 add(MacroName, MD.getMacroInfo());
62 const clang::MacroDefinition &MD,
63 const clang::MacroDirective *Undef) {
64 add(MacroName, MD.getMacroInfo());
68 const MacroDefinition &MD) {
69 add(MacroName, MD.getMacroInfo(),
false,
74 const MacroDefinition &MD) {
75 add(MacroName, MD.getMacroInfo(),
false,
80 const MacroDefinition &MD) {
81 add(MacroName, MD.getMacroInfo(),
false,
86 const MacroDefinition &MD) {
87 add(MacroName, MD.getMacroInfo(),
false,
92 const MacroDefinition &MD,
94 add(MacroName, MD.getMacroInfo(),
false,
99 SourceLocation EndifLoc) {
104 Out.SkippedRanges.push_back(
Range{Begin, End});
110 std::vector<clangd::PragmaMark> &Out)
111 : SM(SM), Out(Out) {}
113 void PragmaMark(SourceLocation Loc, StringRef Trivia)
override {
124 const SourceManager &SM;
125 std::vector<clangd::PragmaMark> &Out;
128std::unique_ptr<PPCallbacks>
130 std::vector<PragmaMark> &Out) {
131 return std::make_unique<CollectPragmaMarks>(SM, Out);
135 const MacroDirective *MD) {
139 const auto *MI = MD->getMacroInfo();
140 add(MacroName, MD->getMacroInfo(),
true);
142 for (
const auto &Tok : MI->tokens()) {
143 auto *II = Tok.getIdentifierInfo();
145 if (!II || !II->hadMacroDefinition() ||
146 llvm::is_contained(MI->params(), II))
148 if (
const MacroInfo *MI = PP.getMacroInfo(II))
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
FIXME: Skip testing on windows temporarily due to the different escaping code mode.
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
CharSourceRange toSourceRange(const SourceManager &SM) const
std::vector< MacroOccurrence > UnknownMacros
llvm::DenseMap< SymbolID, std::vector< MacroOccurrence > > MacroRefs
int line
Line position in a document (zero-based).
Represents a #pragma mark in the main file.
A single C++ or preprocessor token.