r370338 - [Index] Added a ShouldSkipFunctionBody callback to libIndex, and refactored clients to use it instead of inventing their own solution
Dmitri Gribenko via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 29 04:47:34 PDT 2019
Author: gribozavr
Date: Thu Aug 29 04:47:34 2019
New Revision: 370338
URL: http://llvm.org/viewvc/llvm-project?rev=370338&view=rev
Log:
[Index] Added a ShouldSkipFunctionBody callback to libIndex, and refactored clients to use it instead of inventing their own solution
Subscribers: jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D66879
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=370338&r1=370337&r2=370338&view=diff
==============================================================================
--- cfe/trunk/include/clang/Index/IndexingAction.h (original)
+++ cfe/trunk/include/clang/Index/IndexingAction.h Thu Aug 29 04:47:34 2019
@@ -9,6 +9,7 @@
#ifndef LLVM_CLANG_INDEX_INDEXINGACTION_H
#define LLVM_CLANG_INDEX_INDEXINGACTION_H
+#include "clang/AST/ASTConsumer.h"
#include "clang/Basic/LLVM.h"
#include "clang/Lex/PPCallbacks.h"
#include "clang/Lex/Preprocessor.h"
@@ -51,10 +52,18 @@ struct IndexingOptions {
};
/// Creates an ASTConsumer that indexes all symbols (macros and AST decls).
-std::unique_ptr<ASTConsumer>
-createIndexingASTConsumer(std::shared_ptr<IndexDataConsumer> DataConsumer,
- const IndexingOptions &Opts,
- std::shared_ptr<Preprocessor> PP);
+std::unique_ptr<ASTConsumer> createIndexingASTConsumer(
+ std::shared_ptr<IndexDataConsumer> DataConsumer,
+ const IndexingOptions &Opts, std::shared_ptr<Preprocessor> PP,
+ std::function<bool(const Decl *)> ShouldSkipFunctionBody);
+
+inline std::unique_ptr<ASTConsumer> createIndexingASTConsumer(
+ std::shared_ptr<IndexDataConsumer> DataConsumer,
+ const IndexingOptions &Opts, std::shared_ptr<Preprocessor> PP) {
+ return createIndexingASTConsumer(
+ std::move(DataConsumer), Opts, std::move(PP),
+ /*ShouldSkipFunctionBody=*/[](const Decl *) { return false; });
+}
/// Creates a frontend action that indexes all symbols (macros and AST decls).
std::unique_ptr<FrontendAction>
Modified: cfe/trunk/lib/Index/IndexingAction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingAction.cpp?rev=370338&r1=370337&r2=370338&view=diff
==============================================================================
--- cfe/trunk/lib/Index/IndexingAction.cpp (original)
+++ cfe/trunk/lib/Index/IndexingAction.cpp Thu Aug 29 04:47:34 2019
@@ -57,14 +57,17 @@ class IndexASTConsumer final : public AS
std::shared_ptr<IndexDataConsumer> DataConsumer;
std::shared_ptr<IndexingContext> IndexCtx;
std::shared_ptr<Preprocessor> PP;
+ std::function<bool(const Decl *)> ShouldSkipFunctionBody;
public:
IndexASTConsumer(std::shared_ptr<IndexDataConsumer> DataConsumer,
const IndexingOptions &Opts,
- std::shared_ptr<Preprocessor> PP)
+ std::shared_ptr<Preprocessor> PP,
+ std::function<bool(const Decl *)> ShouldSkipFunctionBody)
: DataConsumer(std::move(DataConsumer)),
IndexCtx(new IndexingContext(Opts, *this->DataConsumer)),
- PP(std::move(PP)) {
+ PP(std::move(PP)),
+ ShouldSkipFunctionBody(std::move(ShouldSkipFunctionBody)) {
assert(this->DataConsumer != nullptr);
assert(this->PP != nullptr);
}
@@ -92,6 +95,10 @@ protected:
void HandleTranslationUnit(ASTContext &Ctx) override {
DataConsumer->finish();
}
+
+ bool shouldSkipFunctionBody(Decl *D) override {
+ return ShouldSkipFunctionBody(D);
+ }
};
class IndexAction final : public ASTFrontendAction {
@@ -108,18 +115,20 @@ public:
protected:
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
StringRef InFile) override {
- return std::make_unique<IndexASTConsumer>(DataConsumer, Opts,
- CI.getPreprocessorPtr());
+ return std::make_unique<IndexASTConsumer>(
+ DataConsumer, Opts, CI.getPreprocessorPtr(),
+ /*ShouldSkipFunctionBody=*/[](const Decl *) { return false; });
}
};
} // anonymous namespace
-std::unique_ptr<ASTConsumer>
-index::createIndexingASTConsumer(std::shared_ptr<IndexDataConsumer> DataConsumer,
- const IndexingOptions &Opts,
- std::shared_ptr<Preprocessor> PP) {
- return std::make_unique<IndexASTConsumer>(DataConsumer, Opts, PP);
+std::unique_ptr<ASTConsumer> index::createIndexingASTConsumer(
+ std::shared_ptr<IndexDataConsumer> DataConsumer,
+ const IndexingOptions &Opts, std::shared_ptr<Preprocessor> PP,
+ std::function<bool(const Decl *)> ShouldSkipFunctionBody) {
+ return std::make_unique<IndexASTConsumer>(DataConsumer, Opts, PP,
+ ShouldSkipFunctionBody);
}
std::unique_ptr<FrontendAction>
Modified: cfe/trunk/tools/libclang/Indexing.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=370338&r1=370337&r2=370338&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/Indexing.cpp (original)
+++ cfe/trunk/tools/libclang/Indexing.cpp Thu Aug 29 04:47:34 2019
@@ -297,54 +297,20 @@ public:
class IndexingConsumer : public ASTConsumer {
CXIndexDataConsumer &DataConsumer;
- ParsedSrcLocationsTracker *ParsedLocsTracker;
public:
IndexingConsumer(CXIndexDataConsumer &dataConsumer,
ParsedSrcLocationsTracker *parsedLocsTracker)
- : DataConsumer(dataConsumer), ParsedLocsTracker(parsedLocsTracker) {}
-
- // ASTConsumer Implementation
+ : DataConsumer(dataConsumer) {}
void Initialize(ASTContext &Context) override {
DataConsumer.setASTContext(Context);
DataConsumer.startedTranslationUnit();
}
- void HandleTranslationUnit(ASTContext &Ctx) override {
- if (ParsedLocsTracker)
- ParsedLocsTracker->syncWithStorage();
- }
-
bool HandleTopLevelDecl(DeclGroupRef DG) override {
return !DataConsumer.shouldAbort();
}
-
- bool shouldSkipFunctionBody(Decl *D) override {
- if (!ParsedLocsTracker) {
- // Always skip bodies.
- return true;
- }
-
- const SourceManager &SM = DataConsumer.getASTContext().getSourceManager();
- SourceLocation Loc = D->getLocation();
- if (Loc.isMacroID())
- return false;
- if (SM.isInSystemHeader(Loc))
- return true; // always skip bodies from system headers.
-
- FileID FID;
- unsigned Offset;
- std::tie(FID, Offset) = SM.getDecomposedLoc(Loc);
- // Don't skip bodies from main files; this may be revisited.
- if (SM.getMainFileID() == FID)
- return false;
- const FileEntry *FE = SM.getFileEntryForID(FID);
- if (!FE)
- return false;
-
- return ParsedLocsTracker->hasAlredyBeenParsed(Loc, FID, FE);
- }
};
//===----------------------------------------------------------------------===//
@@ -404,11 +370,38 @@ public:
std::vector<std::unique_ptr<ASTConsumer>> Consumers;
Consumers.push_back(std::make_unique<IndexingConsumer>(
*DataConsumer, ParsedLocsTracker.get()));
- Consumers.push_back(
- createIndexingASTConsumer(DataConsumer, Opts, CI.getPreprocessorPtr()));
+ Consumers.push_back(createIndexingASTConsumer(
+ DataConsumer, Opts, CI.getPreprocessorPtr(),
+ [this](const Decl *D) { return this->shouldSkipFunctionBody(D); }));
return std::make_unique<MultiplexConsumer>(std::move(Consumers));
}
+ bool shouldSkipFunctionBody(const Decl *D) {
+ if (!ParsedLocsTracker) {
+ // Always skip bodies.
+ return true;
+ }
+
+ const SourceManager &SM = D->getASTContext().getSourceManager();
+ SourceLocation Loc = D->getLocation();
+ if (Loc.isMacroID())
+ return false;
+ if (SM.isInSystemHeader(Loc))
+ return true; // always skip bodies from system headers.
+
+ FileID FID;
+ unsigned Offset;
+ std::tie(FID, Offset) = SM.getDecomposedLoc(Loc);
+ // Don't skip bodies from main files; this may be revisited.
+ if (SM.getMainFileID() == FID)
+ return false;
+ const FileEntry *FE = SM.getFileEntryForID(FID);
+ if (!FE)
+ return false;
+
+ return ParsedLocsTracker->hasAlredyBeenParsed(Loc, FID, FE);
+ }
+
TranslationUnitKind getTranslationUnitKind() override {
if (DataConsumer->shouldIndexImplicitTemplateInsts())
return TU_Complete;
@@ -416,6 +409,11 @@ public:
return TU_Prefix;
}
bool hasCodeCompletionSupport() const override { return false; }
+
+ void EndSourceFileAction() override {
+ if (ParsedLocsTracker)
+ ParsedLocsTracker->syncWithStorage();
+ }
};
//===----------------------------------------------------------------------===//
More information about the cfe-commits
mailing list