1 //===-- APINotesWriter.h - API Notes Writer ---------------------*- 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 // This file defines the \c APINotesWriter class that writes out source 10 // API notes data providing additional information about source code as 11 // a separate input, such as the non-nil/nilable annotations for 12 // method parameters. 13 // 14 //===----------------------------------------------------------------------===// 15 #ifndef LLVM_CLANG_APINOTES_WRITER_H 16 #define LLVM_CLANG_APINOTES_WRITER_H 17 18 #include "clang/APINotes/Types.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/Support/VersionTuple.h" 21 #include "llvm/Support/raw_ostream.h" 22 23 #include <memory> 24 25 namespace clang { 26 class FileEntry; 27 28 namespace api_notes { 29 30 /// A class that writes API notes data to a binary representation that can be 31 /// read by the \c APINotesReader. 32 class APINotesWriter { 33 class Implementation; 34 std::unique_ptr<Implementation> Implementation; 35 36 public: 37 /// Create a new API notes writer with the given module name and 38 /// (optional) source file. 39 APINotesWriter(llvm::StringRef ModuleName, const FileEntry *SF); 40 ~APINotesWriter(); 41 42 APINotesWriter(const APINotesWriter &) = delete; 43 APINotesWriter &operator=(const APINotesWriter &) = delete; 44 45 void writeToStream(llvm::raw_ostream &OS); 46 47 /// Add information about a specific Objective-C class or protocol or a C++ 48 /// namespace. 49 /// 50 /// \param Name The name of this class/protocol/namespace. 51 /// \param Kind Whether this is a class, a protocol, or a namespace. 52 /// \param Info Information about this class/protocol/namespace. 53 /// 54 /// \returns the ID of the class, protocol, or namespace, which can be used to 55 /// add properties and methods to the class/protocol/namespace. 56 ContextID addContext(std::optional<ContextID> ParentCtxID, 57 llvm::StringRef Name, ContextKind Kind, 58 const ContextInfo &Info, 59 llvm::VersionTuple SwiftVersion); 60 61 /// Add information about a specific Objective-C property. 62 /// 63 /// \param CtxID The context in which this property resides. 64 /// \param Name The name of this property. 65 /// \param Info Information about this property. 66 void addObjCProperty(ContextID CtxID, llvm::StringRef Name, 67 bool IsInstanceProperty, const ObjCPropertyInfo &Info, 68 llvm::VersionTuple SwiftVersion); 69 70 /// Add information about a specific Objective-C method. 71 /// 72 /// \param CtxID The context in which this method resides. 73 /// \param Selector The selector that names this method. 74 /// \param IsInstanceMethod Whether this method is an instance method 75 /// (vs. a class method). 76 /// \param Info Information about this method. 77 void addObjCMethod(ContextID CtxID, ObjCSelectorRef Selector, 78 bool IsInstanceMethod, const ObjCMethodInfo &Info, 79 llvm::VersionTuple SwiftVersion); 80 81 /// Add information about a specific C++ method. 82 /// 83 /// \param CtxID The context in which this method resides, i.e. a C++ tag. 84 /// \param Name The name of the method. 85 /// \param Info Information about this method. 86 void addCXXMethod(ContextID CtxID, llvm::StringRef Name, 87 const CXXMethodInfo &Info, llvm::VersionTuple SwiftVersion); 88 89 /// Add information about a global variable. 90 /// 91 /// \param Name The name of this global variable. 92 /// \param Info Information about this global variable. 93 void addGlobalVariable(std::optional<Context> Ctx, llvm::StringRef Name, 94 const GlobalVariableInfo &Info, 95 llvm::VersionTuple SwiftVersion); 96 97 /// Add information about a global function. 98 /// 99 /// \param Name The name of this global function. 100 /// \param Info Information about this global function. 101 void addGlobalFunction(std::optional<Context> Ctx, llvm::StringRef Name, 102 const GlobalFunctionInfo &Info, 103 llvm::VersionTuple SwiftVersion); 104 105 /// Add information about an enumerator. 106 /// 107 /// \param Name The name of this enumerator. 108 /// \param Info Information about this enumerator. 109 void addEnumConstant(llvm::StringRef Name, const EnumConstantInfo &Info, 110 llvm::VersionTuple SwiftVersion); 111 112 /// Add information about a tag (struct/union/enum/C++ class). 113 /// 114 /// \param Name The name of this tag. 115 /// \param Info Information about this tag. 116 void addTag(std::optional<Context> Ctx, llvm::StringRef Name, 117 const TagInfo &Info, llvm::VersionTuple SwiftVersion); 118 119 /// Add information about a typedef. 120 /// 121 /// \param Name The name of this typedef. 122 /// \param Info Information about this typedef. 123 void addTypedef(std::optional<Context> Ctx, llvm::StringRef Name, 124 const TypedefInfo &Info, llvm::VersionTuple SwiftVersion); 125 }; 126 } // namespace api_notes 127 } // namespace clang 128 129 #endif // LLVM_CLANG_APINOTES_WRITER_H 130