Add helper functions Token::isObjCAtKeyword() and Token::getObjCKeywordID().

Convert all clients to the new cleaner, more robust API.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41330 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Lex/IdentifierTable.cpp b/Lex/IdentifierTable.cpp
index c12fdef..d3faeb5 100644
--- a/Lex/IdentifierTable.cpp
+++ b/Lex/IdentifierTable.cpp
@@ -18,6 +18,22 @@
 using namespace clang;
 
 //===----------------------------------------------------------------------===//
+// Token Implementation
+//===----------------------------------------------------------------------===//
+
+/// isObjCAtKeyword - Return true if we have an ObjC keyword identifier. 
+bool Token::isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const {
+  return getKind() == tok::identifier && 
+         getIdentifierInfo()->getObjCKeywordID() == objcKey;
+}
+
+/// getObjCKeywordID - Return the ObjC keyword kind.
+tok::ObjCKeywordKind Token::getObjCKeywordID() const {
+  IdentifierInfo *specId = getIdentifierInfo();
+  return specId ? specId->getObjCKeywordID() : tok::objc_not_keyword;
+}
+
+//===----------------------------------------------------------------------===//
 // IdentifierInfo Implementation
 //===----------------------------------------------------------------------===//
 
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 3d30566..803d820 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -29,8 +29,7 @@
 Parser::DeclTy *Parser::ParseObjCAtDirectives() {
   SourceLocation AtLoc = ConsumeToken(); // the "@"
   
-  IdentifierInfo *II = Tok.getIdentifierInfo();
-  switch (II ? II->getObjCKeywordID() : tok::objc_not_keyword) {
+  switch (Tok.getObjCKeywordID()) {
     case tok::objc_class:
       return ParseObjCAtClassDeclaration(AtLoc);
     case tok::objc_interface:
@@ -111,8 +110,7 @@
 ///
 Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration(
   SourceLocation atLoc, AttributeList *attrList) {
-  assert((Tok.getKind() == tok::identifier &&
-          Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_interface) &&
+  assert(Tok.isObjCAtKeyword(tok::objc_interface) &&
          "ParseObjCAtInterfaceDeclaration(): Expected @interface");
   ConsumeToken(); // the "interface" identifier
   
@@ -151,8 +149,7 @@
     ParseObjCInterfaceDeclList(0/*FIXME*/);
 
     // The @ sign was already consumed by ParseObjCInterfaceDeclList().
-    if (Tok.getKind() == tok::identifier &&
-        Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_end) {
+    if (Tok.isObjCAtKeyword(tok::objc_end)) {
       ConsumeToken(); // the "end" identifier
       return 0;
     }
@@ -189,8 +186,7 @@
   ParseObjCInterfaceDeclList(0/*FIXME*/);
 
   // The @ sign was already consumed by ParseObjCInterfaceDeclList().
-  if (Tok.getKind() == tok::identifier &&
-      Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_end) {
+  if (Tok.isObjCAtKeyword(tok::objc_end)) {
     ConsumeToken(); // the "end" identifier
     return 0;
   }
@@ -214,7 +210,7 @@
   while (1) {
     if (Tok.getKind() == tok::at) {
       SourceLocation AtLoc = ConsumeToken(); // the "@"
-      tok::ObjCKeywordKind ocKind = Tok.getIdentifierInfo()->getObjCKeywordID();
+      tok::ObjCKeywordKind ocKind = Tok.getObjCKeywordID();
       
       if (ocKind == tok::objc_end) { // terminate list
         return;
@@ -488,13 +484,12 @@
     tok::ObjCKeywordKind visibility = tok::objc_private;
     if (Tok.getKind() == tok::at) { // parse objc-visibility-spec
       ConsumeToken(); // eat the @ sign
-      IdentifierInfo *specId = Tok.getIdentifierInfo();
-      switch (specId->getObjCKeywordID()) {
+      switch (Tok.getObjCKeywordID()) {
       case tok::objc_private:
       case tok::objc_public:
       case tok::objc_protected:
       case tok::objc_package:
-        visibility = specId->getObjCKeywordID();
+        visibility = Tok.getObjCKeywordID();
         ConsumeToken();
         continue; 
       default:
@@ -538,8 +533,7 @@
 ///   semicolon in the first alternative if objc-protocol-refs are omitted.
 
 Parser::DeclTy *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc) {
-  assert((Tok.getKind() == tok::identifier &&
-          Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_protocol) &&
+  assert(Tok.isObjCAtKeyword(tok::objc_protocol) &&
          "ParseObjCAtProtocolDeclaration(): Expected @protocol");
   ConsumeToken(); // the "protocol" identifier
   
@@ -586,8 +580,7 @@
   ParseObjCInterfaceDeclList(0/*FIXME*/);
 
   // The @ sign was already consumed by ParseObjCInterfaceDeclList().
-  if (Tok.getKind() == tok::identifier &&
-      Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_end) {
+  if (Tok.isObjCAtKeyword(tok::objc_end)) {
     ConsumeToken(); // the "end" identifier
     return 0;
   }
@@ -663,8 +656,7 @@
 ///    objc-encode-expression:
 ///      @encode ( type-name )
 Parser::ExprResult Parser::ParseObjCEncodeExpression() {
-  assert(Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_encode && 
-         "Not an @encode expression!");
+  assert(Tok.isObjCAtKeyword(tok::objc_encode) && "Not an @encode expression!");
   
   SourceLocation EncLoc = ConsumeToken();
   
diff --git a/include/clang/Lex/Token.h b/include/clang/Lex/Token.h
index f3d649b..f336370 100644
--- a/include/clang/Lex/Token.h
+++ b/include/clang/Lex/Token.h
@@ -105,7 +105,13 @@
   /// isExpandDisabled - Return true if this identifier token should never
   /// be expanded in the future, due to C99 6.10.3.4p2.
   bool isExpandDisabled() const { return Flags & DisableExpand; }
-    
+  
+  /// isObjCAtKeyword - Return true if we have an ObjC keyword identifier. 
+  bool isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const;
+  
+  /// getObjCKeywordID - Return the ObjC keyword kind.
+  tok::ObjCKeywordKind getObjCKeywordID() const;
+  
   /// needsCleaning - Return true if this token has trigraphs or escaped
   /// newlines in it.
   ///