ref-resolver skips visiting the same type-ref.

We don't want to "resolve" already "resolved" type refs.
ReferenceResolver visitor can visit the same type-ref node again when
two (or more) const-refs points to the same node which contains
type-ref due to its "recursive visiting strategy".

Bug: 188760442
Test: aidl_unittest
Change-Id: Iab6324442e4b4533554bdd441610e4c9d35b8dee
diff --git a/parser.cpp b/parser.cpp
index c8cf476..732de59 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -68,6 +68,12 @@
       : scope_(scope), typenames_(typenames), resolver_(resolver), success_(success) {}
 
   void Visit(const AidlTypeSpecifier& t) override {
+    // We're visiting the same node again. This can happen when two constant references
+    // point to an ancestor of this node.
+    if (t.IsResolved()) {
+      return;
+    }
+
     AidlTypeSpecifier& type = const_cast<AidlTypeSpecifier&>(t);
     if (!resolver_(typenames_.GetDocumentFor(scope_), &type)) {
       AIDL_ERROR(type) << "Failed to resolve '" << type.GetUnresolvedName() << "'";
@@ -88,6 +94,10 @@
       return;
     }
 
+    // On error, skip recursive visiting to avoid redundant messages
+    if (!*success_) {
+      return;
+    }
     // resolve recursive references
     Push(&v);
     VisitBottomUp(*this, *resolved);