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 static std::unique_ptr<llvm::raw_pwrite_stream>
54 CreateOutputFile(CompilerInstance &CI, StringRef InFile);
55};
56
57/// Wrap ExtractAPIAction on top of a pre-existing action
58///
59/// Used when the ExtractAPI action needs to be executed as a side effect of a
60/// regular compilation job. Unlike ExtarctAPIAction, this is meant to be used
61/// on regular source files ( .m , .c files) instead of header files
62class WrappingExtractAPIAction : public WrapperFrontendAction,
63 private ExtractAPIActionBase {
64public:
65 WrappingExtractAPIAction(std::unique_ptr<FrontendAction> WrappedAction)
66 : WrapperFrontendAction(std::move(WrappedAction)) {}
67
68protected:
69 /// Create ExtractAPI consumer multiplexed on another consumer.
70 ///
71 /// This allows us to execute ExtractAPI action while on top of
72 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
73 StringRef InFile) override;
74
75private:
76 /// Flag to check if the wrapper front end action's consumer is
77 /// craeted or not
78 bool CreatedASTConsumer = false;
79
80 void EndSourceFile() override { FrontendAction::EndSourceFile(); }
81
82 /// Called after executing the action on the synthesized input buffer.
83 ///
84 /// Executes both Wrapper and ExtractAPIBase end source file
85 /// actions. This is the place where all the gathered symbol graph
86 /// information is emited.
87 void EndSourceFileAction() override;
88
89 static std::unique_ptr<llvm::raw_pwrite_stream>
90 CreateOutputFile(CompilerInstance &CI, StringRef InFile);
91};
92
93} // namespace clang
94
95#endif // LLVM_CLANG_EXTRACTAPI_FRONTEND_ACTIONS_H
96

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