diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Index/IndexingAction.cpp')
| -rw-r--r-- | contrib/llvm-project/clang/lib/Index/IndexingAction.cpp | 180 | 
1 files changed, 56 insertions, 124 deletions
diff --git a/contrib/llvm-project/clang/lib/Index/IndexingAction.cpp b/contrib/llvm-project/clang/lib/Index/IndexingAction.cpp index 5a805c4abcd6..4f402135672c 100644 --- a/contrib/llvm-project/clang/lib/Index/IndexingAction.cpp +++ b/contrib/llvm-project/clang/lib/Index/IndexingAction.cpp @@ -21,62 +21,9 @@  using namespace clang;  using namespace clang::index; -bool IndexDataConsumer::handleDeclOccurence(const Decl *D, SymbolRoleSet Roles, -                                            ArrayRef<SymbolRelation> Relations, -                                            SourceLocation Loc, -                                            ASTNodeInfo ASTNode) { -  return true; -} - -bool IndexDataConsumer::handleMacroOccurence(const IdentifierInfo *Name, -                                             const MacroInfo *MI, -                                             SymbolRoleSet Roles, -                                             SourceLocation Loc) { -  return true; -} - -bool IndexDataConsumer::handleModuleOccurence(const ImportDecl *ImportD, -                                              const Module *Mod, -                                              SymbolRoleSet Roles, -                                              SourceLocation Loc) { -  return true; -} -  namespace { -class IndexASTConsumer : public ASTConsumer { -  std::shared_ptr<Preprocessor> PP; -  std::shared_ptr<IndexingContext> IndexCtx; - -public: -  IndexASTConsumer(std::shared_ptr<Preprocessor> PP, -                   std::shared_ptr<IndexingContext> IndexCtx) -      : PP(std::move(PP)), IndexCtx(std::move(IndexCtx)) {} - -protected: -  void Initialize(ASTContext &Context) override { -    IndexCtx->setASTContext(Context); -    IndexCtx->getDataConsumer().initialize(Context); -    IndexCtx->getDataConsumer().setPreprocessor(PP); -  } - -  bool HandleTopLevelDecl(DeclGroupRef DG) override { -    return IndexCtx->indexDeclGroupRef(DG); -  } - -  void HandleInterestingDecl(DeclGroupRef DG) override { -    // Ignore deserialized decls. -  } - -  void HandleTopLevelDeclInObjCContainer(DeclGroupRef DG) override { -    IndexCtx->indexDeclGroupRef(DG); -  } - -  void HandleTranslationUnit(ASTContext &Ctx) override { -  } -}; - -class IndexPPCallbacks : public PPCallbacks { +class IndexPPCallbacks final : public PPCallbacks {    std::shared_ptr<IndexingContext> IndexCtx;  public: @@ -106,104 +53,89 @@ public:    }  }; -class IndexActionBase { -protected: +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; -  IndexActionBase(std::shared_ptr<IndexDataConsumer> dataConsumer, -                  IndexingOptions Opts) -      : DataConsumer(std::move(dataConsumer)), -        IndexCtx(new IndexingContext(Opts, *DataConsumer)) {} - -  std::unique_ptr<IndexASTConsumer> -  createIndexASTConsumer(CompilerInstance &CI) { -    return llvm::make_unique<IndexASTConsumer>(CI.getPreprocessorPtr(), -                                               IndexCtx); +public: +  IndexASTConsumer(std::shared_ptr<IndexDataConsumer> DataConsumer, +                   const IndexingOptions &Opts, +                   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)), +        ShouldSkipFunctionBody(std::move(ShouldSkipFunctionBody)) { +    assert(this->DataConsumer != nullptr); +    assert(this->PP != nullptr);    } -  std::unique_ptr<PPCallbacks> createIndexPPCallbacks() { -    return llvm::make_unique<IndexPPCallbacks>(IndexCtx); +protected: +  void Initialize(ASTContext &Context) override { +    IndexCtx->setASTContext(Context); +    IndexCtx->getDataConsumer().initialize(Context); +    IndexCtx->getDataConsumer().setPreprocessor(PP); +    PP->addPPCallbacks(std::make_unique<IndexPPCallbacks>(IndexCtx));    } -  void finish() { -    DataConsumer->finish(); +  bool HandleTopLevelDecl(DeclGroupRef DG) override { +    return IndexCtx->indexDeclGroupRef(DG);    } -}; -class IndexAction : public ASTFrontendAction, IndexActionBase { -public: -  IndexAction(std::shared_ptr<IndexDataConsumer> DataConsumer, -              IndexingOptions Opts) -    : IndexActionBase(std::move(DataConsumer), Opts) {} +  void HandleInterestingDecl(DeclGroupRef DG) override { +    // Ignore deserialized decls. +  } -protected: -  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, -                                                 StringRef InFile) override { -    return createIndexASTConsumer(CI); +  void HandleTopLevelDeclInObjCContainer(DeclGroupRef DG) override { +    IndexCtx->indexDeclGroupRef(DG);    } -  bool BeginSourceFileAction(clang::CompilerInstance &CI) override { -    CI.getPreprocessor().addPPCallbacks(createIndexPPCallbacks()); -    return true; +  void HandleTranslationUnit(ASTContext &Ctx) override { +    DataConsumer->finish();    } -  void EndSourceFileAction() override { -    FrontendAction::EndSourceFileAction(); -    finish(); +  bool shouldSkipFunctionBody(Decl *D) override { +    return ShouldSkipFunctionBody(D);    }  }; -class WrappingIndexAction : public WrapperFrontendAction, IndexActionBase { -  bool IndexActionFailed = false; +class IndexAction final : public ASTFrontendAction { +  std::shared_ptr<IndexDataConsumer> DataConsumer; +  IndexingOptions Opts;  public: -  WrappingIndexAction(std::unique_ptr<FrontendAction> WrappedAction, -                      std::shared_ptr<IndexDataConsumer> DataConsumer, -                      IndexingOptions Opts) -    : WrapperFrontendAction(std::move(WrappedAction)), -      IndexActionBase(std::move(DataConsumer), Opts) {} +  IndexAction(std::shared_ptr<IndexDataConsumer> DataConsumer, +              const IndexingOptions &Opts) +      : DataConsumer(std::move(DataConsumer)), Opts(Opts) { +    assert(this->DataConsumer != nullptr); +  }  protected:    std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,                                                   StringRef InFile) override { -    auto OtherConsumer = WrapperFrontendAction::CreateASTConsumer(CI, InFile); -    if (!OtherConsumer) { -      IndexActionFailed = true; -      return nullptr; -    } - -    std::vector<std::unique_ptr<ASTConsumer>> Consumers; -    Consumers.push_back(std::move(OtherConsumer)); -    Consumers.push_back(createIndexASTConsumer(CI)); -    return llvm::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(); -    if (!IndexActionFailed) -      finish(); +    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, +    std::function<bool(const Decl *)> ShouldSkipFunctionBody) { +  return std::make_unique<IndexASTConsumer>(DataConsumer, Opts, PP, +                                            ShouldSkipFunctionBody); +} +  std::unique_ptr<FrontendAction>  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); +                            const IndexingOptions &Opts) { +  assert(DataConsumer != nullptr); +  return std::make_unique<IndexAction>(std::move(DataConsumer), Opts);  }  static bool topLevelDeclVisitor(void *context, const Decl *D) { @@ -219,7 +151,7 @@ static void indexPreprocessorMacros(const Preprocessor &PP,                                      IndexDataConsumer &DataConsumer) {    for (const auto &M : PP.macros())      if (MacroDirective *MD = M.second.getLatest()) -      DataConsumer.handleMacroOccurence( +      DataConsumer.handleMacroOccurrence(            M.first, MD->getMacroInfo(),            static_cast<unsigned>(index::SymbolRole::Definition),            MD->getLocation()); @@ -257,7 +189,7 @@ void index::indexTopLevelDecls(ASTContext &Ctx, Preprocessor &PP,  std::unique_ptr<PPCallbacks>  index::indexMacrosCallback(IndexDataConsumer &Consumer, IndexingOptions Opts) { -  return llvm::make_unique<IndexPPCallbacks>( +  return std::make_unique<IndexPPCallbacks>(        std::make_shared<IndexingContext>(Opts, Consumer));  }  | 
