// 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. #ifndef TOOLS_BLINK_GC_PLUGIN_CHECK_TRACE_VISITOR_H_ #define TOOLS_BLINK_GC_PLUGIN_CHECK_TRACE_VISITOR_H_ #include <string> #include "RecordInfo.h" #include "clang/AST/AST.h" #include "clang/AST/RecursiveASTVisitor.h" class RecordCache; class RecordInfo; // This visitor checks a tracing method by traversing its body. // - A member field is considered traced if it is referenced in the body. // - A base is traced if a base-qualified call to a trace method is found. class CheckTraceVisitor : public clang::RecursiveASTVisitor<CheckTraceVisitor> { public: CheckTraceVisitor(clang::CXXMethodDecl* trace, RecordInfo* info, RecordCache* cache); bool delegates_to_traceimpl() const; bool VisitMemberExpr(clang::MemberExpr* member); bool VisitCallExpr(clang::CallExpr* call); private: bool IsTraceCallName(const std::string& name); clang::CXXRecordDecl* GetDependentTemplatedDecl( clang::CXXDependentScopeMemberExpr* expr); void CheckCXXDependentScopeMemberExpr( clang::CallExpr* call, clang::CXXDependentScopeMemberExpr* expr); bool CheckTraceBaseCall(clang::CallExpr* call); bool CheckTraceFieldMemberCall(clang::CXXMemberCallExpr* call); bool CheckTraceFieldCall(const std::string& name, clang::CXXRecordDecl* callee, clang::Expr* arg); bool CheckRegisterWeakMembers(clang::CXXMemberCallExpr* call); bool IsWeakCallback() const; void MarkTraced(RecordInfo::Fields::iterator it); void FoundField(clang::FieldDecl* field); void MarkAllWeakMembersTraced(); clang::CXXMethodDecl* trace_; RecordInfo* info_; RecordCache* cache_; bool delegates_to_traceimpl_; }; #endif // TOOLS_BLINK_GC_PLUGIN_CHECK_TRACE_VISITOR_H_