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