diff --git a/clang/Lex/IdentifierTable.cpp b/clang/Lex/IdentifierTable.cpp index 9a03d3f72d06..a5ba4d412ab0 100644 --- a/clang/Lex/IdentifierTable.cpp +++ b/clang/Lex/IdentifierTable.cpp @@ -33,36 +33,6 @@ tok::ObjCKeywordKind Token::getObjCKeywordID() const { return specId ? specId->getObjCKeywordID() : tok::objc_not_keyword; } -char *MultiKeywordSelector::getName(llvm::SmallVectorImpl &methodName) { - methodName[0] = '\0'; - keyword_iterator KeyIter = keyword_begin(); - for (unsigned int i = 0; i < NumArgs; i++) { - if (KeyIter[i]) { - unsigned KeyLen = strlen(KeyIter[i]->getName()); - methodName.append(KeyIter[i]->getName(), KeyIter[i]->getName()+KeyLen); - } - methodName.push_back(':'); - } - methodName.push_back('\0'); - return &methodName[0]; -} - -char *Selector::getName(llvm::SmallVectorImpl &methodName) { - methodName[0] = '\0'; - IdentifierInfo *II = getAsIdentifierInfo(); - if (II) { - unsigned NameLen = strlen(II->getName()); - methodName.append(II->getName(), II->getName()+NameLen); - if (getNumArgs() == 1) - methodName.push_back(':'); - methodName.push_back('\0'); - } else { // We have a multiple keyword selector (no embedded flags). - MultiKeywordSelector *SI = reinterpret_cast(InfoPtr); - SI->getName(methodName); - } - return &methodName[0]; -} - //===----------------------------------------------------------------------===// // IdentifierInfo Implementation //===----------------------------------------------------------------------===// diff --git a/clang/Parse/ParseObjc.cpp b/clang/Parse/ParseObjc.cpp index 3317b88da3e9..be0e026157b2 100644 --- a/clang/Parse/ParseObjc.cpp +++ b/clang/Parse/ParseObjc.cpp @@ -502,6 +502,58 @@ Parser::TypeTy *Parser::ParseObjCTypeName() { return Ty; } +unsigned Selector::getNumArgs() const { + unsigned IIF = getIdentifierInfoFlag(); + if (IIF == ZeroArg) + return 0; + if (IIF == OneArg) + return 1; + // We point to a MultiKeywordSelector (pointer doesn't contain any flags). + MultiKeywordSelector *SI = reinterpret_cast(InfoPtr); + return SI->getNumArgs(); +} + +IdentifierInfo *Selector::getIdentifierInfoForSlot(unsigned argIndex) { + IdentifierInfo *II = getAsIdentifierInfo(); + if (II) { + assert(((argIndex == 0) || (argIndex == 1)) && "illegal keyword index"); + return II; + } + // We point to a MultiKeywordSelector (pointer doesn't contain any flags). + MultiKeywordSelector *SI = reinterpret_cast(InfoPtr); + return SI->getIdentifierInfoForSlot(argIndex); +} + +char *MultiKeywordSelector::getName(llvm::SmallVectorImpl &methodName) { + methodName[0] = '\0'; + keyword_iterator KeyIter = keyword_begin(); + for (unsigned int i = 0; i < NumArgs; i++) { + if (KeyIter[i]) { + unsigned KeyLen = strlen(KeyIter[i]->getName()); + methodName.append(KeyIter[i]->getName(), KeyIter[i]->getName()+KeyLen); + } + methodName.push_back(':'); + } + methodName.push_back('\0'); + return &methodName[0]; +} + +char *Selector::getName(llvm::SmallVectorImpl &methodName) { + methodName[0] = '\0'; + IdentifierInfo *II = getAsIdentifierInfo(); + if (II) { + unsigned NameLen = strlen(II->getName()); + methodName.append(II->getName(), II->getName()+NameLen); + if (getNumArgs() == 1) + methodName.push_back(':'); + methodName.push_back('\0'); + } else { // We have a multiple keyword selector (no embedded flags). + MultiKeywordSelector *SI = reinterpret_cast(InfoPtr); + SI->getName(methodName); + } + return &methodName[0]; +} + Selector Parser::ObjcGetUnarySelector(IdentifierInfo *unarySel) { return Selector(unarySel, 0); diff --git a/clang/include/clang/Lex/IdentifierTable.h b/clang/include/clang/Lex/IdentifierTable.h index 100f940e0eb7..b98cd9517a09 100644 --- a/clang/include/clang/Lex/IdentifierTable.h +++ b/clang/include/clang/Lex/IdentifierTable.h @@ -171,8 +171,10 @@ private: }; /// MultiKeywordSelector - One of these variable length records is kept for each -/// parsed selector (similar in spirit to IdentifierInfo). We use a folding set -/// to unique aggregate names (keyword selectors in ObjC parlance). +/// selector containing more than one keyword. We use a folding set +/// to unique aggregate names (keyword selectors in ObjC parlance). Access to +/// this class is provided strictly through Selector. All methods are private. +/// The only reason it appears in this header is FoldingSet needs to see it:-( class MultiKeywordSelector : public llvm::FoldingSetNode { friend class Selector; // Only Selector can access me. friend class Parser; // Only Parser can instantiate me. @@ -206,7 +208,7 @@ class MultiKeywordSelector : public llvm::FoldingSetNode { assert((i < NumArgs) && "getIdentifierInfoForSlot(): illegal index"); return keyword_begin()[i]; } -public: + friend class llvm::FoldingSet; static void Profile(llvm::FoldingSetNodeID &ID, keyword_iterator ArgTys, unsigned NumArgs) { ID.AddInteger(NumArgs); @@ -248,11 +250,6 @@ class Selector { return reinterpret_cast(InfoPtr & ~ArgFlags); return 0; } - MultiKeywordSelector *getAsMultiKeywordSelector() const { - if (InfoPtr & ArgFlags) - return 0; - return reinterpret_cast(InfoPtr); - } public: unsigned getIdentifierInfoFlag() const { return InfoPtr & ArgFlags; @@ -274,26 +271,9 @@ public: bool isUnarySelector() const { return getIdentifierInfoFlag() == ZeroArg; } - unsigned getNumArgs() const { - unsigned IIF = getIdentifierInfoFlag(); - if (IIF == ZeroArg) - return 0; - if (IIF == OneArg) - return 1; - // We point to a MultiKeywordSelector (pointer doesn't contain any flags). - MultiKeywordSelector *SI = reinterpret_cast(InfoPtr); - return SI->getNumArgs(); - } - IdentifierInfo *getIdentifierInfoForSlot(unsigned argIndex) { - IdentifierInfo *II = getAsIdentifierInfo(); - if (II) { - assert(((argIndex == 0) || (argIndex == 1)) && "illegal keyword index"); - return II; - } - // We point to a MultiKeywordSelector (pointer doesn't contain any flags). - MultiKeywordSelector *SI = reinterpret_cast(InfoPtr); - return SI->getIdentifierInfoForSlot(argIndex); - } + unsigned getNumArgs() const; + IdentifierInfo *getIdentifierInfoForSlot(unsigned argIndex); + // Derive the full selector name, placing the result into methodBuffer. // As a convenience, a pointer to the first character is returned. // Example usage: llvm::SmallString<128> mbuf; Selector->getName(mbuf);