• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <memory>
20 #include <string>
21 #include <vector>
22 
23 #include <android-base/macros.h>
24 
25 namespace android {
26 namespace aidl {
27 class CodeWriter;
28 }  // namespace aidl
29 }  // namespace android
30 
31 namespace android {
32 namespace aidl {
33 namespace cpp {
34 
35 class AstNode {
36  public:
37   AstNode() = default;
38   virtual ~AstNode() = default;
39   virtual void Write(CodeWriter* to) const = 0;
40   std::string ToString();
41 };  // class AstNode
42 
43 class Declaration : public AstNode {
44  public:
45   Declaration() = default;
46   virtual ~Declaration() = default;
47 
48  private:
49   DISALLOW_COPY_AND_ASSIGN(Declaration);
50 };  // class Declaration
51 
52 class LiteralDecl : public Declaration {
53  public:
54   explicit LiteralDecl(const std::string& expression);
55   ~LiteralDecl() = default;
56   void Write(CodeWriter* to) const override;
57 
58  private:
59   const std::string expression_;
60 
61   DISALLOW_COPY_AND_ASSIGN(LiteralDecl);
62 };  // class LiteralDecl
63 
64 class ClassDecl : public Declaration {
65  public:
66   ClassDecl(const std::string& name,
67             const std::string& parent);
68   ClassDecl(const std::string& name,
69             const std::string& parent,
70             std::vector<std::unique_ptr<Declaration>> public_members,
71             std::vector<std::unique_ptr<Declaration>> private_members);
72   virtual ~ClassDecl() = default;
73 
74   void Write(CodeWriter* to) const override;
75 
76   void AddPublic(std::unique_ptr<Declaration> member);
77   void AddPrivate(std::unique_ptr<Declaration> member);
78 
79  private:
80   std::string name_;
81   std::string parent_;
82   std::vector<std::unique_ptr<Declaration>> public_members_;
83   std::vector<std::unique_ptr<Declaration>> private_members_;
84 
85   DISALLOW_COPY_AND_ASSIGN(ClassDecl);
86 };  // class ClassDecl
87 
88 class Enum : public Declaration {
89  public:
90   Enum(const std::string& name, const std::string& base_type, bool is_class);
91   virtual ~Enum() = default;
92 
HasValues()93   bool HasValues() const { return !fields_.empty(); }
94   void Write(CodeWriter* to) const override;
95 
96   void AddValue(const std::string& key, const std::string& value);
97 
98  private:
99   struct EnumField {
100     EnumField(const std::string& k, const std::string& v);
101     const std::string key;
102     const std::string value;
103   };
104 
105   std::string enum_name_;
106   std::string underlying_type_;
107   bool is_class_;
108   std::vector<EnumField> fields_;
109 
110   DISALLOW_COPY_AND_ASSIGN(Enum);
111 };  // class Enum
112 
113 class ArgList : public AstNode {
114  public:
115   ArgList() = default;
116   explicit ArgList(const std::string& single_argument);
117   explicit ArgList(const std::vector<std::string>& arg_list);
118   explicit ArgList(std::vector<std::unique_ptr<AstNode>> arg_list);
119   ArgList(ArgList&& arg_list) noexcept;
120   virtual ~ArgList() = default;
121 
122   void Write(CodeWriter* to) const override;
123 
124  private:
125   std::vector<std::unique_ptr<AstNode>> arguments_;
126 
127   DISALLOW_COPY_AND_ASSIGN(ArgList);
128 };  // class ArgList
129 
130 class ConstructorDecl : public Declaration {
131  public:
132   enum Modifiers {
133     IS_VIRTUAL = 1 << 0,
134     IS_DEFAULT = 1 << 1,
135     IS_EXPLICIT = 1 << 2,
136   };
137 
138   ConstructorDecl(const std::string& name,
139                   ArgList&& arg_list);
140   ConstructorDecl(const std::string& name,
141                   ArgList&& arg_list,
142                   uint32_t modifiers);
143 
144   virtual ~ConstructorDecl() = default;
145 
146   void Write(CodeWriter* to) const override;
147 
148  private:
149   const std::string name_;
150   const ArgList arguments_;
151   const uint32_t modifiers_;
152 
153   DISALLOW_COPY_AND_ASSIGN(ConstructorDecl);
154 };  // class ConstructorDecl
155 
156 class MacroDecl : public Declaration {
157  public:
158   MacroDecl(const std::string& name, ArgList&& arg_list);
159   virtual ~MacroDecl() = default;
160 
161   void Write(CodeWriter* to) const override;
162 
163  private:
164   const std::string name_;
165   const ArgList arguments_;
166 
167   DISALLOW_COPY_AND_ASSIGN(MacroDecl);
168 };  // class MacroDecl
169 
170 class MethodDecl : public Declaration {
171  public:
172   enum Modifiers {
173     IS_CONST = 1 << 0,
174     IS_VIRTUAL = 1 << 1,
175     IS_OVERRIDE = 1 << 2,
176     IS_PURE_VIRTUAL = 1 << 3,
177     IS_STATIC = 1 << 4,
178     IS_FINAL = 1 << 5,
179   };
180 
181   MethodDecl(const std::string& return_type,
182              const std::string& name,
183              ArgList&& arg_list);
184   MethodDecl(const std::string& return_type,
185              const std::string& name,
186              ArgList&& arg_list,
187              uint32_t modifiers);
188   virtual ~MethodDecl() = default;
189 
190   void Write(CodeWriter* to) const override;
191 
192  private:
193   const std::string return_type_;
194   const std::string name_;
195   const ArgList arguments_;
196   bool is_const_ = false;
197   bool is_virtual_ = false;
198   bool is_override_ = false;
199   bool is_pure_virtual_ = false;
200   bool is_static_ = true;
201   bool is_final_ = false;
202 
203   DISALLOW_COPY_AND_ASSIGN(MethodDecl);
204 };  // class MethodDecl
205 
206 class StatementBlock : public Declaration {
207  public:
208   StatementBlock() = default;
209   virtual ~StatementBlock() = default;
210 
211   void AddStatement(std::unique_ptr<AstNode> statement);
212   void AddStatement(AstNode* statement);  // Takes ownership
213   void AddLiteral(const std::string& expression, bool add_semicolon = true);
Empty()214   bool Empty() const { return statements_.empty(); }
215 
216   void Write(CodeWriter* to) const override;
217 
218  private:
219   std::vector<std::unique_ptr<AstNode>> statements_;
220 
221   DISALLOW_COPY_AND_ASSIGN(StatementBlock);
222 };  // class StatementBlock
223 
224 class ConstructorImpl : public Declaration {
225  public:
226   ConstructorImpl(const std::string& class_name,
227                   ArgList&& arg_list,
228                   const std::vector<std::string>& initializer_list);
229   virtual ~ConstructorImpl() = default;
230 
231   // ConstructorImpl retains ownership of the statement block.
232   StatementBlock* GetStatementBlock();
233 
234   void Write(CodeWriter* to) const override;
235 
236  private:
237   std::string class_name_;
238   ArgList arguments_;
239   std::vector<std::string> initializer_list_;
240   StatementBlock body_;
241 
242   DISALLOW_COPY_AND_ASSIGN(ConstructorImpl);
243 };  // class ConstructorImpl
244 
245 class MethodImpl : public Declaration {
246  public:
247   // Passing an empty class name causes the method to be declared as a normal
248   // function (ie. no ClassName:: qualifier).
249   MethodImpl(const std::string& return_type,
250              const std::string& class_name,
251              const std::string& method_name,
252              ArgList&& arg_list,
253              bool is_const_method = false);
254   virtual ~MethodImpl() = default;
255 
256   // MethodImpl retains ownership of the statement block.
257   StatementBlock* GetStatementBlock();
258 
259   void Write(CodeWriter* to) const override;
260 
261  private:
262   std::string return_type_;
263   std::string method_name_;
264   const ArgList arguments_;
265   StatementBlock statements_;
266   bool is_const_method_ = false;
267 
268   DISALLOW_COPY_AND_ASSIGN(MethodImpl);
269 };  // class MethodImpl
270 
271 class SwitchStatement : public AstNode {
272  public:
273   explicit SwitchStatement(const std::string& expression);
274   virtual ~SwitchStatement() = default;
275 
276   // Add a case statement and return a pointer code block corresponding
277   // to the case.  The switch statement will add a break statement
278   // after the code block by default to prevent accidental fall-through.
279   // Returns nullptr on duplicate value expressions (by strcmp, not value
280   // equivalence).
281   StatementBlock* AddCase(const std::string& value_expression);
282   void Write(CodeWriter* to) const override;
283 
284  private:
285   const std::string switch_expression_;
286   std::vector<std::string> case_values_;
287   std::vector<std::unique_ptr<StatementBlock>> case_logic_;
288 
289   DISALLOW_COPY_AND_ASSIGN(SwitchStatement);
290 };  // class SwitchStatement
291 
292 class Assignment : public AstNode {
293  public:
294   Assignment(const std::string& left, const std::string& right);
295   Assignment(const std::string& left, AstNode* right);
296   ~Assignment() = default;
297   void Write(CodeWriter* to) const override;
298 
299  private:
300   const std::string lhs_;
301   std::unique_ptr<AstNode> rhs_;
302 
303   DISALLOW_COPY_AND_ASSIGN(Assignment);
304 };  // class Assignment
305 
306 class MethodCall : public AstNode {
307  public:
308   MethodCall(const std::string& method_name,
309              const std::string& single_argument);
310   MethodCall(const std::string& method_name, ArgList&& arg_list);
311   ~MethodCall() = default;
312   void Write(CodeWriter* to) const override;
313 
314  private:
315   const std::string method_name_;
316   const ArgList arguments_;
317 
318   DISALLOW_COPY_AND_ASSIGN(MethodCall);
319 };  // class MethodCall
320 
321 class IfStatement : public AstNode {
322  public:
323   explicit IfStatement(AstNode* expression,
324               bool invert_expression = false);
325   virtual ~IfStatement() = default;
OnTrue()326   StatementBlock* OnTrue() { return &on_true_; }
OnFalse()327   StatementBlock* OnFalse() { return &on_false_; }
328   void Write(CodeWriter* to) const override;
329 
330  private:
331   std::unique_ptr<AstNode> expression_;
332   bool invert_expression_ = false;
333   StatementBlock on_true_;
334   StatementBlock on_false_;
335 
336   DISALLOW_COPY_AND_ASSIGN(IfStatement);
337 };  // class IfStatement
338 
339 class Statement : public AstNode {
340  public:
341   explicit Statement(std::unique_ptr<AstNode> expression);
342   explicit Statement(AstNode* expression);  // Takes possession.
343   explicit Statement(const std::string& expression);
344   ~Statement() = default;
345   void Write(CodeWriter* to) const override;
346 
347  private:
348   std::unique_ptr<AstNode> expression_;
349 
350   DISALLOW_COPY_AND_ASSIGN(Statement);
351 };  // class Statement
352 
353 class Comparison : public AstNode {
354  public:
355   Comparison(AstNode* lhs, const std::string& comparison, AstNode* rhs);
356   ~Comparison() = default;
357   void Write(CodeWriter* to) const override;
358 
359  private:
360   std::unique_ptr<AstNode> left_;
361   std::unique_ptr<AstNode> right_;
362   const std::string operator_;
363 
364   DISALLOW_COPY_AND_ASSIGN(Comparison);
365 };  // class Comparison
366 
367 class LiteralExpression : public AstNode {
368  public:
369   explicit LiteralExpression(const std::string& expression);
370   ~LiteralExpression() = default;
371   void Write(CodeWriter* to) const override;
372 
373  private:
374   const std::string expression_;
375 
376   DISALLOW_COPY_AND_ASSIGN(LiteralExpression);
377 };  // class LiteralExpression
378 
379 class CppNamespace : public Declaration {
380  public:
381   CppNamespace(const std::string& name,
382                std::vector<std::unique_ptr<Declaration>> declarations);
383   CppNamespace(const std::string& name,
384                std::unique_ptr<Declaration> declaration);
385   explicit CppNamespace(const std::string& name);
386   virtual ~CppNamespace() = default;
387 
388   void Write(CodeWriter* to) const override;
389 
390  private:
391   std::vector<std::unique_ptr<Declaration>> declarations_;
392   std::string name_;
393 
394   DISALLOW_COPY_AND_ASSIGN(CppNamespace);
395 };  // class CppNamespace
396 
397 class Document : public AstNode {
398  public:
399   Document(const std::vector<std::string>& include_list,
400            std::vector<std::unique_ptr<Declaration>> declarations);
401 
402   void Write(CodeWriter* to) const override;
403 
404  private:
405   std::vector<std::string> include_list_;
406   std::vector<std::unique_ptr<Declaration>> declarations_;
407 
408   DISALLOW_COPY_AND_ASSIGN(Document);
409 };  // class Document
410 
411 class CppHeader final : public Document {
412  public:
413   CppHeader(const std::string& include_guard, const std::vector<std::string>& include_list,
414             std::vector<std::unique_ptr<Declaration>> declarations);
415   void Write(CodeWriter* to) const override;
416 
417  private:
418   const std::string include_guard_;
419 
420   DISALLOW_COPY_AND_ASSIGN(CppHeader);
421 };  // class CppHeader
422 
423 class CppSource final : public Document {
424  public:
425   CppSource(const std::vector<std::string>& include_list,
426             std::vector<std::unique_ptr<Declaration>> declarations);
427 
428  private:
429   DISALLOW_COPY_AND_ASSIGN(CppSource);
430 };  // class CppSource
431 
432 }  // namespace cpp
433 }  // namespace aidl
434 }  // namespace android
435