clean up ast_java: FieldVariable, Assignment, MethodCall
ast_java doesn't need to know about Type in JavaTypeNamespace.
This commit removes Type in FieldVariable, Assignment, MethodCall
Bug: 110967839
Test: ./runtests.sh
Test: m -j
Change-Id: I496c9785745c415426bd1df0be755e07b7039dd1
diff --git a/ast_java.cpp b/ast_java.cpp
index 0be172c..1dd3818 100644
--- a/ast_java.cpp
+++ b/ast_java.cpp
@@ -22,6 +22,13 @@
using std::vector;
using std::string;
+template <class... Ts>
+struct overloaded : Ts... {
+ using Ts::operator()...;
+};
+template <class... Ts>
+overloaded(Ts...)->overloaded<Ts...>;
+
namespace android {
namespace aidl {
namespace java {
@@ -114,18 +121,15 @@
void Variable::Write(CodeWriter* to) const { to->Write("%s", name.c_str()); }
-FieldVariable::FieldVariable(Expression* o, const string& n)
- : object(o), clazz(nullptr), name(n) {}
+FieldVariable::FieldVariable(Expression* o, const string& n) : receiver(o), name(n) {}
-FieldVariable::FieldVariable(const Type* c, const string& n)
- : object(nullptr), clazz(c), name(n) {}
+FieldVariable::FieldVariable(const string& c, const string& n) : receiver(c), name(n) {}
void FieldVariable::Write(CodeWriter* to) const {
- if (this->object != nullptr) {
- this->object->Write(to);
- } else if (this->clazz != nullptr) {
- to->Write("%s", this->clazz->JavaType().c_str());
- }
+ visit(
+ overloaded{[&](Expression* e) { e->Write(to); },
+ [&](const std::string& s) { to->Write("%s", s.c_str()); }, [](std::monostate) {}},
+ this->receiver);
to->Write(".%s", name.c_str());
}
@@ -161,17 +165,15 @@
to->Write(";\n");
}
-Assignment::Assignment(Variable* l, Expression* r)
- : lvalue(l), rvalue(r), cast(nullptr) {}
+Assignment::Assignment(Variable* l, Expression* r) : lvalue(l), rvalue(r) {}
-Assignment::Assignment(Variable* l, Expression* r, const Type* c)
- : lvalue(l), rvalue(r), cast(c) {}
+Assignment::Assignment(Variable* l, Expression* r, string c) : lvalue(l), rvalue(r), cast(c) {}
void Assignment::Write(CodeWriter* to) const {
this->lvalue->Write(to);
to->Write(" = ");
- if (this->cast != nullptr) {
- to->Write("(%s)", this->cast->JavaType().c_str());
+ if (this->cast) {
+ to->Write("(%s)", this->cast->c_str());
}
this->rvalue->Write(to);
}
@@ -185,20 +187,19 @@
va_end(args);
}
-MethodCall::MethodCall(Expression* o, const string& n) : obj(o), name(n) {}
+MethodCall::MethodCall(Expression* o, const string& n) : receiver(o), name(n) {}
-MethodCall::MethodCall(const Type* t, const string& n) : clazz(t), name(n) {}
+MethodCall::MethodCall(const std::string& t, const string& n) : receiver(t), name(n) {}
-MethodCall::MethodCall(Expression* o, const string& n, int argc = 0, ...)
- : obj(o), name(n) {
+MethodCall::MethodCall(Expression* o, const string& n, int argc = 0, ...) : receiver(o), name(n) {
va_list args;
va_start(args, argc);
init(argc, args);
va_end(args);
}
-MethodCall::MethodCall(const Type* t, const string& n, int argc = 0, ...)
- : clazz(t), name(n) {
+MethodCall::MethodCall(const std::string& t, const string& n, int argc = 0, ...)
+ : receiver(t), name(n) {
va_list args;
va_start(args, argc);
init(argc, args);
@@ -213,12 +214,13 @@
}
void MethodCall::Write(CodeWriter* to) const {
- if (this->obj != nullptr) {
- this->obj->Write(to);
- to->Write(".");
- } else if (this->clazz != nullptr) {
- to->Write("%s.", this->clazz->JavaType().c_str());
- }
+ visit(
+ overloaded{[&](Expression* e) {
+ e->Write(to);
+ to->Write(".");
+ },
+ [&](const std::string& s) { to->Write("%s.", s.c_str()); }, [](std::monostate) {}},
+ this->receiver);
to->Write("%s(", this->name.c_str());
WriteArgumentList(to, this->arguments);
to->Write(")");
diff --git a/ast_java.h b/ast_java.h
index 1a65d85..33bc3be 100644
--- a/ast_java.h
+++ b/ast_java.h
@@ -21,6 +21,7 @@
#include <memory>
#include <optional>
#include <string>
+#include <variant>
#include <vector>
enum {
@@ -102,12 +103,11 @@
};
struct FieldVariable : public Expression {
- Expression* object;
- const Type* clazz;
+ std::variant<Expression*, std::string> receiver;
std::string name;
FieldVariable(Expression* object, const std::string& name);
- FieldVariable(const Type* clazz, const std::string& name);
+ FieldVariable(const std::string& clazz, const std::string& name);
virtual ~FieldVariable() = default;
void Write(CodeWriter* to) const;
@@ -163,17 +163,16 @@
struct Assignment : public Expression {
Variable* lvalue;
Expression* rvalue;
- const Type* cast;
+ std::optional<std::string> cast = std::nullopt;
Assignment(Variable* lvalue, Expression* rvalue);
- Assignment(Variable* lvalue, Expression* rvalue, const Type* cast);
+ Assignment(Variable* lvalue, Expression* rvalue, std::string cast);
virtual ~Assignment() = default;
void Write(CodeWriter* to) const override;
};
struct MethodCall : public Expression {
- Expression* obj = nullptr;
- const Type* clazz = nullptr;
+ std::variant<std::monostate, Expression*, std::string> receiver;
std::string name;
std::vector<Expression*> arguments;
std::vector<std::string> exceptions;
@@ -181,9 +180,9 @@
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(const std::string& clazz, const std::string& name);
MethodCall(Expression* obj, const std::string& name, int argc, ...);
- MethodCall(const Type* clazz, const std::string& name, int argc, ...);
+ MethodCall(const std::string&, const std::string& name, int argc, ...);
virtual ~MethodCall() = default;
void Write(CodeWriter* to) const override;
diff --git a/generate_java_binder.cpp b/generate_java_binder.cpp
index c3b41e8..847e65c 100644
--- a/generate_java_binder.cpp
+++ b/generate_java_binder.cpp
@@ -608,13 +608,13 @@
// the parcels
Variable* _data = new Variable(types->ParcelType()->JavaType(), "_data");
- proxy->statements->Add(new VariableDeclaration(
- _data, new MethodCall(types->ParcelType(), "obtain")));
+ proxy->statements->Add(
+ new VariableDeclaration(_data, new MethodCall(types->ParcelType()->JavaType(), "obtain")));
Variable* _reply = nullptr;
if (!oneway) {
_reply = new Variable(types->ParcelType()->JavaType(), "_reply");
- proxy->statements->Add(new VariableDeclaration(
- _reply, new MethodCall(types->ParcelType(), "obtain")));
+ proxy->statements->Add(
+ new VariableDeclaration(_reply, new MethodCall(types->ParcelType()->JavaType(), "obtain")));
}
// the return value
diff --git a/type_java.cpp b/type_java.cpp
index c38ef81..27fe9d4 100644
--- a/type_java.cpp
+++ b/type_java.cpp
@@ -54,7 +54,7 @@
return new LiteralExpression("0");
}
if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
- return new FieldVariable(m_types->ParcelableInterfaceType(),
+ return new FieldVariable(m_types->ParcelableInterfaceType()->JavaType(),
"PARCELABLE_WRITE_RETURN_VALUE");
}
return new LiteralExpression("0");