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