;
31typedefllvm::DenseMap<const ObjCIvarDecl*,IVarState>
IvarUsageMap;
39IvarUsageMap::iterator I = M.find(
D);
46 if(
const BlockExpr*BE = dyn_cast<BlockExpr>(S)) {
47 Scan(M, BE->getBody());
52 for(
const Expr*sub : POE->semantics()) {
54sub = OVE->getSourceExpr();
58 for(
const Stmt*SubStmt : S->children())
71IvarUsageMap::iterator I = M.find(ID);
78 for(
const auto*I :
D->instance_methods())
79 Scan(M, I->getBody());
84 for(
const auto*I : ID->property_impls())
88 for(
const auto*Cat : ID->getClassInterface()->visible_categories()) {
97 for(
const auto*I :
C->decls())
98 if(
const auto*FD = dyn_cast<FunctionDecl>(I)) {
100 if(
SM.getFileID(L) == FID)
101 Scan(M, FD->getBody());
113 for(
const auto*Ivar : ID->ivars()) {
120Ivar->hasAttr<UnusedAttr>() || Ivar->hasAttr<IBOutletAttr>() ||
121Ivar->hasAttr<IBOutletCollectionAttr>() || Ivar->isUnnamedBitField())
134 boolhasUnused =
false;
135 for(
IVarStateState : llvm::make_second_range(M))
153 for(
auto[Ivar, State] : M)
156llvm::raw_string_ostream os(sbuf);
157os <<
"Instance variable '"<< *Ivar <<
"' in class '"<< *ID
158<<
"' is never used by the methods in its @implementation " 159 "(although it may be used by category methods).";
164 "Optimization", os.str(), L);
173classObjCUnusedIvarsChecker :
public Checker<
174check::ASTDecl<ObjCImplementationDecl> > {
187boolento::shouldRegisterObjCUnusedIvarsChecker(
const CheckerManager&mgr) {
Defines the clang::LangOptions interface.
static void checkObjCUnusedIvar(const ObjCImplementationDecl *D, BugReporter &BR, const CheckerBase *Checker)
llvm::DenseMap< const ObjCIvarDecl *, IVarState > IvarUsageMap
static void Scan(IvarUsageMap &M, const Stmt *S)
Defines the SourceManager interface.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
SourceLocation getLocation() const
DeclContext * getDeclContext()
This represents one expression.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCContainerDecl - Represents a container for method declarations.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Stmt - This represents one statement.
BugReporter is a utility class for generating PathDiagnostics for analysis.
const SourceManager & getSourceManager()
void EmitBasicReport(const Decl *DeclWithIssue, const CheckerBase *Checker, StringRef BugName, StringRef BugCategory, StringRef BugStr, PathDiagnosticLocation Loc, ArrayRef< SourceRange > Ranges={}, ArrayRef< FixItHint > Fixits={})
CHECKER * registerChecker(AT &&... Args)
Used to register checkers.
static PathDiagnosticLocation create(const Decl *D, const SourceManager &SM)
Create a location corresponding to the given declaration.
The JSON file list parser is used to communicate input to InstallAPI.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4