From: Steve Naroff Date: Thu, 23 Aug 2007 18:16:40 +0000 (+0000) Subject: Add helper functions Token::isObjCAtKeyword() and Token::getObjCKeywordID(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=861cf3effdc0fbc97d401539bc3050da76b2476f;p=clang 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 c12fdef203..d3faeb58db 100644 --- a/Lex/IdentifierTable.cpp +++ b/Lex/IdentifierTable.cpp @@ -17,6 +17,22 @@ #include "clang/Basic/LangOptions.h" 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 3d305668f5..803d820b21 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -29,8 +29,7 @@ using namespace clang; 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::ParseObjCAtClassDeclaration(SourceLocation atLoc) { /// 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 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration( 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 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration( 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 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl) { 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 @@ void Parser::ParseObjCClassInstanceVariables(DeclTy *interfaceDecl) { 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 @@ void Parser::ParseObjCClassInstanceVariables(DeclTy *interfaceDecl) { /// 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 @@ Parser::DeclTy *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc) { 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 @@ Parser::ExprResult Parser::ParseObjCStringLiteral() { /// 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 f3d649bb7e..f336370334 100644 --- a/include/clang/Lex/Token.h +++ b/include/clang/Lex/Token.h @@ -105,7 +105,13 @@ public: /// 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. ///