summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Lexer.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-02-15 12:23:48 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-02-15 12:24:31 +0100
commit8de6ccc7755d855f23b2f05f5094490832a8ab32 (patch)
treed5f49c3172f8c77d297fce0102cc729bf7e4d5b7 /src/shared/cplusplus/Lexer.cpp
parenta0071f1ce968a3c01d034227f0c01042447dfb43 (diff)
downloadqt-creator-8de6ccc7755d855f23b2f05f5094490832a8ab32.tar.gz
Revert "Split Objective-C keyword parsing to handle the '@' separately."
This reverts commit 2a59d2ae0c889fe6e4ac50a3f110b0103f880c15.
Diffstat (limited to 'src/shared/cplusplus/Lexer.cpp')
-rw-r--r--src/shared/cplusplus/Lexer.cpp62
1 files changed, 48 insertions, 14 deletions
diff --git a/src/shared/cplusplus/Lexer.cpp b/src/shared/cplusplus/Lexer.cpp
index f8cc188238..9a71ccfa7e 100644
--- a/src/shared/cplusplus/Lexer.cpp
+++ b/src/shared/cplusplus/Lexer.cpp
@@ -596,11 +596,52 @@ void Lexer::scan_helper(Token *tok)
tok->f.kind = T_COMMA;
break;
- case '@':
- tok->f.kind = T_AT;
- break;
-
default: {
+ if (f._objCEnabled) {
+ if (ch == '@' && _yychar >= 'a' && _yychar <= 'z') {
+ const char *yytext = _currentChar;
+
+ do {
+ yyinp();
+ if (! (isalnum(_yychar) || _yychar == '_' || _yychar == '$'))
+ break;
+ } while (_yychar);
+
+ const int yylen = _currentChar - yytext;
+ tok->f.kind = classifyObjCAtKeyword(yytext, yylen);
+ break;
+ } else if (ch == '@' && _yychar == '"') {
+ // objc @string literals
+ ch = _yychar;
+ yyinp();
+ tok->f.kind = T_AT_STRING_LITERAL;
+
+ const char *yytext = _currentChar;
+
+ while (_yychar && _yychar != '"') {
+ if (_yychar != '\\')
+ yyinp();
+ else {
+ yyinp(); // skip `\\'
+
+ if (_yychar)
+ yyinp();
+ }
+ }
+ // assert(_yychar == '"');
+
+ int yylen = _currentChar - yytext;
+
+ if (_yychar == '"')
+ yyinp();
+
+ if (control())
+ tok->string = control()->findOrInsertStringLiteral(yytext, yylen);
+
+ break;
+ }
+ }
+
if (ch == 'L' && (_yychar == '"' || _yychar == '\'')) {
// wide char/string literals
ch = _yychar;
@@ -638,18 +679,11 @@ void Lexer::scan_helper(Token *tok)
while (std::isalnum(_yychar) || _yychar == '_' || _yychar == '$')
yyinp();
int yylen = _currentChar - yytext;
- if (f._scanKeywords) {
+ if (f._scanKeywords)
tok->f.kind = classify(yytext, yylen, f._qtMocRunEnabled);
- } else {
+ else
tok->f.kind = T_IDENTIFIER;
- }
- // ### is this correct w.r.t. the _scanKeywords?
- if (f._objCEnabled && tok->f.kind == T_IDENTIFIER) {
- tok->f.kind = classifyObjCAtKeyword(yytext, yylen);
- if (tok->f.kind == T_ERROR)
- tok->f.kind = T_IDENTIFIER;
- }
- // ### is this correct w.r.t. the _scanKeywords?
+
if (tok->f.kind == T_IDENTIFIER) {
tok->f.kind = classifyOperator(yytext, yylen);