summaryrefslogtreecommitdiffstats
path: root/clang/lib/Index/IndexingAction.cpp
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2019-08-29 10:23:29 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2019-08-29 10:23:29 +0000
commitc65204148c13d6c2cdfa018b2dd2bf8c306cc7a5 (patch)
treef337c31b0d031535aff370fa3058071cd3c610e7 /clang/lib/Index/IndexingAction.cpp
parenta280b63ead9ec55329cda25106caec6c766c0471 (diff)
downloadbcm5719-llvm-c65204148c13d6c2cdfa018b2dd2bf8c306cc7a5.tar.gz
bcm5719-llvm-c65204148c13d6c2cdfa018b2dd2bf8c306cc7a5.zip
[Index] Create PP callbacks in the ASTConsumer
Doing so removes one reason to create a custom FrontendAction. FrontendActions are not desirable because they are difficult to compose. ASTConsumers are much easier to compose. llvm-svn: 370323
Diffstat (limited to 'clang/lib/Index/IndexingAction.cpp')
-rw-r--r--clang/lib/Index/IndexingAction.cpp76
1 files changed, 31 insertions, 45 deletions
diff --git a/clang/lib/Index/IndexingAction.cpp b/clang/lib/Index/IndexingAction.cpp
index 4457e77a7a4..47e0ab3a018 100644
--- a/clang/lib/Index/IndexingAction.cpp
+++ b/clang/lib/Index/IndexingAction.cpp
@@ -23,6 +23,36 @@ using namespace clang::index;
namespace {
+class IndexPPCallbacks final : public PPCallbacks {
+ std::shared_ptr<IndexingContext> IndexCtx;
+
+public:
+ IndexPPCallbacks(std::shared_ptr<IndexingContext> IndexCtx)
+ : IndexCtx(std::move(IndexCtx)) {}
+
+ void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
+ SourceRange Range, const MacroArgs *Args) override {
+ IndexCtx->handleMacroReference(*MacroNameTok.getIdentifierInfo(),
+ Range.getBegin(), *MD.getMacroInfo());
+ }
+
+ void MacroDefined(const Token &MacroNameTok,
+ const MacroDirective *MD) override {
+ IndexCtx->handleMacroDefined(*MacroNameTok.getIdentifierInfo(),
+ MacroNameTok.getLocation(),
+ *MD->getMacroInfo());
+ }
+
+ void MacroUndefined(const Token &MacroNameTok, const MacroDefinition &MD,
+ const MacroDirective *Undef) override {
+ if (!MD.getMacroInfo()) // Ignore noop #undef.
+ return;
+ IndexCtx->handleMacroUndefined(*MacroNameTok.getIdentifierInfo(),
+ MacroNameTok.getLocation(),
+ *MD.getMacroInfo());
+ }
+};
+
class IndexASTConsumer final : public ASTConsumer {
std::shared_ptr<Preprocessor> PP;
std::shared_ptr<IndexingContext> IndexCtx;
@@ -37,6 +67,7 @@ protected:
IndexCtx->setASTContext(Context);
IndexCtx->getDataConsumer().initialize(Context);
IndexCtx->getDataConsumer().setPreprocessor(PP);
+ PP->addPPCallbacks(std::make_unique<IndexPPCallbacks>(IndexCtx));
}
bool HandleTopLevelDecl(DeclGroupRef DG) override {
@@ -55,36 +86,6 @@ protected:
}
};
-class IndexPPCallbacks final : public PPCallbacks {
- std::shared_ptr<IndexingContext> IndexCtx;
-
-public:
- IndexPPCallbacks(std::shared_ptr<IndexingContext> IndexCtx)
- : IndexCtx(std::move(IndexCtx)) {}
-
- void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
- SourceRange Range, const MacroArgs *Args) override {
- IndexCtx->handleMacroReference(*MacroNameTok.getIdentifierInfo(),
- Range.getBegin(), *MD.getMacroInfo());
- }
-
- void MacroDefined(const Token &MacroNameTok,
- const MacroDirective *MD) override {
- IndexCtx->handleMacroDefined(*MacroNameTok.getIdentifierInfo(),
- MacroNameTok.getLocation(),
- *MD->getMacroInfo());
- }
-
- void MacroUndefined(const Token &MacroNameTok, const MacroDefinition &MD,
- const MacroDirective *Undef) override {
- if (!MD.getMacroInfo()) // Ignore noop #undef.
- return;
- IndexCtx->handleMacroUndefined(*MacroNameTok.getIdentifierInfo(),
- MacroNameTok.getLocation(),
- *MD.getMacroInfo());
- }
-};
-
class IndexActionBase {
protected:
std::shared_ptr<IndexDataConsumer> DataConsumer;
@@ -101,10 +102,6 @@ protected:
IndexCtx);
}
- std::unique_ptr<PPCallbacks> createIndexPPCallbacks() {
- return std::make_unique<IndexPPCallbacks>(IndexCtx);
- }
-
void finish() {
DataConsumer->finish();
}
@@ -122,11 +119,6 @@ protected:
return createIndexASTConsumer(CI);
}
- bool BeginSourceFileAction(clang::CompilerInstance &CI) override {
- CI.getPreprocessor().addPPCallbacks(createIndexPPCallbacks());
- return true;
- }
-
void EndSourceFileAction() override {
FrontendAction::EndSourceFileAction();
finish();
@@ -158,12 +150,6 @@ protected:
return std::make_unique<MultiplexConsumer>(std::move(Consumers));
}
- bool BeginSourceFileAction(clang::CompilerInstance &CI) override {
- WrapperFrontendAction::BeginSourceFileAction(CI);
- CI.getPreprocessor().addPPCallbacks(createIndexPPCallbacks());
- return true;
- }
-
void EndSourceFileAction() override {
// Invoke wrapped action's method.
WrapperFrontendAction::EndSourceFileAction();
OpenPOWER on IntegriCloud