| // Copyright 2015 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "CheckDispatchVisitor.h" | 
 |  | 
 | #include "Config.h" | 
 | #include "RecordInfo.h" | 
 |  | 
 | using namespace clang; | 
 |  | 
 | CheckDispatchVisitor::CheckDispatchVisitor(RecordInfo* receiver) | 
 |     : receiver_(receiver), | 
 |       dispatched_to_receiver_(false) { | 
 | } | 
 |  | 
 | bool CheckDispatchVisitor::dispatched_to_receiver() { | 
 |   return dispatched_to_receiver_; | 
 | } | 
 |  | 
 | bool CheckDispatchVisitor::VisitMemberExpr(MemberExpr* member) { | 
 |   if (CXXMethodDecl* fn = dyn_cast<CXXMethodDecl>(member->getMemberDecl())) { | 
 |     if (fn->getParent() == receiver_->record()) | 
 |       dispatched_to_receiver_ = true; | 
 |   } | 
 |   return true; | 
 | } | 
 |  | 
 | bool CheckDispatchVisitor::VisitUnresolvedMemberExpr( | 
 |     UnresolvedMemberExpr* member) { | 
 |   for (Decl* decl : member->decls()) { | 
 |     if (CXXMethodDecl* method = dyn_cast<CXXMethodDecl>(decl)) { | 
 |       if (method->getParent() == receiver_->record() && | 
 |           Config::GetTraceMethodType(method) == | 
 |           Config::TRACE_AFTER_DISPATCH_METHOD) { | 
 |         dispatched_to_receiver_ = true; | 
 |         return true; | 
 |       } | 
 |     } | 
 |   } | 
 |   return true; | 
 | } |