CheckDispatchVisitor.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "CheckDispatchVisitor.h"
  5. #include "Config.h"
  6. #include "RecordInfo.h"
  7. using namespace clang;
  8. CheckDispatchVisitor::CheckDispatchVisitor(RecordInfo* receiver)
  9. : receiver_(receiver),
  10. dispatched_to_receiver_(false) {
  11. }
  12. bool CheckDispatchVisitor::dispatched_to_receiver() {
  13. return dispatched_to_receiver_;
  14. }
  15. bool CheckDispatchVisitor::VisitMemberExpr(MemberExpr* member) {
  16. if (CXXMethodDecl* fn = dyn_cast<CXXMethodDecl>(member->getMemberDecl())) {
  17. if (fn->getParent() == receiver_->record())
  18. dispatched_to_receiver_ = true;
  19. }
  20. return true;
  21. }
  22. bool CheckDispatchVisitor::VisitUnresolvedMemberExpr(
  23. UnresolvedMemberExpr* member) {
  24. for (Decl* decl : member->decls()) {
  25. if (CXXMethodDecl* method = dyn_cast<CXXMethodDecl>(decl)) {
  26. if (method->getParent() == receiver_->record() &&
  27. Config::GetTraceMethodType(method) ==
  28. Config::TRACE_AFTER_DISPATCH_METHOD) {
  29. dispatched_to_receiver_ = true;
  30. return true;
  31. }
  32. }
  33. }
  34. return true;
  35. }