diff options
| author | Dmitri Gribenko <gribozavr@gmail.com> | 2019-08-29 11:47:34 +0000 |
|---|---|---|
| committer | Dmitri Gribenko <gribozavr@gmail.com> | 2019-08-29 11:47:34 +0000 |
| commit | 349ef2f2f9c2d3f0e363379868d3e8a75b19291b (patch) | |
| tree | 8f91553f138f5a7f8c73e03fb17a3886aa427d38 | |
| parent | 8d32053f113348a4ea94f59b7553733aff0ba651 (diff) | |
| download | bcm5719-llvm-349ef2f2f9c2d3f0e363379868d3e8a75b19291b.tar.gz bcm5719-llvm-349ef2f2f9c2d3f0e363379868d3e8a75b19291b.zip | |
[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
llvm-svn: 370338
| -rw-r--r-- | clang-tools-extra/clangd/index/IndexAction.cpp | 39 | ||||
| -rw-r--r-- | clang/include/clang/Index/IndexingAction.h | 17 | ||||
| -rw-r--r-- | clang/lib/Index/IndexingAction.cpp | 27 | ||||
| -rw-r--r-- | clang/tools/libclang/Indexing.cpp | 72 |
4 files changed, 75 insertions, 80 deletions
diff --git a/clang-tools-extra/clangd/index/IndexAction.cpp b/clang-tools-extra/clangd/index/IndexAction.cpp index b7ceb6f5d48..1b875bd203d 100644 --- a/clang-tools-extra/clangd/index/IndexAction.cpp +++ b/clang-tools-extra/clangd/index/IndexAction.cpp @@ -121,30 +121,6 @@ private: IncludeGraph &IG; }; -/// An ASTConsumer that instructs the parser to skip bodies of functions in the -/// files that should not be processed. -class SkipProcessedFunctions : public ASTConsumer { -public: - SkipProcessedFunctions(std::function<bool(FileID)> FileFilter) - : ShouldIndexFile(std::move(FileFilter)), Context(nullptr) { - assert(this->ShouldIndexFile); - } - - void Initialize(ASTContext &Context) override { this->Context = &Context; } - bool shouldSkipFunctionBody(Decl *D) override { - assert(Context && "Initialize() was never called."); - auto &SM = Context->getSourceManager(); - auto FID = SM.getFileID(SM.getExpansionLoc(D->getLocation())); - if (!FID.isValid()) - return false; - return !ShouldIndexFile(FID); - } - -private: - std::function<bool(FileID)> ShouldIndexFile; - const ASTContext *Context; -}; - // Wraps the index action and reports index data after each translation unit. class IndexAction : public ASTFrontendAction { public: @@ -169,12 +145,15 @@ public: CI.getPreprocessor().addPPCallbacks( std::make_unique<IncludeGraphCollector>(CI.getSourceManager(), IG)); - std::vector<std::unique_ptr<ASTConsumer>> Consumers; - Consumers.push_back(std::make_unique<SkipProcessedFunctions>( - [this](FileID FID) { return Collector->shouldIndexFile(FID); })); - Consumers.push_back(index::createIndexingASTConsumer( - Collector, Opts, CI.getPreprocessorPtr())); - return std::make_unique<MultiplexConsumer>(std::move(Consumers)); + return index::createIndexingASTConsumer( + Collector, Opts, CI.getPreprocessorPtr(), + /*ShouldSkipFunctionBody=*/[this](const Decl *D) { + auto &SM = D->getASTContext().getSourceManager(); + auto FID = SM.getFileID(SM.getExpansionLoc(D->getLocation())); + if (!FID.isValid()) + return false; + return !Collector->shouldIndexFile(FID); + }); } bool BeginInvocation(CompilerInstance &CI) override { diff --git a/clang/include/clang/Index/IndexingAction.h b/clang/include/clang/Index/IndexingAction.h index ce2ff0e105e..f0f10fbc88f 100644 --- a/clang/include/clang/Index/IndexingAction.h +++ b/clang/include/clang/Index/IndexingAction.h @@ -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> diff --git a/clang/lib/Index/IndexingAction.cpp b/clang/lib/Index/IndexingAction.cpp index e7079720140..6d6133e89d8 100644 --- a/clang/lib/Index/IndexingAction.cpp +++ b/clang/lib/Index/IndexingAction.cpp @@ -57,14 +57,17 @@ class IndexASTConsumer final : public ASTConsumer { 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> diff --git a/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp index 372fb214a5a..5e567b3276a 100644 --- a/clang/tools/libclang/Indexing.cpp +++ b/clang/tools/libclang/Indexing.cpp @@ -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(); + } }; //===----------------------------------------------------------------------===// |

