ast_cpp.h revision f944e79bdaf92fffe9ea78314d3636e7e4de8c51
1f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley/*
2f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * Copyright (C) 2015, The Android Open Source Project
3f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley *
4f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License");
5f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * you may not use this file except in compliance with the License.
6f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * You may obtain a copy of the License at
7f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley *
8f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley *     http://www.apache.org/licenses/LICENSE-2.0
9f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley *
10f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * Unless required by applicable law or agreed to in writing, software
11f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS,
12f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * See the License for the specific language governing permissions and
14f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley * limitations under the License.
15f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley */
16f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
17f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley#ifndef AIDL_AST_CPP_H_
18f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley#define AIDL_AST_CPP_H_
19f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
2060a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin#include <memory>
21f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley#include <string>
22f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley#include <vector>
23f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
24f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley#include <base/macros.h>
25f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
26f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wileynamespace android {
27f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wileynamespace aidl {
28f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wileyclass CodeWriter;
29f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace aidl
30f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace android
31f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley
32f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace android {
33f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace aidl {
34f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace cpp {
35f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
36f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass AstNode {
37f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley public:
38f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  AstNode() = default;
39f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  virtual ~AstNode() = default;
40b7d0f7f4bb08171e025659d17cd3bb57b35b739aCasey Dahlin
4134b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  virtual void Write(CodeWriter* to) const = 0;
42f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
43f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley private:
44f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(AstNode);
45f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley};  // class AstNode
46f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
47f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass Declaration : public AstNode {
4834b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin public:
49f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  Declaration() = default;
50f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  virtual ~Declaration() = default;
5134b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
5234b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin private:
53f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(Declaration);
54f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley};  // class Declaration
5534b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
56f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass ClassDecl : public Declaration {
5760a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin public:
58f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  ClassDecl(const std::string& name,
59f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley            const std::string& parent,
60f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley            std::vector<std::unique_ptr<Declaration>> public_members,
61f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley            std::vector<std::unique_ptr<Declaration>> private_members);
62f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  virtual ~ClassDecl() = default;
6360a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin
6460a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin  void Write(CodeWriter* to) const override;
6560a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin
6660a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin private:
6760a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin  std::string name_;
6860a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin  std::string parent_;
69f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  std::vector<std::unique_ptr<Declaration>> public_members_;
70f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  std::vector<std::unique_ptr<Declaration>> private_members_;
7160a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin
72f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(ClassDecl);
73f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley};  // class ClassDecl
7460a4916eea290a9a62e1f867d1bd9813df5f37fcCasey Dahlin
75f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass ConstructorDecl : public Declaration {
76a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin public:
77f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  ConstructorDecl(const std::string& name,
78f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley                  std::vector<std::string> arguments,
79f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley                  bool is_const = false,
80f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley                  bool is_virtual = false);
81a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
82f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  virtual ~ConstructorDecl() = default;
83a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
84a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin  void Write(CodeWriter* to) const override;
85a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
86a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin private:
87a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin  const std::string name_;
88a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin  std::vector<std::string> arguments_;
89a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin  bool is_const_;
90a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin  bool is_virtual_;
91a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
92f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(ConstructorDecl);
93a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin};
94a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
95f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass MethodDecl : public Declaration {
9688924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin public:
97f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  MethodDecl(const std::string& return_type,
98f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley             const std::string& name,
99f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley             std::vector<std::string> arguments,
100f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley             bool is_const = false,
101f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley             bool is_virtual = false);
102f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  virtual ~MethodDecl() = default;
10388924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin
10488924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin  void Write(CodeWriter* to) const override;
10588924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin
10688924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin private:
10788924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin  const std::string return_type_;
10888924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin  const std::string name_;
10988924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin  std::vector<std::string> arguments_;
11088924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin  bool is_const_;
11188924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin  bool is_virtual_;
11288924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin
113f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(MethodDecl);
11488924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin};
11588924d60d8758c87ad48e6d227839eb354cf369eCasey Dahlin
116f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass CppNamespace : public Declaration {
11734b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin public:
11834b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  CppNamespace(const std::string& name,
119f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley               std::vector<std::unique_ptr<Declaration>> declarations);
120b7d0f7f4bb08171e025659d17cd3bb57b35b739aCasey Dahlin  virtual ~CppNamespace() = default;
12134b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
12234b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  void Write(CodeWriter* to) const override;
12334b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
12434b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin private:
125f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  std::vector<std::unique_ptr<Declaration>> declarations_;
12634b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  std::string name_;
12734b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
12834b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  DISALLOW_COPY_AND_ASSIGN(CppNamespace);
12934b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin};  // class CppNamespace
130f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
131f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass Document : public AstNode {
132f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley public:
133f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  Document(const std::vector<std::string>& include_list,
134f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley           std::unique_ptr<CppNamespace> a_namespace);
13534b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
13634b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  void Write(CodeWriter* to) const override;
137f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
138f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley private:
139f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley  std::vector<std::string> include_list_;
14034b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  std::unique_ptr<CppNamespace> namespace_;
141f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
142f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(Document);
143f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley};  // class Document
144f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
145f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass CppHeader final : public Document {
14634b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin public:
14734b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  CppHeader(const std::string& include_guard,
14834b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin            const std::vector<std::string>& include_list,
149b7d0f7f4bb08171e025659d17cd3bb57b35b739aCasey Dahlin            std::unique_ptr<CppNamespace> a_namespace);
15034b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  void Write(CodeWriter* to) const override;
15134b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
15234b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin private:
15334b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  const std::string include_guard_;
15434b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
15534b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  DISALLOW_COPY_AND_ASSIGN(CppHeader);
15634b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin};  // class CppHeader
15734b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
158f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileyclass CppSource final : public Document {
15934b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin public:
16034b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  CppSource(const std::vector<std::string>& include_list,
161b7d0f7f4bb08171e025659d17cd3bb57b35b739aCasey Dahlin            std::unique_ptr<CppNamespace> a_namespace);
16234b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
16334b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin private:
16434b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin  DISALLOW_COPY_AND_ASSIGN(CppSource);
16534b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin};  // class CppSource
16634b8610486ce41e1a611a2e1ff7f3aedcc49c5f5Casey Dahlin
167f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
168f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley}  // namespace aidl
169f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley}  // namespace android
170f600a555ef6f86afea7d55fc735f0c7b5f7cf6a5Christopher Wiley
171f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley#endif // AIDL_AST_CPP_H_
172