1//===- ExtractAPI/FrontendActions.h -----------------------------*- 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/// \file
10/// This file defines the ExtractAPIAction and WrappingExtractAPIAction frontend
11/// actions.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_EXTRACTAPI_FRONTEND_ACTIONS_H
16#define LLVM_CLANG_EXTRACTAPI_FRONTEND_ACTIONS_H
17
18#include "clang/ExtractAPI/ExtractAPIActionBase.h"
19#include "clang/Frontend/FrontendAction.h"
20
21namespace clang {
22
23/// ExtractAPIAction sets up the output file and creates the ExtractAPIVisitor.
24class ExtractAPIAction : public ASTFrontendAction,
25 private ExtractAPIActionBase {
26protected:
27 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
28 StringRef InFile) override;
29
30private:
31
32 /// The input file originally provided on the command line.
33 ///
34 /// This captures the spelling used to include the file and whether the
35 /// include is quoted or not.
36 SmallVector<std::pair<SmallString<32>, bool>> KnownInputFiles;
37
38 /// Prepare to execute the action on the given CompilerInstance.
39 ///
40 /// This is called before executing the action on any inputs. This generates a
41 /// single header that includes all of CI's inputs and replaces CI's input
42 /// list with it before actually executing the action.
43 bool PrepareToExecuteAction(CompilerInstance &CI) override;
44
45 /// Called after executing the action on the synthesized input buffer.
46 ///
47 /// Note: Now that we have gathered all the API definitions to surface we can
48 /// emit them in this callback.
49 void EndSourceFileAction() override;
50
51 static StringRef getInputBufferName() { return "<extract-api-includes>"; }
52};
53
54/// Wrap ExtractAPIAction on top of a pre-existing action
55///
56/// Used when the ExtractAPI action needs to be executed as a side effect of a
57/// regular compilation job. Unlike ExtarctAPIAction, this is meant to be used
58/// on regular source files ( .m , .c files) instead of header files
59class WrappingExtractAPIAction : public WrapperFrontendAction,
60 private ExtractAPIActionBase {
61public:
62 WrappingExtractAPIAction(std::unique_ptr<FrontendAction> WrappedAction)
63 : WrapperFrontendAction(std::move(WrappedAction)) {}
64
65protected:
66 /// Create ExtractAPI consumer multiplexed on another consumer.
67 ///
68 /// This allows us to execute ExtractAPI action while on top of
69 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
70 StringRef InFile) override;
71
72private:
73 /// Flag to check if the wrapper front end action's consumer is
74 /// craeted or not
75 bool CreatedASTConsumer = false;
76
77 void EndSourceFile() override { FrontendAction::EndSourceFile(); }
78
79 /// Called after executing the action on the synthesized input buffer.
80 ///
81 /// Executes both Wrapper and ExtractAPIBase end source file
82 /// actions. This is the place where all the gathered symbol graph
83 /// information is emited.
84 void EndSourceFileAction() override;
85};
86
87} // namespace clang
88
89#endif // LLVM_CLANG_EXTRACTAPI_FRONTEND_ACTIONS_H
90

source code of clang/include/clang/ExtractAPI/FrontendActions.h