From e4b8bafa3be9d5c20b220349d2ffa39a3085b947 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 14 Sep 2011 14:50:24 +0200 Subject: Fix automatic semicolon insertion. The parser should insert a T_SEMICOLON token when it reaches an error state and the lookahead token is following a closing brace. Change-Id: Ib849e7fbfe50c2a3e679ae0794f5780cc0b94de5 Reviewed-on: http://codereview.qt-project.org/4896 Reviewed-by: Qt Sanity Bot Reviewed-by: Kent Hansen --- src/declarative/qml/parser/qdeclarativejs.g | 10 +--------- src/declarative/qml/parser/qdeclarativejslexer.cpp | 18 ++++++++++++++++++ src/declarative/qml/parser/qdeclarativejslexer_p.h | 3 +++ src/declarative/qml/parser/qdeclarativejsparser.cpp | 10 +--------- 4 files changed, 23 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/declarative/qml/parser/qdeclarativejs.g b/src/declarative/qml/parser/qdeclarativejs.g index d30c697096..7f8e0b610c 100644 --- a/src/declarative/qml/parser/qdeclarativejs.g +++ b/src/declarative/qml/parser/qdeclarativejs.g @@ -407,14 +407,6 @@ void Parser::reallocateStack() string_stack = reinterpret_cast (qRealloc(string_stack, stack_size * sizeof(QStringRef))); } -inline static bool automatic(Engine *driver, int token) -{ - return token == $table::T_RBRACE - || token == 0 - || driver->lexer()->prevTerminator(); -} - - Parser::Parser(Engine *engine): driver(engine), pool(engine->pool()), @@ -2890,7 +2882,7 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ; const int errorState = state_stack[tos]; // automatic insertion of `;' - if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && automatic(driver, yytoken)) { + if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && lexer->canInsertAutomaticSemicolon(yytoken)) { SavedToken &tk = token_buffer[0]; tk.token = yytoken; tk.dval = yylval; diff --git a/src/declarative/qml/parser/qdeclarativejslexer.cpp b/src/declarative/qml/parser/qdeclarativejslexer.cpp index def027c1f8..dd74ffa004 100644 --- a/src/declarative/qml/parser/qdeclarativejslexer.cpp +++ b/src/declarative/qml/parser/qdeclarativejslexer.cpp @@ -111,6 +111,7 @@ Lexer::Lexer(Engine *engine) , _prohibitAutomaticSemicolon(false) , _restrictedKeyword(false) , _terminator(false) + , _followsClosingBrace(false) , _delimited(false) , _qmlMode(true) { @@ -160,6 +161,7 @@ void Lexer::setCode(const QString &code, int lineno, bool qmlMode) _prohibitAutomaticSemicolon = false; _restrictedKeyword = false; _terminator = false; + _followsClosingBrace = false; _delimited = false; } @@ -175,12 +177,15 @@ void Lexer::scanChar() int Lexer::lex() { + const int previousTokenKind = _tokenKind; + _tokenSpell = QStringRef(); _tokenKind = scanToken(); _tokenLength = _codePtr - _tokenStartPtr - 1; _delimited = false; _restrictedKeyword = false; + _followsClosingBrace = (previousTokenKind == T_RBRACE); // update the flags switch (_tokenKind) { @@ -1044,4 +1049,17 @@ bool Lexer::prevTerminator() const return _terminator; } +bool Lexer::followsClosingBrace() const +{ + return _followsClosingBrace; +} + +bool Lexer::canInsertAutomaticSemicolon(int token) const +{ + return token == T_RBRACE + || token == EOF_SYMBOL + || _terminator + || _followsClosingBrace; +} + #include "qdeclarativejskeywords_p.h" diff --git a/src/declarative/qml/parser/qdeclarativejslexer_p.h b/src/declarative/qml/parser/qdeclarativejslexer_p.h index 34cd9873ae..6d327868ca 100644 --- a/src/declarative/qml/parser/qdeclarativejslexer_p.h +++ b/src/declarative/qml/parser/qdeclarativejslexer_p.h @@ -144,6 +144,8 @@ public: QString errorMessage() const; bool prevTerminator() const; + bool followsClosingBrace() const; + bool canInsertAutomaticSemicolon(int token) const; enum ParenthesesState { IgnoreParentheses, @@ -201,6 +203,7 @@ private: bool _prohibitAutomaticSemicolon; bool _restrictedKeyword; bool _terminator; + bool _followsClosingBrace; bool _delimited; bool _qmlMode; }; diff --git a/src/declarative/qml/parser/qdeclarativejsparser.cpp b/src/declarative/qml/parser/qdeclarativejsparser.cpp index 5c82359072..b6cb1fade6 100644 --- a/src/declarative/qml/parser/qdeclarativejsparser.cpp +++ b/src/declarative/qml/parser/qdeclarativejsparser.cpp @@ -76,14 +76,6 @@ void Parser::reallocateStack() string_stack = reinterpret_cast (qRealloc(string_stack, stack_size * sizeof(QStringRef))); } -inline static bool automatic(Engine *driver, int token) -{ - return token == QDeclarativeJSGrammar::T_RBRACE - || token == 0 - || driver->lexer()->prevTerminator(); -} - - Parser::Parser(Engine *engine): driver(engine), pool(engine->pool()), @@ -1696,7 +1688,7 @@ case 342: { const int errorState = state_stack[tos]; // automatic insertion of `;' - if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && automatic(driver, yytoken)) { + if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && lexer->canInsertAutomaticSemicolon(yytoken)) { SavedToken &tk = token_buffer[0]; tk.token = yytoken; tk.dval = yylval; -- cgit v1.2.3