Index: cfe/trunk/include/clang/Index/IndexingAction.h =================================================================== --- cfe/trunk/include/clang/Index/IndexingAction.h +++ cfe/trunk/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 @@ }; /// Creates an ASTConsumer that indexes all symbols (macros and AST decls). -std::unique_ptr -createIndexingASTConsumer(std::shared_ptr DataConsumer, - const IndexingOptions &Opts, - std::shared_ptr PP); +std::unique_ptr createIndexingASTConsumer( + std::shared_ptr DataConsumer, + const IndexingOptions &Opts, std::shared_ptr PP, + std::function ShouldSkipFunctionBody); + +inline std::unique_ptr createIndexingASTConsumer( + std::shared_ptr DataConsumer, + const IndexingOptions &Opts, std::shared_ptr 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 Index: cfe/trunk/lib/Index/IndexingAction.cpp =================================================================== --- cfe/trunk/lib/Index/IndexingAction.cpp +++ cfe/trunk/lib/Index/IndexingAction.cpp @@ -57,14 +57,17 @@ std::shared_ptr DataConsumer; std::shared_ptr IndexCtx; std::shared_ptr PP; + std::function ShouldSkipFunctionBody; public: IndexASTConsumer(std::shared_ptr DataConsumer, const IndexingOptions &Opts, - std::shared_ptr PP) + std::shared_ptr PP, + std::function 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 @@ void HandleTranslationUnit(ASTContext &Ctx) override { DataConsumer->finish(); } + + bool shouldSkipFunctionBody(Decl *D) override { + return ShouldSkipFunctionBody(D); + } }; class IndexAction final : public ASTFrontendAction { @@ -108,18 +115,20 @@ protected: std::unique_ptr CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override { - return std::make_unique(DataConsumer, Opts, - CI.getPreprocessorPtr()); + return std::make_unique( + DataConsumer, Opts, CI.getPreprocessorPtr(), + /*ShouldSkipFunctionBody=*/[](const Decl *) { return false; }); } }; } // anonymous namespace -std::unique_ptr -index::createIndexingASTConsumer(std::shared_ptr DataConsumer, - const IndexingOptions &Opts, - std::shared_ptr PP) { - return std::make_unique(DataConsumer, Opts, PP); +std::unique_ptr index::createIndexingASTConsumer( + std::shared_ptr DataConsumer, + const IndexingOptions &Opts, std::shared_ptr PP, + std::function ShouldSkipFunctionBody) { + return std::make_unique(DataConsumer, Opts, PP, + ShouldSkipFunctionBody); } std::unique_ptr Index: cfe/trunk/tools/libclang/Indexing.cpp =================================================================== --- cfe/trunk/tools/libclang/Indexing.cpp +++ cfe/trunk/tools/libclang/Indexing.cpp @@ -297,54 +297,20 @@ 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 @@ std::vector> Consumers; Consumers.push_back(std::make_unique( *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(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 @@ return TU_Prefix; } bool hasCodeCompletionSupport() const override { return false; } + + void EndSourceFileAction() override { + if (ParsedLocsTracker) + ParsedLocsTracker->syncWithStorage(); + } }; //===----------------------------------------------------------------------===// Index: clang-tools-extra/trunk/clangd/index/IndexAction.cpp =================================================================== --- clang-tools-extra/trunk/clangd/index/IndexAction.cpp +++ clang-tools-extra/trunk/clangd/index/IndexAction.cpp @@ -121,30 +121,6 @@ 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 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 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 @@ CI.getPreprocessor().addPPCallbacks( std::make_unique(CI.getSourceManager(), IG)); - std::vector> Consumers; - Consumers.push_back(std::make_unique( - [this](FileID FID) { return Collector->shouldIndexFile(FID); })); - Consumers.push_back(index::createIndexingASTConsumer( - Collector, Opts, CI.getPreprocessorPtr())); - return std::make_unique(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 {