aboutsummaryrefslogtreecommitdiff
path: root/Parse/ParseObjc.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2007-09-28 23:39:26 +0000
committerSteve Naroff <snaroff@apple.com>2007-09-28 23:39:26 +0000
commit5b6b72f53ad164497cf62484b60cdbb4361f1978 (patch)
tree412a558e9a8e1e12633cc92d3eafdb7ad59be240 /Parse/ParseObjc.cpp
parenteb19188e668d0ad2c968fc0286a6922f9194deb4 (diff)
Add some comments to MultiKeywordSelector, make all methods private, add a friend, move some methods around.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42456 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Parse/ParseObjc.cpp')
-rw-r--r--Parse/ParseObjc.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 3317b88da3..be0e026157 100644
--- a/Parse/ParseObjc.cpp
+++ b/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<MultiKeywordSelector *>(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<MultiKeywordSelector *>(InfoPtr);
+ return SI->getIdentifierInfoForSlot(argIndex);
+}
+
+char *MultiKeywordSelector::getName(llvm::SmallVectorImpl<char> &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<char> &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<MultiKeywordSelector *>(InfoPtr);
+ SI->getName(methodName);
+ }
+ return &methodName[0];
+}
+
Selector Parser::ObjcGetUnarySelector(IdentifierInfo *unarySel)
{
return Selector(unarySel, 0);