clang-tools  11.0.0
CollectMacros.h
Go to the documentation of this file.
1 //===--- CollectMacros.h -----------------------------------------*- 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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_COLLECTEDMACROS_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_COLLECTEDMACROS_H
11 
12 #include "AST.h"
13 #include "Protocol.h"
14 #include "SourceCode.h"
15 #include "index/SymbolID.h"
16 #include "clang/Basic/IdentifierTable.h"
17 #include "clang/Lex/PPCallbacks.h"
18 #include "llvm/ADT/DenseMap.h"
19 #include <string>
20 
21 namespace clang {
22 namespace clangd {
23 
25  llvm::StringSet<> Names;
26  // Instead of storing SourceLocation, we have to store the token range because
27  // SourceManager from preamble is not available when we build the AST.
28  llvm::DenseMap<SymbolID, std::vector<Range>> MacroRefs;
29  // Somtimes it is not possible to compute the SymbolID for the Macro, e.g. a
30  // reference to an undefined macro. Store them separately, e.g. for semantic
31  // highlighting.
32  std::vector<Range> UnknownMacros;
33  // Ranges skipped by the preprocessor due to being inactive.
34  std::vector<Range> SkippedRanges;
35 };
36 
37 /// Collects macro references (e.g. definitions, expansions) in the main file.
38 /// It is used to:
39 /// - collect macros in the preamble section of the main file (in Preamble.cpp)
40 /// - collect macros after the preamble of the main file (in ParsedAST.cpp)
42 public:
43  explicit CollectMainFileMacros(const SourceManager &SM, MainFileMacros &Out)
44  : SM(SM), Out(Out) {}
45 
46  void FileChanged(SourceLocation Loc, FileChangeReason,
47  SrcMgr::CharacteristicKind, FileID) override {
48  InMainFile = isInsideMainFile(Loc, SM);
49  }
50 
51  void MacroDefined(const Token &MacroName, const MacroDirective *MD) override {
52  add(MacroName, MD->getMacroInfo());
53  }
54 
55  void MacroExpands(const Token &MacroName, const MacroDefinition &MD,
56  SourceRange Range, const MacroArgs *Args) override {
57  add(MacroName, MD.getMacroInfo());
58  }
59 
60  void MacroUndefined(const clang::Token &MacroName,
61  const clang::MacroDefinition &MD,
62  const clang::MacroDirective *Undef) override {
63  add(MacroName, MD.getMacroInfo());
64  }
65 
66  void Ifdef(SourceLocation Loc, const Token &MacroName,
67  const MacroDefinition &MD) override {
68  add(MacroName, MD.getMacroInfo());
69  }
70 
71  void Ifndef(SourceLocation Loc, const Token &MacroName,
72  const MacroDefinition &MD) override {
73  add(MacroName, MD.getMacroInfo());
74  }
75 
76  void Defined(const Token &MacroName, const MacroDefinition &MD,
77  SourceRange Range) override {
78  add(MacroName, MD.getMacroInfo());
79  }
80 
81  void SourceRangeSkipped(SourceRange R, SourceLocation EndifLoc) override {
82  if (!InMainFile)
83  return;
84  Position Begin = sourceLocToPosition(SM, R.getBegin());
85  Position End = sourceLocToPosition(SM, R.getEnd());
86  Out.SkippedRanges.push_back(Range{Begin, End});
87  }
88 
89 private:
90  void add(const Token &MacroNameTok, const MacroInfo *MI);
91  const SourceManager &SM;
92  bool InMainFile = true;
93  MainFileMacros &Out;
94 };
95 
96 } // namespace clangd
97 } // namespace clang
98 
99 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_COLLECTEDMACROS_H
SymbolID.h
clang::clangd::CollectMainFileMacros
Collects macro references (e.g.
Definition: CollectMacros.h:41
clang::clangd::CollectMainFileMacros::Ifdef
void Ifdef(SourceLocation Loc, const Token &MacroName, const MacroDefinition &MD) override
Definition: CollectMacros.h:66
clang::doc::MD
static GeneratorRegistry::Add< MDGenerator > MD(MDGenerator::Format, "Generator for MD output.")
clang::clangd::CollectMainFileMacros::Defined
void Defined(const Token &MacroName, const MacroDefinition &MD, SourceRange Range) override
Definition: CollectMacros.h:76
clang::clangd::MainFileMacros::MacroRefs
llvm::DenseMap< SymbolID, std::vector< Range > > MacroRefs
Definition: CollectMacros.h:28
clang::clangd::sourceLocToPosition
Position sourceLocToPosition(const SourceManager &SM, SourceLocation Loc)
Turn a SourceLocation into a [line, column] pair.
Definition: SourceCode.cpp:220
clang::clangd::MainFileMacros::Names
llvm::StringSet Names
Definition: CollectMacros.h:25
Protocol.h
clang::clangd::CollectMainFileMacros::SourceRangeSkipped
void SourceRangeSkipped(SourceRange R, SourceLocation EndifLoc) override
Definition: CollectMacros.h:81
clang::clangd::Position
Definition: Protocol.h:144
clang::clangd::CollectMainFileMacros::Ifndef
void Ifndef(SourceLocation Loc, const Token &MacroName, const MacroDefinition &MD) override
Definition: CollectMacros.h:71
clang::clangd::MainFileMacros
Definition: CollectMacros.h:24
clang::clangd::CollectMainFileMacros::CollectMainFileMacros
CollectMainFileMacros(const SourceManager &SM, MainFileMacros &Out)
Definition: CollectMacros.h:43
clang::clangd::CollectMainFileMacros::MacroDefined
void MacroDefined(const Token &MacroName, const MacroDirective *MD) override
Definition: CollectMacros.h:51
SourceCode.h
clang::clangd::MainFileMacros::SkippedRanges
std::vector< Range > SkippedRanges
Definition: CollectMacros.h:34
clang::clangd::Range
Definition: Protocol.h:173
PPCallbacks
clang
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Definition: ApplyReplacements.h:27
clang::clangd::CollectMainFileMacros::FileChanged
void FileChanged(SourceLocation Loc, FileChangeReason, SrcMgr::CharacteristicKind, FileID) override
Definition: CollectMacros.h:46
clang::clangd::isInsideMainFile
bool isInsideMainFile(SourceLocation Loc, const SourceManager &SM)
Returns true iff Loc is inside the main file.
Definition: SourceCode.cpp:421
clang::clangd::CollectMainFileMacros::MacroUndefined
void MacroUndefined(const clang::Token &MacroName, const clang::MacroDefinition &MD, const clang::MacroDirective *Undef) override
Definition: CollectMacros.h:60
Loc
SourceLocation Loc
'#' location in the include directive
Definition: IncludeOrderCheck.cpp:37
Out
CompiledFragmentImpl & Out
Definition: ConfigCompile.cpp:70
clang::clangd::CollectMainFileMacros::MacroExpands
void MacroExpands(const Token &MacroName, const MacroDefinition &MD, SourceRange Range, const MacroArgs *Args) override
Definition: CollectMacros.h:55
clang::clangd::MainFileMacros::UnknownMacros
std::vector< Range > UnknownMacros
Definition: CollectMacros.h:32
AST.h