blob: 635519d2657abdb3d4d651ed589b36c5624a2ecb [file] [log] [blame]
Christopher Wileyf600a552015-09-12 14:07:44 -07001/*
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
Steven Moreland9fccf582018-08-27 20:36:27 -070017#pragma once
Christopher Wileyf600a552015-09-12 14:07:44 -070018
Casey Dahlin60a49162015-09-17 14:23:10 -070019#include <memory>
Christopher Wileyf600a552015-09-12 14:07:44 -070020#include <string>
21#include <vector>
22
Elliott Hughes0a620672015-12-04 13:53:18 -080023#include <android-base/macros.h>
Christopher Wileyf600a552015-09-12 14:07:44 -070024
25namespace android {
26namespace aidl {
Christopher Wileyf600a552015-09-12 14:07:44 -070027class CodeWriter;
Christopher Wileyf944e792015-09-29 10:00:46 -070028} // namespace aidl
29} // namespace android
Christopher Wileyf600a552015-09-12 14:07:44 -070030
Christopher Wileyf944e792015-09-29 10:00:46 -070031namespace android {
32namespace aidl {
33namespace cpp {
34
35class AstNode {
Casey Dahlin34b86102015-09-16 16:03:06 -070036 public:
Christopher Wileyf944e792015-09-29 10:00:46 -070037 AstNode() = default;
38 virtual ~AstNode() = default;
Casey Dahlin34b86102015-09-16 16:03:06 -070039 virtual void Write(CodeWriter* to) const = 0;
Jiyong Park176905e2018-07-04 22:29:41 +090040 std::string ToString();
Christopher Wileyf944e792015-09-29 10:00:46 -070041}; // class AstNode
Casey Dahlin34b86102015-09-16 16:03:06 -070042
Christopher Wileyf944e792015-09-29 10:00:46 -070043class Declaration : public AstNode {
Casey Dahlin34b86102015-09-16 16:03:06 -070044 public:
Christopher Wileyf944e792015-09-29 10:00:46 -070045 Declaration() = default;
46 virtual ~Declaration() = default;
Casey Dahlin34b86102015-09-16 16:03:06 -070047
48 private:
Christopher Wileyf944e792015-09-29 10:00:46 -070049 DISALLOW_COPY_AND_ASSIGN(Declaration);
50}; // class Declaration
Casey Dahlin34b86102015-09-16 16:03:06 -070051
Steven Moreland5557f1c2018-07-02 13:50:23 -070052class 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
Christopher Wileyf944e792015-09-29 10:00:46 -070064class ClassDecl : public Declaration {
Casey Dahlin60a49162015-09-17 14:23:10 -070065 public:
Christopher Wileyf944e792015-09-29 10:00:46 -070066 ClassDecl(const std::string& name,
Christopher Wiley0c732db2015-09-29 14:36:44 -070067 const std::string& parent);
68 ClassDecl(const std::string& name,
Christopher Wileyf944e792015-09-29 10:00:46 -070069 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;
Casey Dahlin60a49162015-09-17 14:23:10 -070073
74 void Write(CodeWriter* to) const override;
75
Christopher Wiley0c732db2015-09-29 14:36:44 -070076 void AddPublic(std::unique_ptr<Declaration> member);
77 void AddPrivate(std::unique_ptr<Declaration> member);
78
Casey Dahlin60a49162015-09-17 14:23:10 -070079 private:
80 std::string name_;
81 std::string parent_;
Christopher Wileyf944e792015-09-29 10:00:46 -070082 std::vector<std::unique_ptr<Declaration>> public_members_;
83 std::vector<std::unique_ptr<Declaration>> private_members_;
Casey Dahlin60a49162015-09-17 14:23:10 -070084
Christopher Wileyf944e792015-09-29 10:00:46 -070085 DISALLOW_COPY_AND_ASSIGN(ClassDecl);
86}; // class ClassDecl
Casey Dahlin60a49162015-09-17 14:23:10 -070087
Christopher Wileya7a5c102015-09-29 16:26:52 -070088class Enum : public Declaration {
89 public:
Daniel Norman85aed542019-08-21 12:01:14 -070090 Enum(const std::string& name, const std::string& base_type, bool is_class);
Christopher Wileya7a5c102015-09-29 16:26:52 -070091 virtual ~Enum() = default;
92
Christopher Wileyfd7dc032016-02-02 17:58:39 -080093 bool HasValues() const { return !fields_.empty(); }
Christopher Wileya7a5c102015-09-29 16:26:52 -070094 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_;
Christopher Wileyfd7dc032016-02-02 17:58:39 -0800106 std::string underlying_type_;
Daniel Norman85aed542019-08-21 12:01:14 -0700107 bool is_class_;
Christopher Wileya7a5c102015-09-29 16:26:52 -0700108 std::vector<EnumField> fields_;
109
110 DISALLOW_COPY_AND_ASSIGN(Enum);
111}; // class Enum
112
Christopher Wiley23285262015-10-09 15:06:14 -0700113class ArgList : public AstNode {
114 public:
Christopher Wileyade4b452015-10-10 11:06:03 -0700115 ArgList() = default;
Christopher Wiley23285262015-10-09 15:06:14 -0700116 explicit ArgList(const std::string& single_argument);
117 explicit ArgList(const std::vector<std::string>& arg_list);
Christopher Wileyf02facf2015-11-12 08:54:08 -0800118 explicit ArgList(std::vector<std::unique_ptr<AstNode>> arg_list);
Chih-Hung Hsiehf5cbb682018-09-25 13:43:32 -0700119 ArgList(ArgList&& arg_list) noexcept;
Christopher Wiley23285262015-10-09 15:06:14 -0700120 virtual ~ArgList() = default;
121
122 void Write(CodeWriter* to) const override;
123
124 private:
Christopher Wileyf02facf2015-11-12 08:54:08 -0800125 std::vector<std::unique_ptr<AstNode>> arguments_;
Christopher Wiley23285262015-10-09 15:06:14 -0700126
127 DISALLOW_COPY_AND_ASSIGN(ArgList);
128}; // class ArgList
129
Christopher Wileyf944e792015-09-29 10:00:46 -0700130class ConstructorDecl : public Declaration {
Casey Dahlina834dd42015-09-23 11:52:15 -0700131 public:
Christopher Wileyb23149d2015-10-14 13:52:21 -0700132 enum Modifiers {
133 IS_VIRTUAL = 1 << 0,
134 IS_DEFAULT = 1 << 1,
135 IS_EXPLICIT = 1 << 2,
136 };
137
Christopher Wileyf944e792015-09-29 10:00:46 -0700138 ConstructorDecl(const std::string& name,
Christopher Wileyade4b452015-10-10 11:06:03 -0700139 ArgList&& arg_list);
Christopher Wileya7a5c102015-09-29 16:26:52 -0700140 ConstructorDecl(const std::string& name,
Christopher Wileyade4b452015-10-10 11:06:03 -0700141 ArgList&& arg_list,
Christopher Wileyb23149d2015-10-14 13:52:21 -0700142 uint32_t modifiers);
Casey Dahlina834dd42015-09-23 11:52:15 -0700143
Christopher Wileyf944e792015-09-29 10:00:46 -0700144 virtual ~ConstructorDecl() = default;
Casey Dahlina834dd42015-09-23 11:52:15 -0700145
146 void Write(CodeWriter* to) const override;
147
148 private:
149 const std::string name_;
Christopher Wileyade4b452015-10-10 11:06:03 -0700150 const ArgList arguments_;
Christopher Wileyb23149d2015-10-14 13:52:21 -0700151 const uint32_t modifiers_;
Casey Dahlina834dd42015-09-23 11:52:15 -0700152
Christopher Wileyf944e792015-09-29 10:00:46 -0700153 DISALLOW_COPY_AND_ASSIGN(ConstructorDecl);
Christopher Wileyda695992015-10-05 11:31:41 -0700154}; // class ConstructorDecl
Casey Dahlina834dd42015-09-23 11:52:15 -0700155
Christopher Wiley11a9d792016-02-24 17:20:33 -0800156class 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
Christopher Wileyf944e792015-09-29 10:00:46 -0700170class MethodDecl : public Declaration {
Casey Dahlin88924d62015-09-17 16:28:24 -0700171 public:
Christopher Wiley0c732db2015-09-29 14:36:44 -0700172 enum Modifiers {
173 IS_CONST = 1 << 0,
174 IS_VIRTUAL = 1 << 1,
175 IS_OVERRIDE = 1 << 2,
176 IS_PURE_VIRTUAL = 1 << 3,
Christopher Wiley69b44cf2016-05-03 13:43:33 -0700177 IS_STATIC = 1 << 4,
Jeongik Chaa2ada0c2018-11-17 15:11:45 +0900178 IS_FINAL = 1 << 5,
Christopher Wiley0c732db2015-09-29 14:36:44 -0700179 };
180
181 MethodDecl(const std::string& return_type,
182 const std::string& name,
Christopher Wileyade4b452015-10-10 11:06:03 -0700183 ArgList&& arg_list);
Christopher Wileyf944e792015-09-29 10:00:46 -0700184 MethodDecl(const std::string& return_type,
185 const std::string& name,
Christopher Wileyade4b452015-10-10 11:06:03 -0700186 ArgList&& arg_list,
Christopher Wiley0c732db2015-09-29 14:36:44 -0700187 uint32_t modifiers);
Christopher Wileyf944e792015-09-29 10:00:46 -0700188 virtual ~MethodDecl() = default;
Casey Dahlin88924d62015-09-17 16:28:24 -0700189
190 void Write(CodeWriter* to) const override;
191
192 private:
193 const std::string return_type_;
194 const std::string name_;
Christopher Wileyade4b452015-10-10 11:06:03 -0700195 const ArgList arguments_;
Christopher Wiley0c732db2015-09-29 14:36:44 -0700196 bool is_const_ = false;
197 bool is_virtual_ = false;
198 bool is_override_ = false;
199 bool is_pure_virtual_ = false;
Christopher Wiley69b44cf2016-05-03 13:43:33 -0700200 bool is_static_ = true;
Jeongik Chaa2ada0c2018-11-17 15:11:45 +0900201 bool is_final_ = false;
Casey Dahlin88924d62015-09-17 16:28:24 -0700202
Christopher Wileyf944e792015-09-29 10:00:46 -0700203 DISALLOW_COPY_AND_ASSIGN(MethodDecl);
Christopher Wileyda695992015-10-05 11:31:41 -0700204}; // class MethodDecl
205
206class StatementBlock : public Declaration {
207 public:
208 StatementBlock() = default;
209 virtual ~StatementBlock() = default;
210
211 void AddStatement(std::unique_ptr<AstNode> statement);
Christopher Wiley23285262015-10-09 15:06:14 -0700212 void AddStatement(AstNode* statement); // Takes ownership
Christopher Wileyda695992015-10-05 11:31:41 -0700213 void AddLiteral(const std::string& expression, bool add_semicolon = true);
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700214 bool Empty() const { return statements_.empty(); }
Christopher Wileyda695992015-10-05 11:31:41 -0700215
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
Christopher Wileyf9688b02015-10-08 17:17:50 -0700224class 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
Steven Morelanda57d0a62019-07-30 09:41:14 -0700231 // ConstructorImpl retains ownership of the statement block.
232 StatementBlock* GetStatementBlock();
233
Christopher Wileyf9688b02015-10-08 17:17:50 -0700234 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
Christopher Wileyda695992015-10-05 11:31:41 -0700245class 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,
Christopher Wileyade4b452015-10-10 11:06:03 -0700252 ArgList&& arg_list,
Christopher Wileyda695992015-10-05 11:31:41 -0700253 bool is_const_method = false);
254 virtual ~MethodImpl() = default;
255
Christopher Wileyf9688b02015-10-08 17:17:50 -0700256 // MethodImpl retains ownership of the statement block.
257 StatementBlock* GetStatementBlock();
258
Christopher Wileyda695992015-10-05 11:31:41 -0700259 void Write(CodeWriter* to) const override;
260
261 private:
262 std::string return_type_;
263 std::string method_name_;
Christopher Wileyade4b452015-10-10 11:06:03 -0700264 const ArgList arguments_;
Christopher Wileyda695992015-10-05 11:31:41 -0700265 StatementBlock statements_;
266 bool is_const_method_ = false;
267
268 DISALLOW_COPY_AND_ASSIGN(MethodImpl);
269}; // class MethodImpl
270
271class 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
Christopher Wiley23285262015-10-09 15:06:14 -0700292class 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
306class MethodCall : public AstNode {
307 public:
308 MethodCall(const std::string& method_name,
309 const std::string& single_argument);
Christopher Wileyade4b452015-10-10 11:06:03 -0700310 MethodCall(const std::string& method_name, ArgList&& arg_list);
Christopher Wiley23285262015-10-09 15:06:14 -0700311 ~MethodCall() = default;
312 void Write(CodeWriter* to) const override;
313
314 private:
315 const std::string method_name_;
Christopher Wileyade4b452015-10-10 11:06:03 -0700316 const ArgList arguments_;
Christopher Wiley23285262015-10-09 15:06:14 -0700317
318 DISALLOW_COPY_AND_ASSIGN(MethodCall);
319}; // class MethodCall
320
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700321class IfStatement : public AstNode {
322 public:
Chih-Hung Hsieh156a57f2016-06-02 16:17:28 -0700323 explicit IfStatement(AstNode* expression,
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700324 bool invert_expression = false);
325 virtual ~IfStatement() = default;
326 StatementBlock* OnTrue() { return &on_true_; }
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
Christopher Wiley3c5d28d2015-10-21 09:53:46 -0700339class Statement : public AstNode {
Christopher Wileyda695992015-10-05 11:31:41 -0700340 public:
Christopher Wiley3c5d28d2015-10-21 09:53:46 -0700341 explicit Statement(std::unique_ptr<AstNode> expression);
342 explicit Statement(AstNode* expression); // Takes possession.
343 explicit Statement(const std::string& expression);
344 ~Statement() = default;
Christopher Wileyda695992015-10-05 11:31:41 -0700345 void Write(CodeWriter* to) const override;
346
347 private:
Christopher Wiley3c5d28d2015-10-21 09:53:46 -0700348 std::unique_ptr<AstNode> expression_;
Christopher Wileyda695992015-10-05 11:31:41 -0700349
Christopher Wiley3c5d28d2015-10-21 09:53:46 -0700350 DISALLOW_COPY_AND_ASSIGN(Statement);
351}; // class Statement
Casey Dahlin88924d62015-09-17 16:28:24 -0700352
Christopher Wileyd55db282015-10-20 18:16:47 -0700353class 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
Christopher Wiley23285262015-10-09 15:06:14 -0700367class 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
Christopher Wileyf944e792015-09-29 10:00:46 -0700379class CppNamespace : public Declaration {
Casey Dahlin34b86102015-09-16 16:03:06 -0700380 public:
381 CppNamespace(const std::string& name,
Christopher Wileyf944e792015-09-29 10:00:46 -0700382 std::vector<std::unique_ptr<Declaration>> declarations);
Christopher Wiley0c732db2015-09-29 14:36:44 -0700383 CppNamespace(const std::string& name,
384 std::unique_ptr<Declaration> declaration);
Chih-Hung Hsieh156a57f2016-06-02 16:17:28 -0700385 explicit CppNamespace(const std::string& name);
Casey Dahlinb7d0f7f2015-09-22 17:21:08 -0700386 virtual ~CppNamespace() = default;
Casey Dahlin34b86102015-09-16 16:03:06 -0700387
388 void Write(CodeWriter* to) const override;
389
390 private:
Christopher Wileyf944e792015-09-29 10:00:46 -0700391 std::vector<std::unique_ptr<Declaration>> declarations_;
Casey Dahlin34b86102015-09-16 16:03:06 -0700392 std::string name_;
393
394 DISALLOW_COPY_AND_ASSIGN(CppNamespace);
395}; // class CppNamespace
396
Christopher Wileyf944e792015-09-29 10:00:46 -0700397class Document : public AstNode {
Casey Dahlin34b86102015-09-16 16:03:06 -0700398 public:
Christopher Wileyf944e792015-09-29 10:00:46 -0700399 Document(const std::vector<std::string>& include_list,
Steven Morelandf3da0892018-10-05 14:52:01 -0700400 std::vector<std::unique_ptr<Declaration>> declarations);
Casey Dahlin34b86102015-09-16 16:03:06 -0700401
402 void Write(CodeWriter* to) const override;
403
404 private:
405 std::vector<std::string> include_list_;
Steven Morelandf3da0892018-10-05 14:52:01 -0700406 std::vector<std::unique_ptr<Declaration>> declarations_;
Casey Dahlin34b86102015-09-16 16:03:06 -0700407
Christopher Wileyf944e792015-09-29 10:00:46 -0700408 DISALLOW_COPY_AND_ASSIGN(Document);
409}; // class Document
Casey Dahlin34b86102015-09-16 16:03:06 -0700410
Christopher Wileyf944e792015-09-29 10:00:46 -0700411class CppHeader final : public Document {
Christopher Wileyf600a552015-09-12 14:07:44 -0700412 public:
Steven Morelandf3da0892018-10-05 14:52:01 -0700413 CppHeader(const std::string& include_guard, const std::vector<std::string>& include_list,
414 std::vector<std::unique_ptr<Declaration>> declarations);
Casey Dahlin34b86102015-09-16 16:03:06 -0700415 void Write(CodeWriter* to) const override;
Christopher Wileyf600a552015-09-12 14:07:44 -0700416
417 private:
418 const std::string include_guard_;
Christopher Wileyf600a552015-09-12 14:07:44 -0700419
420 DISALLOW_COPY_AND_ASSIGN(CppHeader);
421}; // class CppHeader
422
Christopher Wileyf944e792015-09-29 10:00:46 -0700423class CppSource final : public Document {
Christopher Wileyf600a552015-09-12 14:07:44 -0700424 public:
Casey Dahlin34b86102015-09-16 16:03:06 -0700425 CppSource(const std::vector<std::string>& include_list,
Steven Morelandf3da0892018-10-05 14:52:01 -0700426 std::vector<std::unique_ptr<Declaration>> declarations);
Christopher Wileyf600a552015-09-12 14:07:44 -0700427
428 private:
Casey Dahlin34b86102015-09-16 16:03:06 -0700429 DISALLOW_COPY_AND_ASSIGN(CppSource);
430}; // class CppSource
Christopher Wileyf600a552015-09-12 14:07:44 -0700431
Christopher Wileyf944e792015-09-29 10:00:46 -0700432} // namespace cpp
Christopher Wileyf600a552015-09-12 14:07:44 -0700433} // namespace aidl
434} // namespace android