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);
     }