1038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley/*
2038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Copyright (C) 2015, The Android Open Source Project
3038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley *
4038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License");
5038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * you may not use this file except in compliance with the License.
6038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * You may obtain a copy of the License at
7038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley *
8038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley *     http://www.apache.org/licenses/LICENSE-2.0
9038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley *
10038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * Unless required by applicable law or agreed to in writing, software
11038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS,
12038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * See the License for the specific language governing permissions and
14038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley * limitations under the License.
15038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley */
16038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley
17038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley#ifndef AIDL_AST_JAVA_H_
18038485e9c8a4d7c0d47720e5bb1b1086b7550de7Christopher Wiley#define AIDL_AST_JAVA_H_
19ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
20f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley#include <memory>
21ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski#include <stdarg.h>
22ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski#include <stdio.h>
23ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley#include <string>
24ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley#include <vector>
25ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
26ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinskienum {
27ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  PACKAGE_PRIVATE = 0x00000000,
28ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  PUBLIC = 0x00000001,
29ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  PRIVATE = 0x00000002,
30ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  PROTECTED = 0x00000003,
31ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  SCOPE_MASK = 0x00000003,
32ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
33ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  STATIC = 0x00000010,
34ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  FINAL = 0x00000020,
35ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  ABSTRACT = 0x00000040,
36ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
37ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  OVERRIDE = 0x00000100,
38ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
39ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  ALL_MODIFIERS = 0xffffffff
40ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
41ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
42fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileynamespace android {
43fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileynamespace aidl {
44fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileyclass CodeWriter;
45db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley}  // namespace aidl
46db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley}  // namespace android
47db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley
48db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wileynamespace android {
49db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wileynamespace aidl {
50db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wileynamespace java {
51db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley
52fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileyclass Type;
53fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley
54ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski// Write the modifiers that are set in both mod and mask
55fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wileyvoid WriteModifiers(CodeWriter* to, int mod, int mask);
56ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
57ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct ClassElement {
58ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  ClassElement() = default;
59ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~ClassElement() = default;
60ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
61ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual void Write(CodeWriter* to) const = 0;
62ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
63ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
64ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Expression {
65ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Expression() = default;
66ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual void Write(CodeWriter* to) const = 0;
67ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
68ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
69ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct LiteralExpression : public Expression {
7012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string value;
71ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
72156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit LiteralExpression(const std::string& value);
73ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~LiteralExpression() = default;
74ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
75ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
76ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
77ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski// TODO: also escape the contents.  not needed for now
78ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct StringLiteralExpression : public Expression {
7912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string value;
80ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
81156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit StringLiteralExpression(const std::string& value);
82ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~StringLiteralExpression() = default;
83ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
84ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
85ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
86ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Variable : public Expression {
87ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* type = nullptr;
8812e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string name;
89ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  int dimension = 0;
90ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
91ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Variable() = default;
9212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  Variable(const Type* type, const std::string& name);
9312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  Variable(const Type* type, const std::string& name, int dimension);
94ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Variable() = default;
95ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
96ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void WriteDeclaration(CodeWriter* to) const;
97ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const;
98ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
99ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
100ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct FieldVariable : public Expression {
101ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* object;
102ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* clazz;
10312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string name;
104ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
10512e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  FieldVariable(Expression* object, const std::string& name);
10612e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  FieldVariable(const Type* clazz, const std::string& name);
107ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~FieldVariable() = default;
108ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
109ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const;
110ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
111ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
112ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Field : public ClassElement {
11312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string comment;
114ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  int modifiers = 0;
115ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Variable* variable = nullptr;
11612e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string value;
117ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
118ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Field() = default;
119ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Field(int modifiers, Variable* variable);
120ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Field() = default;
121ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
122ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
123ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
124ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
125ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Statement {
126ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Statement() = default;
127ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual void Write(CodeWriter* to) const = 0;
128ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
129ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
130ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct StatementBlock : public Statement {
13112e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<Statement*> statements;
132ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
133ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  StatementBlock() = default;
134ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~StatementBlock() = default;
135ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
136ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
137ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Add(Statement* statement);
138ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Add(Expression* expression);
139ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
140ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
141ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct ExpressionStatement : public Statement {
142ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* expression;
143ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
144156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit ExpressionStatement(Expression* expression);
145ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~ExpressionStatement() = default;
146ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
147ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
148ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
149ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Assignment : public Expression {
150ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Variable* lvalue;
151ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* rvalue;
152ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* cast;
153ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
154ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Assignment(Variable* lvalue, Expression* rvalue);
155ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Assignment(Variable* lvalue, Expression* rvalue, const Type* cast);
156ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Assignment() = default;
157ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
158ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
159ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
160ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct MethodCall : public Expression {
161ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* obj = nullptr;
162ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* clazz = nullptr;
16312e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string name;
16412e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<Expression*> arguments;
16512e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<std::string> exceptions;
16612e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley
167156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit MethodCall(const std::string& name);
16812e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  MethodCall(const std::string& name, int argc, ...);
16912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  MethodCall(Expression* obj, const std::string& name);
17012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  MethodCall(const Type* clazz, const std::string& name);
17112e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  MethodCall(Expression* obj, const std::string& name, int argc, ...);
17212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  MethodCall(const Type* clazz, const std::string& name, int argc, ...);
173ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~MethodCall() = default;
174ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
175ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley
176ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley private:
177ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void init(int n, va_list args);
178ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
179ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
180ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Comparison : public Expression {
181ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* lvalue;
18212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string op;
183ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* rvalue;
184ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
18512e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  Comparison(Expression* lvalue, const std::string& op, Expression* rvalue);
186ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Comparison() = default;
187ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
188ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
189ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
190ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct NewExpression : public Expression {
191ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* type;
19212e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<Expression*> arguments;
193ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
194156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit NewExpression(const Type* type);
195ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  NewExpression(const Type* type, int argc, ...);
196ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~NewExpression() = default;
197ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
198ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
199ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley private:
200ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void init(int n, va_list args);
201ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
202ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
203ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct NewArrayExpression : public Expression {
204ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* type;
205ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* size;
206ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
207ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  NewArrayExpression(const Type* type, Expression* size);
208ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~NewArrayExpression() = default;
209ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
210ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
211ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
212ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Ternary : public Expression {
213ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* condition = nullptr;
214ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* ifpart = nullptr;
215ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* elsepart = nullptr;
216ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
217ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Ternary() = default;
218ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Ternary(Expression* condition, Expression* ifpart, Expression* elsepart);
219ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Ternary() = default;
220ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
221ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
222ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
223ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Cast : public Expression {
224ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* type = nullptr;
225ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* expression = nullptr;
226ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
227ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Cast() = default;
228ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Cast(const Type* type, Expression* expression);
229ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Cast() = default;
230ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
231ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
232ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
233ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct VariableDeclaration : public Statement {
234ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Variable* lvalue = nullptr;
235ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* cast = nullptr;
236ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* rvalue = nullptr;
237ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
238156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit VariableDeclaration(Variable* lvalue);
239ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  VariableDeclaration(Variable* lvalue, Expression* rvalue,
240ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley                      const Type* cast = NULL);
241ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~VariableDeclaration() = default;
242ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
243ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
244ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
245ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct IfStatement : public Statement {
246ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* expression = nullptr;
247ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  StatementBlock* statements = new StatementBlock;
248ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  IfStatement* elseif = nullptr;
249ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
250ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  IfStatement() = default;
251ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~IfStatement() = default;
252ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
253ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
254ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
255ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct ReturnStatement : public Statement {
256ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* expression;
257ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
258156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit ReturnStatement(Expression* expression);
259ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~ReturnStatement() = default;
260ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
261ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
262ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
263ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct TryStatement : public Statement {
264ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  StatementBlock* statements = new StatementBlock;
265ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
266ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  TryStatement() = default;
267ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~TryStatement() = default;
268ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
269ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
270ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
271ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct CatchStatement : public Statement {
272ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  StatementBlock* statements;
273ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Variable* exception;
274ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
275156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit CatchStatement(Variable* exception);
276ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~CatchStatement() = default;
277ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
278ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
279ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
280ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct FinallyStatement : public Statement {
281ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  StatementBlock* statements = new StatementBlock;
282ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
283ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  FinallyStatement() = default;
284ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~FinallyStatement() = default;
285ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
286ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
287ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
288ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Case {
28912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<std::string> cases;
290ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  StatementBlock* statements = new StatementBlock;
291ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
292ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Case() = default;
293156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit Case(const std::string& c);
294ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Case() = default;
295ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual void Write(CodeWriter* to) const;
296ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
297ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
298ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct SwitchStatement : public Statement {
299ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Expression* expression;
30012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<Case*> cases;
301ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
302156a57fef28ecb6943a85c3c39e4cf5306261397Chih-Hung Hsieh  explicit SwitchStatement(Expression* expression);
303ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~SwitchStatement() = default;
304ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
305ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
306ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
307ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Break : public Statement {
308ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Break() = default;
309ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Break() = default;
310ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
311ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
312ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
313ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Method : public ClassElement {
31412e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string comment;
315ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  int modifiers = 0;
316ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* returnType = nullptr;  // nullptr means constructor
317ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  size_t returnTypeDimension = 0;
31812e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string name;
31912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<Variable*> parameters;
32012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<const Type*> exceptions;
321ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  StatementBlock* statements = nullptr;
322ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley
323ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Method() = default;
324ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Method() = default;
325ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley
326ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
327ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
328ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
32969b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wileystruct IntConstant : public ClassElement {
33069b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  const std::string name;
33169b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  const int value;
33269b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley
33369b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  IntConstant(std::string name, int value)
33469b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley      : name(name), value(value) {}
33569b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  virtual ~IntConstant() = default;
33669b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley
33769b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  void Write(CodeWriter* to) const override;
33869b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley};
33969b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley
34069b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wileystruct StringConstant : public ClassElement {
34169b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  const std::string name;
34269b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  const std::string value;
343d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
34469b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  StringConstant(std::string name, std::string value)
34569b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley      : name(name), value(value) {}
34669b44cf003bd5bda9dcd97a6fe872630c1b2818fChristopher Wiley  ~StringConstant() override = default;
347d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
348ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
349d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin};
350d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
351ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wileystruct Class : public ClassElement {
352ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  enum { CLASS, INTERFACE };
353ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley
35412e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::string comment;
355ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  int modifiers = 0;
356ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  int what = CLASS;  // CLASS or INTERFACE
357ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* type = nullptr;
358ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  const Type* extends = nullptr;
35912e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<const Type*> interfaces;
36012e894a3b69f045f104a9026765ecbc60ec5967eChristopher Wiley  std::vector<ClassElement*> elements;
361ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley
362ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  Class() = default;
363ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Class() = default;
364ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley
365ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  void Write(CodeWriter* to) const override;
366ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
367ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
368f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wileyclass Document {
369f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley public:
370f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley  Document(const std::string& comment,
371f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley           const std::string& package,
372f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley           const std::string& original_src,
373f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley           std::unique_ptr<Class> clazz);
374ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual ~Document() = default;
375ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley  virtual void Write(CodeWriter* to) const;
376f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley
377f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley private:
378f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley  std::string comment_;
379f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley  std::string package_;
380f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley  std::string original_src_;
381f76b59aeac2ce35e954c15c676e9102777ec8faaChristopher Wiley  std::unique_ptr<Class> clazz_;
382ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski};
383ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
384db154a5f543ff697248df649a14f2ac4a70cbf0eChristopher Wiley}  // namespace java
385fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley}  // namespace aidl
386fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley}  // namespace android
387fdeb0f4b96b6c39b1b9ed3358634f180f9e6df06Christopher Wiley
388ae58997526a9cd817508366471d6fcf03b1993c4Christopher Wiley#endif  // AIDL_AST_JAVA_H_
389