Adding AidlCast to replace downcasting methods
This change only replaces ones in AidlMember for now but AidlCast can
replace downcasting methods in AidlDefinedType as well.
Bug: n/a
Test: aidl_unittests
Change-Id: Ib51f994622f87d6442cf1491b02c71c1a305d627
diff --git a/aidl_language.h b/aidl_language.h
index 284e24f..59bd1cd 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -468,22 +468,6 @@
AidlMember(AidlMember&&) = delete;
AidlMember& operator=(const AidlMember&) = delete;
AidlMember& operator=(AidlMember&&) = delete;
-
- virtual const AidlMethod* AsMethod() const { return nullptr; }
- virtual const AidlConstantDeclaration* AsConstantDeclaration() const { return nullptr; }
- virtual const AidlVariableDeclaration* AsVariableDeclaration() const { return nullptr; }
-
- AidlMethod* AsMethod() {
- return const_cast<AidlMethod*>(const_cast<const AidlMember*>(this)->AsMethod());
- }
- AidlConstantDeclaration* AsConstantDeclaration() {
- return const_cast<AidlConstantDeclaration*>(
- const_cast<const AidlMember*>(this)->AsConstantDeclaration());
- }
- AidlVariableDeclaration* AsVariableDeclaration() {
- return const_cast<AidlVariableDeclaration*>(
- const_cast<const AidlMember*>(this)->AsVariableDeclaration());
- }
};
// TODO: This class is used for method arguments and also parcelable fields,
@@ -503,8 +487,6 @@
AidlVariableDeclaration& operator=(const AidlVariableDeclaration&) = delete;
AidlVariableDeclaration& operator=(AidlVariableDeclaration&&) = delete;
- const AidlVariableDeclaration* AsVariableDeclaration() const override { return this; }
-
std::string GetName() const { return name_; }
std::string GetCapitalizedName() const;
const AidlTypeSpecifier& GetType() const { return *type_; }
@@ -825,8 +807,6 @@
return value_->ValueString(GetType(), decorator);
}
- const AidlConstantDeclaration* AsConstantDeclaration() const override { return this; }
-
void TraverseChildren(std::function<void(const AidlNode&)> traverse) const override {
traverse(GetType());
traverse(GetValue());
@@ -854,7 +834,6 @@
AidlMethod& operator=(const AidlMethod&) = delete;
AidlMethod& operator=(AidlMethod&&) = delete;
- const AidlMethod* AsMethod() const override { return this; }
const AidlTypeSpecifier& GetType() const { return *type_; }
AidlTypeSpecifier* GetMutableType() { return type_.get(); }
@@ -1285,3 +1264,21 @@
};
bottom_up(node);
}
+
+template <typename T>
+const T* AidlCast(const AidlNode& node) {
+ struct CastVisitor : AidlVisitor {
+ const T* cast = nullptr;
+ void Visit(const T& t) override { cast = &t; }
+ } visitor;
+ node.DispatchVisit(visitor);
+ return visitor.cast;
+}
+
+template <>
+const AidlDefinedType* AidlCast<AidlDefinedType>(const AidlNode& node);
+
+template <typename T>
+T* AidlCast(AidlNode& node) {
+ return const_cast<T*>(AidlCast<T>(const_cast<const AidlNode&>(node)));
+}