diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2011-02-15 17:49:58 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-02-15 17:49:58 +0000 |
commit | 5ac96d5f54a94d57f485de8103eb05a0f19e1c39 (patch) | |
tree | bf8f02cfe41de082b21b5831a67342a4a03b5f95 /lib/Sema/SemaDeclObjC.cpp | |
parent | 6cd370cc314a57c406920084170c4f353048c416 (diff) |
Refactoring of code to issue warning on implemented
deprecated class and methods in objective-c.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125573 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclObjC.cpp')
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 3aeb50b032..865f22aec5 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -24,6 +24,23 @@ 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; } |