]> granicus.if.org Git - clang/commitdiff
Added method "EmitBasicReport" to BugReporter to simplify the emission of simple...
authorTed Kremenek <kremenek@apple.com>
Mon, 14 Jul 2008 17:40:50 +0000 (17:40 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 14 Jul 2008 17:40:50 +0000 (17:40 +0000)
Refactored error reporting in CheckObjCDealloc and CheckObjCInstMethSignature to use this new bug reporting interface (major code simplification).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53560 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/BugReporter.h
lib/Analysis/BugReporter.cpp
lib/Analysis/CheckObjCDealloc.cpp
lib/Analysis/CheckObjCInstMethSignature.cpp

index d1c430fc961d785b01793ecac7a2ec2872e6a799..1bbba40418599ade23d2ec470b7c92abb0d8c30a 100644 (file)
@@ -189,6 +189,9 @@ public:
 
   void EmitWarning(BugReport& R);
   
+  void EmitBasicReport(const char* BugName, const char* BugStr,
+                       SourceLocation Loc);
+  
   static bool classof(const BugReporter* R) { return true; }
 };
   
index 081e7925eed50534ff425dee7377fe643930da2b..cbd61f8d25a3b9beae8a5134b742924d59dcb01d 100644 (file)
@@ -731,12 +731,12 @@ void BugReporter::EmitWarning(BugReport& R) {
   // Determine the range.
   
   const SourceRange *Beg, *End;
-  
+
   if (!D->empty()) {
     Beg = D->back()->ranges_begin();
     End = D->back()->ranges_end();
   }
-  else  
+  else
     R.getRanges(*this, Beg, End);
 
   if (PD) {
@@ -745,18 +745,18 @@ void BugReporter::EmitWarning(BugReport& R) {
     for ( ; Beg != End; ++Beg)
       piece->addRange(*Beg);
 
-    D->push_back(piece);    
+    D->push_back(piece);
     PD->HandlePathDiagnostic(D.take());
   }
   else {
-    std::ostringstream os;  
-    
+    std::ostringstream os;
+
     if (D->empty())
       os << R.getDescription();
     else
       os << D->back()->getString();
-    
-    
+
+
     Diagnostic& Diag = getDiagnostic();
     unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
                                               os.str().c_str());
@@ -764,3 +764,19 @@ void BugReporter::EmitWarning(BugReport& R) {
     Diag.Report(L, ErrorDiag, NULL, 0, Beg, End - Beg);
   }
 }
+
+void
+BugReporter::EmitBasicReport(const char* name, const char* str,
+                             SourceLocation Loc) {
+  
+  SimpleBugType BT(name);
+  DiagCollector C(BT);
+  Diagnostic& Diag = getDiagnostic();
+  Diag.Report(&C, getContext().getFullLoc(Loc),
+              Diag.getCustomDiagID(Diagnostic::Warning, str),
+              0, 0, 0, 0);
+  
+  for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
+    EmitWarning(*I);
+}
+                                  
index 3e21f016df208d26c9135701093ffe29c99356e3..0c9100951ce1983ba2e0284d1d19435fc280e3fc 100644 (file)
@@ -83,8 +83,7 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
   
   // Get the "dealloc" selector.
   IdentifierInfo* II = &Ctx.Idents.get("dealloc");
-  Selector S = Ctx.Selectors.getSelector(0, &II);
-  
+  Selector S = Ctx.Selectors.getSelector(0, &II);  
   ObjCMethodDecl* MD = 0;
   
   // Scan the instance methods for "dealloc".
@@ -99,52 +98,32 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
   
   if (!MD) { // No dealloc found.
     
-    // FIXME: This code should be reduced to three lines if possible (Refactor).
-    SimpleBugType BT(LOpts.getGCMode() == LangOptions::NonGC 
-                     ? "missing -dealloc" 
-                     : "missing -dealloc (Hybrid MM, non-GC)");
-    
-    DiagCollector C(BT);
+    const char* name = LOpts.getGCMode() == LangOptions::NonGC 
+                       ? "missing -dealloc" 
+                       : "missing -dealloc (Hybrid MM, non-GC)";
     
     std::ostringstream os;
     os << "Objective-C class '" << D->getName()
        << "' lacks a 'dealloc' instance method";
     
-    Diagnostic& Diag = BR.getDiagnostic();    
-    Diag.Report(&C,
-                Ctx.getFullLoc(D->getLocStart()),
-                Diag.getCustomDiagID(Diagnostic::Warning, os.str().c_str()),
-                NULL, 0, NULL, 0);
-        
-    for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
-      BR.EmitWarning(*I);
-    
+    BR.EmitBasicReport(name, os.str().c_str(), D->getLocStart());
     return;
   }
   
   // dealloc found.  Scan for missing [super dealloc].
   if (MD->getBody() && !scan_dealloc(MD->getBody(), S)) {
     
-    // FIXME: This code should be reduced to three lines if possible (Refactor).
-    SimpleBugType BT(LOpts.getGCMode() == LangOptions::NonGC
-                     ? "missing [super dealloc]"
-                     : "missing [super dealloc] (Hybrid MM, non-GC)");
-                     
-    DiagCollector C(BT);
+    const char* name = LOpts.getGCMode() == LangOptions::NonGC
+                       ? "missing [super dealloc]"
+                       : "missing [super dealloc] (Hybrid MM, non-GC)";
     
     std::ostringstream os;
     os << "The 'dealloc' instance method in Objective-C class '" << D->getName()
        << "' does not send a 'dealloc' message to its super class"
            " (missing [super dealloc])";
     
-    Diagnostic& Diag = BR.getDiagnostic();    
-    Diag.Report(&C,
-                Ctx.getFullLoc(MD->getLocStart()),
-                Diag.getCustomDiagID(Diagnostic::Warning, os.str().c_str()),
-                NULL, 0, NULL, 0);
-    
-    for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
-      BR.EmitWarning(*I);
-  }    
+    BR.EmitBasicReport(name, os.str().c_str(), D->getLocStart());
+    return;
+  }   
 }
 
index f5966ecc724041264eb27fdbccc175a312f9d642..ffaef42b2359191bf3f98f0627869bd8b5a905be 100644 (file)
@@ -64,16 +64,8 @@ static void CompareReturnTypes(ObjCMethodDecl* MethDerived,
        << "'.  These two types are incompatible, and may result in undefined "
           "behavior for clients of these classes.";
     
-    // Refactor.
-    SimpleBugType BT("incompatible instance method return type");
-    DiagCollector C(BT);
-    Diagnostic& Diag = BR.getDiagnostic();    
-    Diag.Report(&C, Ctx.getFullLoc(MethDerived->getLocStart()),
-                Diag.getCustomDiagID(Diagnostic::Warning, os.str().c_str()),
-                NULL, 0, NULL, 0);
-    
-    for (DiagCollector::iterator I = C.begin(), E = C.end(); I != E; ++I)
-      BR.EmitWarning(*I);
+    BR.EmitBasicReport("incompatible instance method return type",
+                       os.str().c_str(), MethDerived->getLocStart());
   }
 }