r260841 - [index] Allow calling createIndexingAction() without passing another action to wrap over.
Argyrios Kyrtzidis via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 13 22:39:05 PST 2016
Author: akirtzidis
Date: Sun Feb 14 00:39:03 2016
New Revision: 260841
URL: http://llvm.org/viewvc/llvm-project?rev=260841&view=rev
Log:
[index] Allow calling createIndexingAction() without passing another action to wrap over.
Modified:
cfe/trunk/include/clang/Index/IndexingAction.h
cfe/trunk/lib/Index/IndexingAction.cpp
cfe/trunk/tools/libclang/Indexing.cpp
Modified: cfe/trunk/include/clang/Index/IndexingAction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexingAction.h?rev=260841&r1=260840&r2=260841&view=diff
==============================================================================
--- cfe/trunk/include/clang/Index/IndexingAction.h (original)
+++ cfe/trunk/include/clang/Index/IndexingAction.h Sun Feb 14 00:39:03 2016
@@ -32,10 +32,11 @@ struct IndexingOptions {
bool IndexFunctionLocals = false;
};
+/// \param WrappedAction another frontend action to wrap over or null.
std::unique_ptr<FrontendAction>
-createIndexingAction(std::unique_ptr<FrontendAction> WrappedAction,
- std::shared_ptr<IndexDataConsumer> DataConsumer,
- IndexingOptions Opts);
+createIndexingAction(std::shared_ptr<IndexDataConsumer> DataConsumer,
+ IndexingOptions Opts,
+ std::unique_ptr<FrontendAction> WrappedAction = nullptr);
void indexASTUnit(ASTUnit &Unit,
std::shared_ptr<IndexDataConsumer> DataConsumer,
Modified: cfe/trunk/lib/Index/IndexingAction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingAction.cpp?rev=260841&r1=260840&r2=260841&view=diff
==============================================================================
--- cfe/trunk/lib/Index/IndexingAction.cpp (original)
+++ cfe/trunk/lib/Index/IndexingAction.cpp Sun Feb 14 00:39:03 2016
@@ -68,18 +68,52 @@ protected:
}
};
-class IndexAction : public WrapperFrontendAction {
- IndexingOptions IndexOpts;
+class IndexActionBase {
+protected:
std::shared_ptr<IndexDataConsumer> DataConsumer;
- std::unique_ptr<IndexingContext> IndexCtx;
+ IndexingContext IndexCtx;
+
+ IndexActionBase(std::shared_ptr<IndexDataConsumer> dataConsumer,
+ IndexingOptions Opts)
+ : DataConsumer(std::move(dataConsumer)),
+ IndexCtx(Opts, *DataConsumer) {}
+
+ std::unique_ptr<IndexASTConsumer> createIndexASTConsumer() {
+ return llvm::make_unique<IndexASTConsumer>(IndexCtx);
+ }
+ void finish() {
+ DataConsumer->finish();
+ }
+};
+
+class IndexAction : public ASTFrontendAction, IndexActionBase {
public:
- IndexAction(std::unique_ptr<FrontendAction> WrappedAction,
- std::shared_ptr<IndexDataConsumer> DataConsumer,
+ IndexAction(std::shared_ptr<IndexDataConsumer> DataConsumer,
IndexingOptions Opts)
+ : IndexActionBase(std::move(DataConsumer), Opts) {}
+
+protected:
+ std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
+ StringRef InFile) override {
+ return createIndexASTConsumer();
+ }
+
+ void EndSourceFileAction() override {
+ FrontendAction::EndSourceFileAction();
+ finish();
+ }
+};
+
+class WrappingIndexAction : public WrapperFrontendAction, IndexActionBase {
+ bool IndexActionFailed = false;
+
+public:
+ WrappingIndexAction(std::unique_ptr<FrontendAction> WrappedAction,
+ std::shared_ptr<IndexDataConsumer> DataConsumer,
+ IndexingOptions Opts)
: WrapperFrontendAction(std::move(WrappedAction)),
- IndexOpts(Opts),
- DataConsumer(std::move(DataConsumer)) {}
+ IndexActionBase(std::move(DataConsumer), Opts) {}
protected:
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
@@ -89,36 +123,36 @@ protected:
} // anonymous namespace
-void IndexAction::EndSourceFileAction() {
+void WrappingIndexAction::EndSourceFileAction() {
// Invoke wrapped action's method.
WrapperFrontendAction::EndSourceFileAction();
-
- bool IndexActionFailed = !IndexCtx;
if (!IndexActionFailed)
- DataConsumer->finish();
+ finish();
}
std::unique_ptr<ASTConsumer>
-IndexAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
+WrappingIndexAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
auto OtherConsumer = WrapperFrontendAction::CreateASTConsumer(CI, InFile);
- if (!OtherConsumer)
+ if (!OtherConsumer) {
+ IndexActionFailed = true;
return nullptr;
-
- IndexCtx.reset(new IndexingContext(IndexOpts, *DataConsumer));
+ }
std::vector<std::unique_ptr<ASTConsumer>> Consumers;
Consumers.push_back(std::move(OtherConsumer));
- Consumers.push_back(llvm::make_unique<IndexASTConsumer>(*IndexCtx));
+ Consumers.push_back(createIndexASTConsumer());
return llvm::make_unique<MultiplexConsumer>(std::move(Consumers));
}
std::unique_ptr<FrontendAction>
-index::createIndexingAction(std::unique_ptr<FrontendAction> WrappedAction,
- std::shared_ptr<IndexDataConsumer> DataConsumer,
- IndexingOptions Opts) {
- return llvm::make_unique<IndexAction>(std::move(WrappedAction),
- std::move(DataConsumer),
- Opts);
+index::createIndexingAction(std::shared_ptr<IndexDataConsumer> DataConsumer,
+ IndexingOptions Opts,
+ std::unique_ptr<FrontendAction> WrappedAction) {
+ if (WrappedAction)
+ return llvm::make_unique<WrappingIndexAction>(std::move(WrappedAction),
+ std::move(DataConsumer),
+ Opts);
+ return llvm::make_unique<IndexAction>(std::move(DataConsumer), Opts);
}
Modified: cfe/trunk/tools/libclang/Indexing.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=260841&r1=260840&r2=260841&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/Indexing.cpp (original)
+++ cfe/trunk/tools/libclang/Indexing.cpp Sun Feb 14 00:39:03 2016
@@ -542,8 +542,9 @@ static CXErrorCode clang_indexSourceFile
auto InterAction = llvm::make_unique<IndexingFrontendAction>(DataConsumer,
SkipBodies ? IdxSession->SkipBodyData.get() : nullptr);
std::unique_ptr<FrontendAction> IndexAction;
- IndexAction = createIndexingAction(std::move(InterAction), DataConsumer,
- getIndexingOptionsFromCXOptions(index_options));
+ IndexAction = createIndexingAction(DataConsumer,
+ getIndexingOptionsFromCXOptions(index_options),
+ std::move(InterAction));
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar<FrontendAction>
More information about the cfe-commits
mailing list