From: Ted Kremenek Date: Sat, 7 Mar 2009 01:36:13 +0000 (+0000) Subject: Teach Diagnostic about Selector. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b9eb3afc9eafbb1c6815c8b63633065f370be6a5;p=clang Teach Diagnostic about Selector. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66314 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index 1bb294e7a4..9dfcf3fe75 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_DIAGNOSTIC_H #include "clang/Basic/SourceLocation.h" +#include "clang/Basic/IdentifierTable.h" #include #include @@ -26,7 +27,6 @@ namespace clang { class DiagnosticClient; class SourceRange; class DiagnosticBuilder; - class IdentifierInfo; // Import the diagnostic enums themselves. namespace diag { @@ -142,7 +142,8 @@ public: ak_identifierinfo, // IdentifierInfo ak_qualtype, // QualType ak_declarationname, // DeclarationName - ak_nameddecl // NamedDecl * + ak_nameddecl, // NamedDecl * + ak_selector // Selector }; private: @@ -483,6 +484,13 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, return DB; } +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, + Selector S) { + DB.AddTaggedVal(reinterpret_cast(S.getAsOpaquePtr()), + Diagnostic::ak_selector); + return DB; +} + inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, const SourceRange &R) { DB.AddSourceRange(R); @@ -566,6 +574,12 @@ public: return reinterpret_cast(DiagObj->DiagArgumentsVal[Idx]); } + /// getArgSelector - Return the specified Selector argument. + Selector getArgSelector(unsigned Idx) const { + assert(getArgKind(Idx) == Diagnostic::ak_selector && + "invalid argument accessor!"); + return Selector(DiagObj->DiagArgumentsVal[Idx]); + } /// getRawArg - Return the specified non-string argument in an opaque form. intptr_t getRawArg(unsigned Idx) const { assert(getArgKind(Idx) != Diagnostic::ak_std_string && diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h index 2584136ec4..b6cee028f4 100644 --- a/include/clang/Basic/IdentifierTable.h +++ b/include/clang/Basic/IdentifierTable.h @@ -334,6 +334,8 @@ private: /// selectors that take no arguments and selectors that take 1 argument, which /// accounts for 78% of all selectors in Cocoa.h. class Selector { + friend class DiagnosticInfo; + enum IdentifierInfoFlag { // MultiKeywordSelector = 0. ZeroArg = 0x1, diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 893eae5d1a..84d4055b78 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -657,6 +657,14 @@ FormatDiagnostic(llvm::SmallVectorImpl &OutStr) const { OutStr.push_back('\''); break; } + case Diagnostic::ak_selector: { + Selector S = getArgSelector(ArgNo); + OutStr.push_back('\''); + const std::string &s = S.getAsString(); + OutStr.append(&s[0], &s[0]+s.length()); + OutStr.push_back('\''); + break; + } case Diagnostic::ak_qualtype: case Diagnostic::ak_declarationname: case Diagnostic::ak_nameddecl: diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index f91feb423f..a26581824f 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1139,7 +1139,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property, Diag(property->getLocation(), diag::err_accessor_property_type_mismatch) << property->getDeclName() - << GetterMethod->getSelector().getAsString(); + << GetterMethod->getSelector(); Diag(GetterMethod->getLocation(), diag::note_declared_at); } @@ -1152,7 +1152,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property, Diag(property->getLocation(), diag::err_accessor_property_type_mismatch) << property->getDeclName() - << SetterMethod->getSelector().getAsString(); + << SetterMethod->getSelector(); Diag(SetterMethod->getLocation(), diag::note_declared_at); } }