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