1//===--- IndexingAction.h - Frontend index action ---------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_INDEX_INDEXINGACTION_H
10#define LLVM_CLANG_INDEX_INDEXINGACTION_H
11
12#include "clang/AST/ASTConsumer.h"
13#include "clang/Basic/LLVM.h"
14#include "clang/Index/IndexingOptions.h"
15#include "clang/Lex/PPCallbacks.h"
16#include "clang/Lex/Preprocessor.h"
17#include "llvm/ADT/ArrayRef.h"
18#include <memory>
19
20namespace clang {
21  class ASTContext;
22  class ASTConsumer;
23  class ASTReader;
24  class ASTUnit;
25  class Decl;
26  class FrontendAction;
27
28namespace serialization {
29  class ModuleFile;
30}
31
32namespace index {
33  class IndexDataConsumer;
34
35/// Creates an ASTConsumer that indexes all symbols (macros and AST decls).
36std::unique_ptr<ASTConsumer> createIndexingASTConsumer(
37    std::shared_ptr<IndexDataConsumer> DataConsumer,
38    const IndexingOptions &Opts, std::shared_ptr<Preprocessor> PP,
39    std::function<bool(const Decl *)> ShouldSkipFunctionBody);
40
41inline std::unique_ptr<ASTConsumer> createIndexingASTConsumer(
42    std::shared_ptr<IndexDataConsumer> DataConsumer,
43    const IndexingOptions &Opts, std::shared_ptr<Preprocessor> PP) {
44  return createIndexingASTConsumer(
45      std::move(DataConsumer), Opts, std::move(PP),
46      /*ShouldSkipFunctionBody=*/[](const Decl *) { return false; });
47}
48
49/// Creates a frontend action that indexes all symbols (macros and AST decls).
50std::unique_ptr<FrontendAction>
51createIndexingAction(std::shared_ptr<IndexDataConsumer> DataConsumer,
52                     const IndexingOptions &Opts);
53
54/// Recursively indexes all decls in the AST.
55void indexASTUnit(ASTUnit &Unit, IndexDataConsumer &DataConsumer,
56                  IndexingOptions Opts);
57
58/// Recursively indexes \p Decls.
59void indexTopLevelDecls(ASTContext &Ctx, Preprocessor &PP,
60                        ArrayRef<const Decl *> Decls,
61                        IndexDataConsumer &DataConsumer, IndexingOptions Opts);
62
63/// Creates a PPCallbacks that indexes macros and feeds macros to \p Consumer.
64/// The caller is responsible for calling `Consumer.setPreprocessor()`.
65std::unique_ptr<PPCallbacks> indexMacrosCallback(IndexDataConsumer &Consumer,
66                                                 IndexingOptions Opts);
67
68/// Recursively indexes all top-level decls in the module.
69void indexModuleFile(serialization::ModuleFile &Mod, ASTReader &Reader,
70                     IndexDataConsumer &DataConsumer, IndexingOptions Opts);
71
72} // namespace index
73} // namespace clang
74
75#endif
76