Index: tools/clang/blink_gc_plugin/CheckTraceVisitor.h |
diff --git a/tools/clang/blink_gc_plugin/CheckTraceVisitor.h b/tools/clang/blink_gc_plugin/CheckTraceVisitor.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..580a6fba99bb1a2ad931df579763d05ba0e273ab |
--- /dev/null |
+++ b/tools/clang/blink_gc_plugin/CheckTraceVisitor.h |
@@ -0,0 +1,59 @@ |
+// 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_ |