You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
388 lines
9.8 KiB
388 lines
9.8 KiB
/* |
|
* Copyright (C) 2015, The Android Open Source Project |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
#ifndef AIDL_AST_JAVA_H_ |
|
#define AIDL_AST_JAVA_H_ |
|
|
|
#include <memory> |
|
#include <stdarg.h> |
|
#include <stdio.h> |
|
#include <string> |
|
#include <vector> |
|
|
|
enum { |
|
PACKAGE_PRIVATE = 0x00000000, |
|
PUBLIC = 0x00000001, |
|
PRIVATE = 0x00000002, |
|
PROTECTED = 0x00000003, |
|
SCOPE_MASK = 0x00000003, |
|
|
|
STATIC = 0x00000010, |
|
FINAL = 0x00000020, |
|
ABSTRACT = 0x00000040, |
|
|
|
OVERRIDE = 0x00000100, |
|
|
|
ALL_MODIFIERS = 0xffffffff |
|
}; |
|
|
|
namespace android { |
|
namespace aidl { |
|
class CodeWriter; |
|
} // namespace aidl |
|
} // namespace android |
|
|
|
namespace android { |
|
namespace aidl { |
|
namespace java { |
|
|
|
class Type; |
|
|
|
// Write the modifiers that are set in both mod and mask |
|
void WriteModifiers(CodeWriter* to, int mod, int mask); |
|
|
|
struct ClassElement { |
|
ClassElement() = default; |
|
virtual ~ClassElement() = default; |
|
|
|
virtual void Write(CodeWriter* to) const = 0; |
|
}; |
|
|
|
struct Expression { |
|
virtual ~Expression() = default; |
|
virtual void Write(CodeWriter* to) const = 0; |
|
}; |
|
|
|
struct LiteralExpression : public Expression { |
|
std::string value; |
|
|
|
explicit LiteralExpression(const std::string& value); |
|
virtual ~LiteralExpression() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
// TODO: also escape the contents. not needed for now |
|
struct StringLiteralExpression : public Expression { |
|
std::string value; |
|
|
|
explicit StringLiteralExpression(const std::string& value); |
|
virtual ~StringLiteralExpression() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Variable : public Expression { |
|
const Type* type = nullptr; |
|
std::string name; |
|
int dimension = 0; |
|
|
|
Variable() = default; |
|
Variable(const Type* type, const std::string& name); |
|
Variable(const Type* type, const std::string& name, int dimension); |
|
virtual ~Variable() = default; |
|
|
|
void WriteDeclaration(CodeWriter* to) const; |
|
void Write(CodeWriter* to) const; |
|
}; |
|
|
|
struct FieldVariable : public Expression { |
|
Expression* object; |
|
const Type* clazz; |
|
std::string name; |
|
|
|
FieldVariable(Expression* object, const std::string& name); |
|
FieldVariable(const Type* clazz, const std::string& name); |
|
virtual ~FieldVariable() = default; |
|
|
|
void Write(CodeWriter* to) const; |
|
}; |
|
|
|
struct Field : public ClassElement { |
|
std::string comment; |
|
int modifiers = 0; |
|
Variable* variable = nullptr; |
|
std::string value; |
|
|
|
Field() = default; |
|
Field(int modifiers, Variable* variable); |
|
virtual ~Field() = default; |
|
|
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Statement { |
|
virtual ~Statement() = default; |
|
virtual void Write(CodeWriter* to) const = 0; |
|
}; |
|
|
|
struct StatementBlock : public Statement { |
|
std::vector<Statement*> statements; |
|
|
|
StatementBlock() = default; |
|
virtual ~StatementBlock() = default; |
|
void Write(CodeWriter* to) const override; |
|
|
|
void Add(Statement* statement); |
|
void Add(Expression* expression); |
|
}; |
|
|
|
struct ExpressionStatement : public Statement { |
|
Expression* expression; |
|
|
|
explicit ExpressionStatement(Expression* expression); |
|
virtual ~ExpressionStatement() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Assignment : public Expression { |
|
Variable* lvalue; |
|
Expression* rvalue; |
|
const Type* cast; |
|
|
|
Assignment(Variable* lvalue, Expression* rvalue); |
|
Assignment(Variable* lvalue, Expression* rvalue, const Type* cast); |
|
virtual ~Assignment() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct MethodCall : public Expression { |
|
Expression* obj = nullptr; |
|
const Type* clazz = nullptr; |
|
std::string name; |
|
std::vector<Expression*> arguments; |
|
std::vector<std::string> exceptions; |
|
|
|
explicit MethodCall(const std::string& name); |
|
MethodCall(const std::string& name, int argc, ...); |
|
MethodCall(Expression* obj, const std::string& name); |
|
MethodCall(const Type* clazz, const std::string& name); |
|
MethodCall(Expression* obj, const std::string& name, int argc, ...); |
|
MethodCall(const Type* clazz, const std::string& name, int argc, ...); |
|
virtual ~MethodCall() = default; |
|
void Write(CodeWriter* to) const override; |
|
|
|
private: |
|
void init(int n, va_list args); |
|
}; |
|
|
|
struct Comparison : public Expression { |
|
Expression* lvalue; |
|
std::string op; |
|
Expression* rvalue; |
|
|
|
Comparison(Expression* lvalue, const std::string& op, Expression* rvalue); |
|
virtual ~Comparison() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct NewExpression : public Expression { |
|
const Type* type; |
|
std::vector<Expression*> arguments; |
|
|
|
explicit NewExpression(const Type* type); |
|
NewExpression(const Type* type, int argc, ...); |
|
virtual ~NewExpression() = default; |
|
void Write(CodeWriter* to) const override; |
|
|
|
private: |
|
void init(int n, va_list args); |
|
}; |
|
|
|
struct NewArrayExpression : public Expression { |
|
const Type* type; |
|
Expression* size; |
|
|
|
NewArrayExpression(const Type* type, Expression* size); |
|
virtual ~NewArrayExpression() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Ternary : public Expression { |
|
Expression* condition = nullptr; |
|
Expression* ifpart = nullptr; |
|
Expression* elsepart = nullptr; |
|
|
|
Ternary() = default; |
|
Ternary(Expression* condition, Expression* ifpart, Expression* elsepart); |
|
virtual ~Ternary() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Cast : public Expression { |
|
const Type* type = nullptr; |
|
Expression* expression = nullptr; |
|
|
|
Cast() = default; |
|
Cast(const Type* type, Expression* expression); |
|
virtual ~Cast() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct VariableDeclaration : public Statement { |
|
Variable* lvalue = nullptr; |
|
const Type* cast = nullptr; |
|
Expression* rvalue = nullptr; |
|
|
|
explicit VariableDeclaration(Variable* lvalue); |
|
VariableDeclaration(Variable* lvalue, Expression* rvalue, |
|
const Type* cast = NULL); |
|
virtual ~VariableDeclaration() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct IfStatement : public Statement { |
|
Expression* expression = nullptr; |
|
StatementBlock* statements = new StatementBlock; |
|
IfStatement* elseif = nullptr; |
|
|
|
IfStatement() = default; |
|
virtual ~IfStatement() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct ReturnStatement : public Statement { |
|
Expression* expression; |
|
|
|
explicit ReturnStatement(Expression* expression); |
|
virtual ~ReturnStatement() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct TryStatement : public Statement { |
|
StatementBlock* statements = new StatementBlock; |
|
|
|
TryStatement() = default; |
|
virtual ~TryStatement() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct CatchStatement : public Statement { |
|
StatementBlock* statements; |
|
Variable* exception; |
|
|
|
explicit CatchStatement(Variable* exception); |
|
virtual ~CatchStatement() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct FinallyStatement : public Statement { |
|
StatementBlock* statements = new StatementBlock; |
|
|
|
FinallyStatement() = default; |
|
virtual ~FinallyStatement() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Case { |
|
std::vector<std::string> cases; |
|
StatementBlock* statements = new StatementBlock; |
|
|
|
Case() = default; |
|
explicit Case(const std::string& c); |
|
virtual ~Case() = default; |
|
virtual void Write(CodeWriter* to) const; |
|
}; |
|
|
|
struct SwitchStatement : public Statement { |
|
Expression* expression; |
|
std::vector<Case*> cases; |
|
|
|
explicit SwitchStatement(Expression* expression); |
|
virtual ~SwitchStatement() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Break : public Statement { |
|
Break() = default; |
|
virtual ~Break() = default; |
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Method : public ClassElement { |
|
std::string comment; |
|
int modifiers = 0; |
|
const Type* returnType = nullptr; // nullptr means constructor |
|
size_t returnTypeDimension = 0; |
|
std::string name; |
|
std::vector<Variable*> parameters; |
|
std::vector<const Type*> exceptions; |
|
StatementBlock* statements = nullptr; |
|
|
|
Method() = default; |
|
virtual ~Method() = default; |
|
|
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct IntConstant : public ClassElement { |
|
const std::string name; |
|
const int value; |
|
|
|
IntConstant(std::string name, int value) |
|
: name(name), value(value) {} |
|
virtual ~IntConstant() = default; |
|
|
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct StringConstant : public ClassElement { |
|
const std::string name; |
|
const std::string value; |
|
|
|
StringConstant(std::string name, std::string value) |
|
: name(name), value(value) {} |
|
~StringConstant() override = default; |
|
|
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
struct Class : public ClassElement { |
|
enum { CLASS, INTERFACE }; |
|
|
|
std::string comment; |
|
int modifiers = 0; |
|
int what = CLASS; // CLASS or INTERFACE |
|
const Type* type = nullptr; |
|
const Type* extends = nullptr; |
|
std::vector<const Type*> interfaces; |
|
std::vector<ClassElement*> elements; |
|
|
|
Class() = default; |
|
virtual ~Class() = default; |
|
|
|
void Write(CodeWriter* to) const override; |
|
}; |
|
|
|
class Document { |
|
public: |
|
Document(const std::string& comment, |
|
const std::string& package, |
|
const std::string& original_src, |
|
std::unique_ptr<Class> clazz); |
|
virtual ~Document() = default; |
|
virtual void Write(CodeWriter* to) const; |
|
|
|
private: |
|
std::string comment_; |
|
std::string package_; |
|
std::string original_src_; |
|
std::unique_ptr<Class> clazz_; |
|
}; |
|
|
|
} // namespace java |
|
} // namespace aidl |
|
} // namespace android |
|
|
|
#endif // AIDL_AST_JAVA_H_
|
|
|