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 #ifndef LLVM_CLANG_APINOTES_WRITER_H
10 #define LLVM_CLANG_APINOTES_WRITER_H
11 
12 #include "clang/APINotes/Types.h"
13 #include "llvm/ADT/StringRef.h"
14 #include "llvm/Support/VersionTuple.h"
15 #include "llvm/Support/raw_ostream.h"
16 
17 #include <memory>
18 
19 namespace clang {
20 class FileEntry;
21 
22 namespace api_notes {
23 class APINotesWriter {
24   class Implementation;
25   std::unique_ptr<Implementation> Implementation;
26 
27 public:
28   APINotesWriter(llvm::StringRef ModuleName, const FileEntry *SF);
29   ~APINotesWriter();
30 
31   APINotesWriter(const APINotesWriter &) = delete;
32   APINotesWriter &operator=(const APINotesWriter &) = delete;
33 
34   void writeToStream(llvm::raw_ostream &OS);
35 
36   /// Add information about a specific Objective-C class or protocol or a C++
37   /// namespace.
38   ///
39   /// \param Name The name of this class/protocol/namespace.
40   /// \param Kind Whether this is a class, a protocol, or a namespace.
41   /// \param Info Information about this class/protocol/namespace.
42   ///
43   /// \returns the ID of the class, protocol, or namespace, which can be used to
44   /// add properties and methods to the class/protocol/namespace.
45   ContextID addObjCContext(std::optional<ContextID> ParentCtxID,
46                            llvm::StringRef Name, ContextKind Kind,
47                            const ObjCContextInfo &Info,
48                            llvm::VersionTuple SwiftVersion);
49 
50   /// Add information about a specific Objective-C property.
51   ///
52   /// \param CtxID The context in which this property resides.
53   /// \param Name The name of this property.
54   /// \param Info Information about this property.
55   void addObjCProperty(ContextID CtxID, llvm::StringRef Name,
56                        bool IsInstanceProperty, const ObjCPropertyInfo &Info,
57                        llvm::VersionTuple SwiftVersion);
58 
59   /// Add information about a specific Objective-C method.
60   ///
61   /// \param CtxID The context in which this method resides.
62   /// \param Selector The selector that names this method.
63   /// \param IsInstanceMethod Whether this method is an instance method
64   /// (vs. a class method).
65   /// \param Info Information about this method.
66   void addObjCMethod(ContextID CtxID, ObjCSelectorRef Selector,
67                      bool IsInstanceMethod, const ObjCMethodInfo &Info,
68                      llvm::VersionTuple SwiftVersion);
69 
70   /// Add information about a global variable.
71   ///
72   /// \param Name The name of this global variable.
73   /// \param Info Information about this global variable.
74   void addGlobalVariable(std::optional<Context> Ctx, llvm::StringRef Name,
75                          const GlobalVariableInfo &Info,
76                          llvm::VersionTuple SwiftVersion);
77 
78   /// Add information about a global function.
79   ///
80   /// \param Name The name of this global function.
81   /// \param Info Information about this global function.
82   void addGlobalFunction(std::optional<Context> Ctx, llvm::StringRef Name,
83                          const GlobalFunctionInfo &Info,
84                          llvm::VersionTuple SwiftVersion);
85 
86   /// Add information about an enumerator.
87   ///
88   /// \param Name The name of this enumerator.
89   /// \param Info Information about this enumerator.
90   void addEnumConstant(llvm::StringRef Name, const EnumConstantInfo &Info,
91                        llvm::VersionTuple SwiftVersion);
92 
93   /// Add information about a tag (struct/union/enum/C++ class).
94   ///
95   /// \param Name The name of this tag.
96   /// \param Info Information about this tag.
97   void addTag(std::optional<Context> Ctx, llvm::StringRef Name,
98               const TagInfo &Info, llvm::VersionTuple SwiftVersion);
99 
100   /// Add information about a typedef.
101   ///
102   /// \param Name The name of this typedef.
103   /// \param Info Information about this typedef.
104   void addTypedef(std::optional<Context> Ctx, llvm::StringRef Name,
105                   const TypedefInfo &Info, llvm::VersionTuple SwiftVersion);
106 };
107 } // namespace api_notes
108 } // namespace clang
109 
110 #endif // LLVM_CLANG_APINOTES_WRITER_H
111