1 #ifndef AIDL_AIDL_LANGUAGE_H_
2 #define AIDL_AIDL_LANGUAGE_H_
3 
4 #include <memory>
5 #include <string>
6 #include <vector>
7 
8 #include <android-base/macros.h>
9 #include <android-base/strings.h>
10 
11 #include <io_delegate.h>
12 
13 struct yy_buffer_state;
14 typedef yy_buffer_state* YY_BUFFER_STATE;
15 
16 class AidlToken {
17  public:
18   AidlToken(const std::string& text, const std::string& comments);
19 
GetText()20   const std::string& GetText() const { return text_; }
GetComments()21   const std::string& GetComments() const { return comments_; }
22 
23  private:
24   std::string text_;
25   std::string comments_;
26 
27   DISALLOW_COPY_AND_ASSIGN(AidlToken);
28 };
29 
30 class AidlNode {
31  public:
32   AidlNode() = default;
33   virtual ~AidlNode() = default;
34 
35  private:
36   DISALLOW_COPY_AND_ASSIGN(AidlNode);
37 };
38 
39 namespace android {
40 namespace aidl {
41 
42 class ValidatableType;
43 
44 }  // namespace aidl
45 }  // namespace android
46 
47 class AidlType : public AidlNode {
48  public:
49   enum Annotation : uint32_t {
50     AnnotationNone = 0,
51     AnnotationNullable = 1 << 0,
52     AnnotationUtf8 = 1 << 1,
53     AnnotationUtf8InCpp = 1 << 2,
54   };
55 
56   AidlType(const std::string& name, unsigned line,
57            const std::string& comments, bool is_array);
58   virtual ~AidlType() = default;
59 
GetName()60   const std::string& GetName() const { return name_; }
GetLine()61   unsigned GetLine() const { return line_; }
IsArray()62   bool IsArray() const { return is_array_; }
GetComments()63   const std::string& GetComments() const { return comments_; }
64 
65   std::string ToString() const;
66 
SetLanguageType(const android::aidl::ValidatableType * language_type)67   void SetLanguageType(const android::aidl::ValidatableType* language_type) {
68     language_type_ = language_type;
69   }
70 
71   template<typename T>
GetLanguageType()72   const T* GetLanguageType() const {
73     return reinterpret_cast<const T*>(language_type_);
74   }
75 
Annotate(AidlType::Annotation annotation)76   void Annotate(AidlType::Annotation annotation) { annotations_ = annotation; }
IsNullable()77   bool IsNullable() const {
78     return annotations_ & AnnotationNullable;
79   }
IsUtf8()80   bool IsUtf8() const {
81     return annotations_ & AnnotationUtf8;
82   }
IsUtf8InCpp()83   bool IsUtf8InCpp() const {
84     return annotations_ & AnnotationUtf8InCpp;
85   }
86 
87  private:
88   std::string name_;
89   unsigned line_;
90   bool is_array_;
91   std::string comments_;
92   const android::aidl::ValidatableType* language_type_ = nullptr;
93   Annotation annotations_ = AnnotationNone;
94 
95   DISALLOW_COPY_AND_ASSIGN(AidlType);
96 };
97 
98 class AidlArgument : public AidlNode {
99  public:
100   enum Direction { IN_DIR = 1, OUT_DIR = 2, INOUT_DIR = 3 };
101 
102   AidlArgument(AidlArgument::Direction direction, AidlType* type,
103                std::string name, unsigned line);
104   AidlArgument(AidlType* type, std::string name, unsigned line);
105   virtual ~AidlArgument() = default;
106 
GetDirection()107   Direction GetDirection() const { return direction_; }
IsOut()108   bool IsOut() const { return direction_ & OUT_DIR; }
IsIn()109   bool IsIn() const { return direction_ & IN_DIR; }
DirectionWasSpecified()110   bool DirectionWasSpecified() const { return direction_specified_; }
111 
GetName()112   std::string GetName() const { return name_; }
GetLine()113   int GetLine() const { return line_; }
GetType()114   const AidlType& GetType() const { return *type_; }
GetMutableType()115   AidlType* GetMutableType() { return type_.get(); }
116 
117   std::string ToString() const;
118 
119  private:
120   std::unique_ptr<AidlType> type_;
121   Direction direction_;
122   bool direction_specified_;
123   std::string name_;
124   unsigned line_;
125 
126   DISALLOW_COPY_AND_ASSIGN(AidlArgument);
127 };
128 
129 class AidlMethod;
130 class AidlConstant;
131 class AidlMember : public AidlNode {
132  public:
133   AidlMember() = default;
134   virtual ~AidlMember() = default;
135 
AsMethod()136   virtual AidlMethod* AsMethod() { return nullptr; }
AsConstant()137   virtual AidlConstant* AsConstant() { return nullptr; }
138 
139  private:
140   DISALLOW_COPY_AND_ASSIGN(AidlMember);
141 };
142 
143 class AidlConstant : public AidlMember {
144  public:
145   AidlConstant(std::string name, int32_t value);
146   virtual ~AidlConstant() = default;
147 
GetName()148   const std::string& GetName() const { return name_; }
GetValue()149   int GetValue() const { return value_; }
150 
AsConstant()151   AidlConstant* AsConstant() override { return this; }
152 
153  private:
154   std::string name_;
155   int32_t value_;
156 
157   DISALLOW_COPY_AND_ASSIGN(AidlConstant);
158 };
159 
160 class AidlMethod : public AidlMember {
161  public:
162   AidlMethod(bool oneway, AidlType* type, std::string name,
163              std::vector<std::unique_ptr<AidlArgument>>* args,
164              unsigned line, const std::string& comments);
165   AidlMethod(bool oneway, AidlType* type, std::string name,
166              std::vector<std::unique_ptr<AidlArgument>>* args,
167              unsigned line, const std::string& comments, int id);
168   virtual ~AidlMethod() = default;
169 
AsMethod()170   AidlMethod* AsMethod() override { return this; }
171 
GetComments()172   const std::string& GetComments() const { return comments_; }
GetType()173   const AidlType& GetType() const { return *type_; }
GetMutableType()174   AidlType* GetMutableType() { return type_.get(); }
IsOneway()175   bool IsOneway() const { return oneway_; }
GetName()176   const std::string& GetName() const { return name_; }
GetLine()177   unsigned GetLine() const { return line_; }
HasId()178   bool HasId() const { return has_id_; }
GetId()179   int GetId() { return id_; }
SetId(unsigned id)180   void SetId(unsigned id) { id_ = id; }
181 
GetArguments()182   const std::vector<std::unique_ptr<AidlArgument>>& GetArguments() const {
183     return arguments_;
184   }
185   // An inout parameter will appear in both GetInArguments()
186   // and GetOutArguments().  AidlMethod retains ownership of the argument
187   // pointers returned in this way.
GetInArguments()188   const std::vector<const AidlArgument*>& GetInArguments() const {
189     return in_arguments_;
190   }
GetOutArguments()191   const std::vector<const AidlArgument*>& GetOutArguments() const {
192     return out_arguments_;
193   }
194 
195  private:
196   bool oneway_;
197   std::string comments_;
198   std::unique_ptr<AidlType> type_;
199   std::string name_;
200   unsigned line_;
201   const std::vector<std::unique_ptr<AidlArgument>> arguments_;
202   std::vector<const AidlArgument*> in_arguments_;
203   std::vector<const AidlArgument*> out_arguments_;
204   bool has_id_;
205   int id_;
206 
207   DISALLOW_COPY_AND_ASSIGN(AidlMethod);
208 };
209 
210 class AidlParcelable;
211 class AidlInterface;
212 class AidlDocument : public AidlNode {
213  public:
214   AidlDocument() = default;
215   AidlDocument(AidlInterface* interface);
216   virtual ~AidlDocument() = default;
217 
GetInterface()218   const AidlInterface* GetInterface() const { return interface_.get(); }
ReleaseInterface()219   AidlInterface* ReleaseInterface() { return interface_.release(); }
220 
GetParcelables()221   const std::vector<std::unique_ptr<AidlParcelable>>& GetParcelables() const {
222     return parcelables_;
223   }
224 
AddParcelable(AidlParcelable * parcelable)225   void AddParcelable(AidlParcelable* parcelable) {
226     parcelables_.push_back(std::unique_ptr<AidlParcelable>(parcelable));
227   }
228 
229  private:
230   std::vector<std::unique_ptr<AidlParcelable>> parcelables_;
231   std::unique_ptr<AidlInterface> interface_;
232 
233   DISALLOW_COPY_AND_ASSIGN(AidlDocument);
234 };
235 
236 class AidlQualifiedName : public AidlNode {
237  public:
238   AidlQualifiedName(std::string term, std::string comments);
239   virtual ~AidlQualifiedName() = default;
240 
GetTerms()241   const std::vector<std::string>& GetTerms() const { return terms_; }
GetComments()242   const std::string& GetComments() const { return comments_; }
GetDotName()243   std::string GetDotName() const { return android::base::Join(terms_, '.'); }
244 
245   void AddTerm(std::string term);
246 
247  private:
248   std::vector<std::string> terms_;
249   std::string comments_;
250 
251   DISALLOW_COPY_AND_ASSIGN(AidlQualifiedName);
252 };
253 
254 class AidlParcelable : public AidlNode {
255  public:
256   AidlParcelable(AidlQualifiedName* name, unsigned line,
257                  const std::vector<std::string>& package,
258                  const std::string& cpp_header = "");
259   virtual ~AidlParcelable() = default;
260 
GetName()261   std::string GetName() const { return name_->GetDotName(); }
GetLine()262   unsigned GetLine() const { return line_; }
263   std::string GetPackage() const;
GetSplitPackage()264   const std::vector<std::string>& GetSplitPackage() const { return package_; }
GetCppHeader()265   std::string GetCppHeader() const { return cpp_header_; }
266   std::string GetCanonicalName() const;
267 
268  private:
269   std::unique_ptr<AidlQualifiedName> name_;
270   unsigned line_;
271   const std::vector<std::string> package_;
272   std::string cpp_header_;
273 
274   DISALLOW_COPY_AND_ASSIGN(AidlParcelable);
275 };
276 
277 class AidlInterface : public AidlNode {
278  public:
279   AidlInterface(const std::string& name, unsigned line,
280                 const std::string& comments, bool oneway_,
281                 std::vector<std::unique_ptr<AidlMember>>* members,
282                 const std::vector<std::string>& package);
283   virtual ~AidlInterface() = default;
284 
GetName()285   const std::string& GetName() const { return name_; }
GetLine()286   unsigned GetLine() const { return line_; }
GetComments()287   const std::string& GetComments() const { return comments_; }
IsOneway()288   bool IsOneway() const { return oneway_; }
GetMethods()289   const std::vector<std::unique_ptr<AidlMethod>>& GetMethods() const
290       { return methods_; }
GetConstants()291   const std::vector<std::unique_ptr<AidlConstant>>& GetConstants() const
292       { return constants_; }
293   std::string GetPackage() const;
294   std::string GetCanonicalName() const;
GetSplitPackage()295   const std::vector<std::string>& GetSplitPackage() const { return package_; }
296 
SetLanguageType(const android::aidl::ValidatableType * language_type)297   void SetLanguageType(const android::aidl::ValidatableType* language_type) {
298     language_type_ = language_type;
299   }
300 
301   template<typename T>
GetLanguageType()302   const T* GetLanguageType() const {
303     return reinterpret_cast<const T*>(language_type_);
304   }
305 
306  private:
307   std::string name_;
308   std::string comments_;
309   unsigned line_;
310   bool oneway_;
311   std::vector<std::unique_ptr<AidlMethod>> methods_;
312   std::vector<std::unique_ptr<AidlConstant>> constants_;
313   std::vector<std::string> package_;
314 
315   const android::aidl::ValidatableType* language_type_ = nullptr;
316 
317   DISALLOW_COPY_AND_ASSIGN(AidlInterface);
318 };
319 
320 class AidlImport : public AidlNode {
321  public:
322   AidlImport(const std::string& from, const std::string& needed_class,
323              unsigned line);
324   virtual ~AidlImport() = default;
325 
GetFileFrom()326   const std::string& GetFileFrom() const { return from_; }
GetFilename()327   const std::string& GetFilename() const { return filename_; }
GetNeededClass()328   const std::string& GetNeededClass() const { return needed_class_; }
GetLine()329   unsigned GetLine() const { return line_; }
330 
SetFilename(const std::string & filename)331   void SetFilename(const std::string& filename) { filename_ = filename; }
332 
333  private:
334   std::string from_;
335   std::string filename_;
336   std::string needed_class_;
337   unsigned line_;
338 
339   DISALLOW_COPY_AND_ASSIGN(AidlImport);
340 };
341 
342 class Parser {
343  public:
344   explicit Parser(const android::aidl::IoDelegate& io_delegate);
345   ~Parser();
346 
347   // Parse contents of file |filename|.
348   bool ParseFile(const std::string& filename);
349 
350   void ReportError(const std::string& err, unsigned line);
351 
FoundNoErrors()352   bool FoundNoErrors() const { return error_ == 0; }
FileName()353   const std::string& FileName() const { return filename_; }
Scanner()354   void* Scanner() const { return scanner_; }
355 
SetDocument(AidlDocument * doc)356   void SetDocument(AidlDocument* doc) { document_.reset(doc); };
357 
358   void AddImport(AidlQualifiedName* name, unsigned line);
359 
360   std::vector<std::string> Package() const;
SetPackage(AidlQualifiedName * name)361   void SetPackage(AidlQualifiedName* name) { package_.reset(name); }
362 
GetDocument()363   AidlDocument* GetDocument() const { return document_.get(); }
ReleaseDocument()364   AidlDocument* ReleaseDocument() { return document_.release(); }
GetImports()365   const std::vector<std::unique_ptr<AidlImport>>& GetImports() {
366     return imports_;
367   }
368 
ReleaseImports(std::vector<std::unique_ptr<AidlImport>> * ret)369   void ReleaseImports(std::vector<std::unique_ptr<AidlImport>>* ret) {
370       *ret = std::move(imports_);
371       imports_.clear();
372   }
373 
374  private:
375   const android::aidl::IoDelegate& io_delegate_;
376   int error_ = 0;
377   std::string filename_;
378   std::unique_ptr<AidlQualifiedName> package_;
379   void* scanner_ = nullptr;
380   std::unique_ptr<AidlDocument> document_;
381   std::vector<std::unique_ptr<AidlImport>> imports_;
382   std::unique_ptr<std::string> raw_buffer_;
383   YY_BUFFER_STATE buffer_;
384 
385   DISALLOW_COPY_AND_ASSIGN(Parser);
386 };
387 
388 #endif // AIDL_AIDL_LANGUAGE_H_
389