]> granicus.if.org Git - clang/commitdiff
Refactoring of code to issue warning on implemented
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 15 Feb 2011 17:49:58 +0000 (17:49 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 15 Feb 2011 17:49:58 +0000 (17:49 +0000)
deprecated class and methods in objective-c.

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

lib/Sema/SemaDeclObjC.cpp

index 3aeb50b032d0dc8b9e7d62c8c57a155fcc50f6d6..865f22aec5381e7a6036829a3a5a347010c834c1 100644 (file)
 
 using namespace clang;
 
+static void DiagnoseObjCImplementedDeprecations(Sema &S,
+                                                NamedDecl *ND,
+                                                SourceLocation ImplLoc,
+                                                int select) {
+  
+  unsigned DIAG = diag::warn_depercated_def;
+  if (S.Diags.getDiagnosticLevel(DIAG, ImplLoc)== Diagnostic::Ignored)
+    return;
+  if (ND && ND->getAttr<DeprecatedAttr>()) {
+    S.Diag(ImplLoc, DIAG) << select;
+    if (select == 0)
+      S.Diag(ND->getLocation(), diag::note_method_declared_at);
+    else
+      S.Diag(ND->getLocation(), diag::note_previous_decl) << "class";
+  }
+}
+
 /// ActOnStartOfObjCMethodDef - This routine sets up parameters; invisible
 /// and user declared, in the method definition's AST.
 void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
@@ -66,19 +83,12 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
   }
   // Warn on implementating deprecated methods under 
   // -Wdeprecated-implementations flag.
-  // FIXME. Refactor using common routine.
-  unsigned DIAG = diag::warn_depercated_def;
-  if (Diags.getDiagnosticLevel(DIAG, MDecl->getLocation())
-      != Diagnostic::Ignored)
-    if (ObjCInterfaceDecl *IC = MDecl->getClassInterface()) {
-      if (ObjCMethodDecl *IMD = 
+  if (ObjCInterfaceDecl *IC = MDecl->getClassInterface())
+    if (ObjCMethodDecl *IMD = 
           IC->lookupMethod(MDecl->getSelector(), MDecl->isInstanceMethod()))
-        if (NamedDecl *ND = dyn_cast<NamedDecl>(IMD))
-          if (ND->getAttr<DeprecatedAttr>()) {
-            Diag(MDecl->getLocation(), DIAG) << 0;
-            Diag(IMD->getLocation(), diag::note_method_declared_at);
-          }
-    }
+      DiagnoseObjCImplementedDeprecations(*this, 
+                                          dyn_cast<NamedDecl>(IMD), 
+                                          MDecl->getLocation(), 0);
 }
 
 Decl *Sema::
@@ -556,16 +566,9 @@ Decl *Sema::ActOnStartCategoryImplementation(
       CatIDecl->setImplementation(CDecl);
       // Warn on implementating category of deprecated class under 
       // -Wdeprecated-implementations flag.
-      // FIXME. Refactor using common routine.
-      unsigned DIAG = diag::warn_depercated_def;
-      if (Diags.getDiagnosticLevel(DIAG, CDecl->getLocation())
-          != Diagnostic::Ignored)
-        if (NamedDecl *ND = dyn_cast<NamedDecl>(IDecl))
-          if (ND->getAttr<DeprecatedAttr>()) {
-            Diag(CDecl->getLocation(), DIAG) << 2;
-            Diag(IDecl->getLocation(), diag::note_previous_decl) << "class";
-          }
-
+      DiagnoseObjCImplementedDeprecations(*this, 
+                                          dyn_cast<NamedDecl>(IDecl), 
+                                          CDecl->getLocation(), 2);
     }
   }
 
@@ -677,15 +680,9 @@ Decl *Sema::ActOnStartClassImplementation(
     PushOnScopeChains(IMPDecl, TUScope);
     // Warn on implementating deprecated class under 
     // -Wdeprecated-implementations flag.
-    // FIXME. Refactor using common routine.
-    unsigned DIAG = diag::warn_depercated_def;
-    if (Diags.getDiagnosticLevel(DIAG, IMPDecl->getLocation())
-          != Diagnostic::Ignored)
-      if (NamedDecl *ND = dyn_cast<NamedDecl>(IDecl))
-        if (ND->getAttr<DeprecatedAttr>()) {
-          Diag(IMPDecl->getLocation(), DIAG) << 1;
-          Diag(IDecl->getLocation(), diag::note_previous_decl) << "class";
-       }
+    DiagnoseObjCImplementedDeprecations(*this, 
+                                        dyn_cast<NamedDecl>(IDecl), 
+                                        IMPDecl->getLocation(), 1);
   }
   return IMPDecl;
 }