diff --git a/src/shared/cplusplus/ObjectiveCTypeQualifiers.cpp b/src/shared/cplusplus/ObjectiveCTypeQualifiers.cpp new file mode 100644 index 00000000000..0bcff3202c9 --- /dev/null +++ b/src/shared/cplusplus/ObjectiveCTypeQualifiers.cpp @@ -0,0 +1,124 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception +** version 1.3, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ + +#include "ObjectiveCTypeQualifiers.h" + +CPLUSPLUS_BEGIN_NAMESPACE + +static inline int classify2(const char *s) { + if (s[0] == 'i') { + if (s[1] == 'n') { + return Token_in; + } + } + return Token_identifier; +} + +static inline int classify3(const char *s) { + if (s[0] == 'o') { + if (s[1] == 'u') { + if (s[2] == 't') { + return Token_out; + } + } + } + return Token_identifier; +} + +static inline int classify5(const char *s) { + if (s[0] == 'b') { + if (s[1] == 'y') { + if (s[2] == 'r') { + if (s[3] == 'e') { + if (s[4] == 'f') { + return Token_byref; + } + } + } + } + } + else if (s[0] == 'i') { + if (s[1] == 'n') { + if (s[2] == 'o') { + if (s[3] == 'u') { + if (s[4] == 't') { + return Token_inout; + } + } + } + } + } + return Token_identifier; +} + +static inline int classify6(const char *s) { + if (s[0] == 'b') { + if (s[1] == 'y') { + if (s[2] == 'c') { + if (s[3] == 'o') { + if (s[4] == 'p') { + if (s[5] == 'y') { + return Token_bycopy; + } + } + } + } + } + } + else if (s[0] == 'o') { + if (s[1] == 'n') { + if (s[2] == 'e') { + if (s[3] == 'w') { + if (s[4] == 'a') { + if (s[5] == 'y') { + return Token_oneway; + } + } + } + } + } + } + return Token_identifier; +} + +int classifyObjectiveCTypeQualifiers(const char *s, int n) { + switch (n) { + case 2: return classify2(s); + case 3: return classify3(s); + case 5: return classify5(s); + case 6: return classify6(s); + default: return Token_identifier; + } // switch +} + +CPLUSPLUS_END_NAMESPACE diff --git a/src/shared/cplusplus/ObjectiveCTypeQualifiers.h b/src/shared/cplusplus/ObjectiveCTypeQualifiers.h new file mode 100644 index 00000000000..5dd7a7609ba --- /dev/null +++ b/src/shared/cplusplus/ObjectiveCTypeQualifiers.h @@ -0,0 +1,56 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception +** version 1.3, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ +#ifndef CPLUSPLUS_OBJC_TYPEQUALIFIERS_H +#define CPLUSPLUS_OBJC_TYPEQUALIFIERS_H + +#include "CPlusPlusForwardDeclarations.h" + +CPLUSPLUS_BEGIN_HEADER +CPLUSPLUS_BEGIN_NAMESPACE + +enum { + Token_in, + Token_out, + Token_byref, + Token_inout, + Token_bycopy, + Token_oneway, + Token_identifier +}; + +CPLUSPLUS_EXPORT int classifyObjectiveCTypeQualifiers(const char *s, int n); + +CPLUSPLUS_END_NAMESPACE +CPLUSPLUS_END_HEADER + +#endif // CPLUSPLUS_OBJC_TYPEQUALIFIERS_H diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 5268ce9e321..6fb2da600d7 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -56,6 +56,7 @@ #include "Control.h" #include "AST.h" #include "Literals.h" +#include "ObjectiveCTypeQualifiers.h" #include #include #include @@ -4043,16 +4044,11 @@ bool Parser::parseObjCTypeQualifiers() return false; Identifier *id = tok().identifier; - if (! strcmp("in", id->chars()) || - ! strcmp("out", id->chars()) || - ! strcmp("inout", id->chars()) || - ! strcmp("bycopy", id->chars()) || - ! strcmp("byref", id->chars()) || - ! strcmp("oneway", id->chars())) { - consumeToken(); - return true; - } - return false; + const int k = classifyObjectiveCTypeQualifiers(id->chars(), id->size()); + if (k == Token_identifier) + return false; + consumeToken(); + return true; } // objc-end: T_AT_END diff --git a/src/shared/cplusplus/cplusplus.pri b/src/shared/cplusplus/cplusplus.pri index 041aff67be2..3a62ed6b7da 100644 --- a/src/shared/cplusplus/cplusplus.pri +++ b/src/shared/cplusplus/cplusplus.pri @@ -36,8 +36,8 @@ HEADERS += \ $$PWD/TranslationUnit.h \ $$PWD/Type.h \ $$PWD/TypeVisitor.h \ - $$PWD/PrettyPrinter.h - + $$PWD/PrettyPrinter.h \ + $$PWD/ObjectiveCTypeQualifiers.h SOURCES += \ $$PWD/AST.cpp \ @@ -55,6 +55,7 @@ SOURCES += \ $$PWD/FullySpecifiedType.cpp \ $$PWD/Keywords.cpp \ $$PWD/ObjectiveCAtKeywords.cpp \ + $$PWD/ObjectiveCTypeQualifiers.cpp \ $$PWD/Lexer.cpp \ $$PWD/LiteralTable.cpp \ $$PWD/Literals.cpp \