static void Scan(IvarUsageMap& M, const Stmt *S) { if (!S) return; if (const ObjCIvarRefExpr *Ex = dyn_cast<ObjCIvarRefExpr>(S)) { const ObjCIvarDecl *D = Ex->getDecl(); IvarUsageMap::iterator I = M.find(D); if (I != M.end()) I->second = Used; return; } // Blocks can reference an instance variable of a class. if (const BlockExpr *BE = dyn_cast<BlockExpr>(S)) { Scan(M, BE->getBody()); return; } if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(S)) for (PseudoObjectExpr::const_semantics_iterator i = POE->semantics_begin(), e = POE->semantics_end(); i != e; ++i) { const Expr *sub = *i; if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub)) sub = OVE->getSourceExpr(); Scan(M, sub); } for (Stmt::const_child_iterator I=S->child_begin(),E=S->child_end(); I!=E;++I) Scan(M, *I); }
static void Scan(IvarUsageMap& M, ObjCPropertyImplDecl* D) { if (!D) return; ObjCIvarDecl* ID = D->getPropertyIvarDecl(); if (!ID) return; IvarUsageMap::iterator I = M.find(ID); if (I != M.end()) I->second = Used; }
static void Scan(IvarUsageMap& M, Stmt* S) { if (!S) return; if (ObjCIvarRefExpr* Ex = dyn_cast<ObjCIvarRefExpr>(S)) { ObjCIvarDecl* D = Ex->getDecl(); IvarUsageMap::iterator I = M.find(D); if (I != M.end()) I->second = Used; return; } for (Stmt::child_iterator I=S->child_begin(), E=S->child_end(); I!=E; ++I) Scan(M, *I); }
static void Scan(IvarUsageMap& M, const Stmt* S) { if (!S) return; if (const ObjCIvarRefExpr *Ex = dyn_cast<ObjCIvarRefExpr>(S)) { const ObjCIvarDecl *D = Ex->getDecl(); IvarUsageMap::iterator I = M.find(D); if (I != M.end()) I->second = Used; return; } // Blocks can reference an instance variable of a class. if (const BlockExpr *BE = dyn_cast<BlockExpr>(S)) { Scan(M, BE->getBody()); return; } for (Stmt::const_child_iterator I=S->child_begin(),E=S->child_end(); I!=E;++I) Scan(M, *I); }