make AidlTypeSpecifier visit-able
const/var/method nodes have its "type" of AidlTypeSpecifier. And
AidlTypeSpecifier is recursive when it's generic.
Now AidlTypeSpecifier accepts AidlVisitor and its TraverseChildren()
traverses generic type parameters.
Test: aidl_unittests
Change-Id: Ia1c634e828112767c1be63c1cd9adb104f1adfe5
diff --git a/aidl_language.h b/aidl_language.h
index 5a248ad..08cd5b9 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -102,6 +102,7 @@
virtual void Visit(const AidlVariableDeclaration&) {}
virtual void Visit(const AidlConstantDeclaration&) {}
virtual void Visit(const AidlArgument&) {}
+ virtual void Visit(const AidlTypeSpecifier&) {}
};
// Anything that is locatable in a .aidl file.
@@ -302,6 +303,7 @@
// AidlTypeSpecifier represents a reference to either a built-in type,
// a defined type, or a variant (e.g., array of generic) of a type.
class AidlTypeSpecifier final : public AidlAnnotatable,
+ public AidlTraversable,
public AidlParameterizable<unique_ptr<AidlTypeSpecifier>> {
public:
AidlTypeSpecifier(const AidlLocation& location, const string& unresolved_name, bool is_array,
@@ -366,6 +368,14 @@
const AidlNode& AsAidlNode() const override { return *this; }
const AidlDefinedType* GetDefinedType() const;
+ void TraverseChildren(std::function<void(const AidlTraversable&)> traverse) const override {
+ if (IsGeneric()) {
+ for (const auto& tp : GetTypeParameters()) {
+ traverse(*tp);
+ }
+ }
+ }
+ void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
private:
AidlTypeSpecifier(const AidlTypeSpecifier&) = default;
@@ -465,8 +475,8 @@
std::string ValueString(const ConstantValueDecorator& decorator) const;
- void TraverseChildren(std::function<void(const AidlTraversable&)>) const override {
- // no children to visit
+ void TraverseChildren(std::function<void(const AidlTraversable&)> traverse) const override {
+ traverse(GetType());
}
void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
@@ -504,8 +514,8 @@
// e.g) "in @utf8InCpp String[] names"
std::string ToString() const;
- void TraverseChildren(std::function<void(const AidlTraversable&)>) const override {
- // no children to visit
+ void TraverseChildren(std::function<void(const AidlTraversable&)> traverse) const override {
+ traverse(GetType());
}
void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
@@ -761,8 +771,8 @@
const AidlConstantDeclaration* AsConstantDeclaration() const override { return this; }
- void TraverseChildren(std::function<void(const AidlTraversable&)>) const override {
- // no children to traverse
+ void TraverseChildren(std::function<void(const AidlTraversable&)> traverse) const override {
+ traverse(GetType());
}
void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
@@ -829,6 +839,7 @@
std::string Signature() const;
void TraverseChildren(std::function<void(const AidlTraversable&)> traverse) const override {
+ traverse(GetType());
for (const auto& a : GetArguments()) {
traverse(*a);
}