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 21 namespace clang { 22 23 /// ExtractAPIAction sets up the output file and creates the ExtractAPIVisitor. 24 class ExtractAPIAction : public ASTFrontendAction, 25 private ExtractAPIActionBase { 26 protected: 27 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 28 StringRef InFile) override; 29 30 private: 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 getInputBufferName()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 59 class WrappingExtractAPIAction : public WrapperFrontendAction, 60 private ExtractAPIActionBase { 61 public: WrappingExtractAPIAction(std::unique_ptr<FrontendAction> WrappedAction)62 WrappingExtractAPIAction(std::unique_ptr<FrontendAction> WrappedAction) 63 : WrapperFrontendAction(std::move(WrappedAction)) {} 64 65 protected: 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 72 private: 73 /// Flag to check if the wrapper front end action's consumer is 74 /// craeted or not 75 bool CreatedASTConsumer = false; 76 EndSourceFile()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