From d7ffaa8ccbf881d25004b9a710259701d1a8c9bc Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Mon, 27 Apr 2009 15:45:31 +0200 Subject: Introduced Node::firstSourceLocation(), Node::lastSourceLocation(). --- src/declarative/qml/parser/javascript.g | 27 +- src/declarative/qml/parser/javascriptast.cpp | 8 + src/declarative/qml/parser/javascriptast_p.h | 459 ++++++++++++++++++--- src/declarative/qml/parser/javascriptastfwd_p.h | 1 + .../qml/parser/javascriptastvisitor_p.h | 3 + src/declarative/qml/parser/javascriptgrammar.cpp | 36 +- src/declarative/qml/parser/javascriptgrammar_p.h | 36 +- src/declarative/qml/parser/javascriptparser.cpp | 26 +- src/declarative/qml/parser/javascriptparser_p.h | 1 + src/declarative/qml/qmlscriptparser.cpp | 83 ++-- 10 files changed, 572 insertions(+), 108 deletions(-) diff --git a/src/declarative/qml/parser/javascript.g b/src/declarative/qml/parser/javascript.g index 0712828..961041e 100644 --- a/src/declarative/qml/parser/javascript.g +++ b/src/declarative/qml/parser/javascript.g @@ -240,6 +240,7 @@ public: JavaScript::AST::SourceElements *SourceElements; JavaScript::AST::Statement *Statement; JavaScript::AST::StatementList *StatementList; + JavaScript::AST::Block *Block; JavaScript::AST::VariableDeclaration *VariableDeclaration; JavaScript::AST::VariableDeclarationList *VariableDeclarationList; @@ -818,24 +819,36 @@ case $rule_number: { PrimaryExpression: T_LBRACE PropertyNameAndValueListOpt T_RBRACE ; /. case $rule_number: { + AST::ObjectLiteral *node = 0; if (sym(2).Node) - sym(1).Node = makeAstNode (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ()); + node = makeAstNode (driver->nodePool(), + sym(2).PropertyNameAndValueList->finish ()); else - sym(1).Node = makeAstNode (driver->nodePool()); + node = makeAstNode (driver->nodePool()); + node->lbraceToken = loc(1); + node->lbraceToken = loc(3); + sym(1).Node = node; } break; ./ PrimaryExpression: T_LBRACE PropertyNameAndValueList T_COMMA T_RBRACE ; /. case $rule_number: { - sym(1).Node = makeAstNode (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ()); + AST::ObjectLiteral *node = makeAstNode (driver->nodePool(), + sym(2).PropertyNameAndValueList->finish ()); + node->lbraceToken = loc(1); + node->lbraceToken = loc(4); + sym(1).Node = node; } break; ./ PrimaryExpression: T_LPAREN Expression T_RPAREN ; /. case $rule_number: { - sym(1) = sym(2); + AST::NestedExpression *node = makeAstNode(driver->nodePool(), sym(2).Expression); + node->lparenToken = loc(1); + node->rparenToken = loc(3); + sym(1).Node = node; } break; ./ @@ -2360,7 +2373,7 @@ case $rule_number: { Catch: T_CATCH T_LPAREN T_IDENTIFIER T_RPAREN Block ; /. case $rule_number: { - AST::Catch *node = makeAstNode (driver->nodePool(), sym(3).sval, sym(5).Statement); + AST::Catch *node = makeAstNode (driver->nodePool(), sym(3).sval, sym(5).Block); node->catchToken = loc(1); node->lparenToken = loc(2); node->identifierToken = loc(3); @@ -2372,7 +2385,7 @@ case $rule_number: { Finally: T_FINALLY Block ; /. case $rule_number: { - AST::Finally *node = makeAstNode (driver->nodePool(), sym(2).Statement); + AST::Finally *node = makeAstNode (driver->nodePool(), sym(2).Block); node->finallyToken = loc(1); sym(1).Node = node; } break; @@ -2537,6 +2550,8 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ; tk.dval = yylval; tk.loc = yylloc; + yylloc.length = 0; + const QString msg = QString::fromUtf8("Missing `;'"); diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, diff --git a/src/declarative/qml/parser/javascriptast.cpp b/src/declarative/qml/parser/javascriptast.cpp index f9ef71d..8a10650 100644 --- a/src/declarative/qml/parser/javascriptast.cpp +++ b/src/declarative/qml/parser/javascriptast.cpp @@ -79,6 +79,14 @@ Statement *Statement::statementCast() return this; } +void NestedExpression::accept0(Visitor *visitor) +{ + if (visitor->visit(this)) { + acceptChild(expression, visitor); + } + visitor->endVisit(this); +} + void ThisExpression::accept0(Visitor *visitor) { if (visitor->visit(this)) { diff --git a/src/declarative/qml/parser/javascriptast_p.h b/src/declarative/qml/parser/javascriptast_p.h index 267a697..69958e5 100644 --- a/src/declarative/qml/parser/javascriptast_p.h +++ b/src/declarative/qml/parser/javascriptast_p.h @@ -217,6 +217,7 @@ public: Kind_VoidExpression, Kind_WhileStatement, Kind_WithStatement, + Kind_NestedExpression, Kind_UiArrayBinding, Kind_UiImport, @@ -268,6 +269,9 @@ public: virtual ~ExpressionNode() {} virtual ExpressionNode *expressionCast(); + + virtual SourceLocation firstSourceLocation() const = 0; + virtual SourceLocation lastSourceLocation() const = 0; }; class Statement: public Node @@ -277,6 +281,32 @@ public: virtual ~Statement() {} virtual Statement *statementCast(); + + virtual SourceLocation firstSourceLocation() const = 0; + virtual SourceLocation lastSourceLocation() const = 0; +}; + +class NestedExpression: public ExpressionNode +{ +public: + JAVASCRIPT_DECLARE_AST_NODE(NestedExpression) + + NestedExpression(ExpressionNode *expression) + : expression(expression) + { kind = K; } + + virtual void accept0(Visitor *visitor); + + virtual SourceLocation firstSourceLocation() const + { return lparenToken; } + + virtual SourceLocation lastSourceLocation() const + { return rparenToken; } + +// attributes + ExpressionNode *expression; + SourceLocation lparenToken; + SourceLocation rparenToken; }; class ThisExpression: public ExpressionNode @@ -289,6 +319,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return thisToken; } + + virtual SourceLocation lastSourceLocation() const + { return thisToken; } + // attributes SourceLocation thisToken; }; @@ -305,6 +341,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return identifierToken; } + + virtual SourceLocation lastSourceLocation() const + { return identifierToken; } + // attributes JavaScriptNameIdImpl *name; SourceLocation identifierToken; @@ -320,6 +362,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return nullToken; } + + virtual SourceLocation lastSourceLocation() const + { return nullToken; } + // attributes SourceLocation nullToken; }; @@ -334,6 +382,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return trueToken; } + + virtual SourceLocation lastSourceLocation() const + { return trueToken; } + // attributes SourceLocation trueToken; }; @@ -348,6 +402,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return falseToken; } + + virtual SourceLocation lastSourceLocation() const + { return falseToken; } + // attributes SourceLocation falseToken; }; @@ -363,6 +423,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return literalToken; } + + virtual SourceLocation lastSourceLocation() const + { return literalToken; } + // attributes: double value; SourceLocation literalToken; @@ -380,6 +446,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return literalToken; } + + virtual SourceLocation lastSourceLocation() const + { return literalToken; } + // attributes: JavaScriptNameIdImpl *value; SourceLocation literalToken; @@ -397,6 +469,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return literalToken; } + + virtual SourceLocation lastSourceLocation() const + { return literalToken; } + // attributes: JavaScriptNameIdImpl *pattern; int flags; @@ -424,6 +502,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return lbracketToken; } + + virtual SourceLocation lastSourceLocation() const + { return rbracketToken; } + // attributes ElementList *elements; Elision *elision; @@ -447,8 +531,16 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return lbraceToken; } + + virtual SourceLocation lastSourceLocation() const + { return rbraceToken; } + // attributes PropertyNameAndValueList *properties; + SourceLocation lbraceToken; + SourceLocation rbraceToken; }; class ElementList: public Node @@ -624,6 +716,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return base->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return rbracketToken; } + // attributes ExpressionNode *base; ExpressionNode *expression; @@ -644,7 +742,13 @@ public: virtual void accept0(Visitor *visitor); -// attributes + virtual SourceLocation firstSourceLocation() const + { return base->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return identifierToken; } + + // attributes ExpressionNode *base; JavaScriptNameIdImpl *name; SourceLocation dotToken; @@ -664,7 +768,13 @@ public: virtual void accept0(Visitor *visitor); -// attributes + virtual SourceLocation firstSourceLocation() const + { return newToken; } + + virtual SourceLocation lastSourceLocation() const + { return rparenToken; } + + // attributes ExpressionNode *base; ArgumentList *arguments; SourceLocation newToken; @@ -684,6 +794,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return newToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation newToken; @@ -702,6 +818,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return base->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return rparenToken; } + // attributes ExpressionNode *base; ArgumentList *arguments; @@ -755,6 +877,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return base->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return incrementToken; } + // attributes ExpressionNode *base; SourceLocation incrementToken; @@ -772,6 +900,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return base->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return decrementToken; } + // attributes ExpressionNode *base; SourceLocation decrementToken; @@ -788,6 +922,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return deleteToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation deleteToken; @@ -805,6 +945,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return voidToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation voidToken; @@ -822,6 +968,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return typeofToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation typeofToken; @@ -839,6 +991,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return incrementToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation incrementToken; @@ -856,6 +1014,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return decrementToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation decrementToken; @@ -873,6 +1037,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return plusToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation plusToken; @@ -890,6 +1060,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return minusToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation minusToken; @@ -907,6 +1083,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return tildeToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation tildeToken; @@ -924,6 +1106,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return notToken; } + + virtual SourceLocation lastSourceLocation() const + { return expression->lastSourceLocation(); } + // attributes ExpressionNode *expression; SourceLocation notToken; @@ -944,6 +1132,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return left->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return right->lastSourceLocation(); } + // attributes ExpressionNode *left; int op; @@ -964,6 +1158,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return expression->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return ko->lastSourceLocation(); } + // attributes ExpressionNode *expression; ExpressionNode *ok; @@ -984,6 +1184,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return left->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return right->lastSourceLocation(); } + // attributes ExpressionNode *left; ExpressionNode *right; @@ -1002,7 +1208,13 @@ public: virtual void accept0(Visitor *visitor); -// attributes + virtual SourceLocation firstSourceLocation() const + { return lbraceToken; } + + virtual SourceLocation lastSourceLocation() const + { return rbraceToken; } + + // attributes StatementList *statements; SourceLocation lbraceToken; SourceLocation rbraceToken; @@ -1054,6 +1266,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return declarationKindToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + // attributes VariableDeclarationList *declarations; SourceLocation declarationKindToken; @@ -1129,6 +1347,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return semicolonToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + // attributes SourceLocation semicolonToken; }; @@ -1145,6 +1369,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return expression->firstSourceLocation(); } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + // attributes ExpressionNode *expression; SourceLocation semicolonToken; @@ -1163,6 +1393,17 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return ifToken; } + + virtual SourceLocation lastSourceLocation() const + { + if (ko) + return ko->lastSourceLocation(); + + return ok->lastSourceLocation(); + } + // attributes ExpressionNode *expression; Statement *ok; @@ -1186,6 +1427,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return doToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + // attributes Statement *statement; ExpressionNode *expression; @@ -1209,6 +1456,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return whileToken; } + + virtual SourceLocation lastSourceLocation() const + { return statement->lastSourceLocation(); } + // attributes ExpressionNode *expression; Statement *statement; @@ -1230,6 +1483,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return forToken; } + + virtual SourceLocation lastSourceLocation() const + { return statement->lastSourceLocation(); } + // attributes ExpressionNode *initialiser; ExpressionNode *condition; @@ -1255,6 +1514,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return forToken; } + + virtual SourceLocation lastSourceLocation() const + { return statement->lastSourceLocation(); } + // attributes VariableDeclarationList *declarations; ExpressionNode *condition; @@ -1281,6 +1546,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return forToken; } + + virtual SourceLocation lastSourceLocation() const + { return statement->lastSourceLocation(); } + // attributes ExpressionNode *initialiser; ExpressionNode *expression; @@ -1304,6 +1575,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return forToken; } + + virtual SourceLocation lastSourceLocation() const + { return statement->lastSourceLocation(); } + // attributes VariableDeclaration *declaration; ExpressionNode *expression; @@ -1327,6 +1604,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return continueToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + // attributes JavaScriptNameIdImpl *label; SourceLocation continueToken; @@ -1346,7 +1629,13 @@ public: virtual void accept0(Visitor *visitor); -// attributes + virtual SourceLocation firstSourceLocation() const + { return breakToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + + // attributes JavaScriptNameIdImpl *label; SourceLocation breakToken; SourceLocation identifierToken; @@ -1365,6 +1654,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return returnToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + // attributes ExpressionNode *expression; SourceLocation returnToken; @@ -1384,6 +1679,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return withToken; } + + virtual SourceLocation lastSourceLocation() const + { return statement->lastSourceLocation(); } + // attributes ExpressionNode *expression; Statement *statement; @@ -1392,46 +1693,52 @@ public: SourceLocation rparenToken; }; -class SwitchStatement: public Statement +class CaseBlock: public Node { public: - JAVASCRIPT_DECLARE_AST_NODE(SwitchStatement) + JAVASCRIPT_DECLARE_AST_NODE(CaseBlock) - SwitchStatement(ExpressionNode *e, CaseBlock *b): - expression (e), block (b) + CaseBlock(CaseClauses *c, DefaultClause *d = 0, CaseClauses *r = 0): + clauses (c), defaultClause (d), moreClauses (r) { kind = K; } - virtual ~SwitchStatement() {} + virtual ~CaseBlock() {} virtual void accept0(Visitor *visitor); // attributes - ExpressionNode *expression; - CaseBlock *block; - SourceLocation switchToken; - SourceLocation lparenToken; - SourceLocation rparenToken; + CaseClauses *clauses; + DefaultClause *defaultClause; + CaseClauses *moreClauses; + SourceLocation lbraceToken; + SourceLocation rbraceToken; }; -class CaseBlock: public Node +class SwitchStatement: public Statement { public: - JAVASCRIPT_DECLARE_AST_NODE(CaseBlock) + JAVASCRIPT_DECLARE_AST_NODE(SwitchStatement) - CaseBlock(CaseClauses *c, DefaultClause *d = 0, CaseClauses *r = 0): - clauses (c), defaultClause (d), moreClauses (r) + SwitchStatement(ExpressionNode *e, CaseBlock *b): + expression (e), block (b) { kind = K; } - virtual ~CaseBlock() {} + virtual ~SwitchStatement() {} virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return switchToken; } + + virtual SourceLocation lastSourceLocation() const + { return block->rbraceToken; } + // attributes - CaseClauses *clauses; - DefaultClause *defaultClause; - CaseClauses *moreClauses; - SourceLocation lbraceToken; - SourceLocation rbraceToken; + ExpressionNode *expression; + CaseBlock *block; + SourceLocation switchToken; + SourceLocation lparenToken; + SourceLocation rparenToken; }; class CaseClauses: public Node @@ -1519,12 +1826,17 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return identifierToken; } + + virtual SourceLocation lastSourceLocation() const + { return statement->lastSourceLocation(); } + // attributes JavaScriptNameIdImpl *label; Statement *statement; SourceLocation identifierToken; SourceLocation colonToken; - SourceLocation semicolonToken; }; class ThrowStatement: public Statement @@ -1539,46 +1851,24 @@ public: virtual void accept0(Visitor *visitor); -// attributes + virtual SourceLocation firstSourceLocation() const + { return throwToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + + // attributes ExpressionNode *expression; SourceLocation throwToken; SourceLocation semicolonToken; }; -class TryStatement: public Statement -{ -public: - JAVASCRIPT_DECLARE_AST_NODE(TryStatement) - - TryStatement(Statement *stmt, Catch *c, Finally *f): - statement (stmt), catchExpression (c), finallyExpression (f) - { kind = K; } - - TryStatement(Statement *stmt, Finally *f): - statement (stmt), catchExpression (0), finallyExpression (f) - { kind = K; } - - TryStatement(Statement *stmt, Catch *c): - statement (stmt), catchExpression (c), finallyExpression (0) - { kind = K; } - - virtual ~TryStatement() {} - - virtual void accept0(Visitor *visitor); - -// attributes - Statement *statement; - Catch *catchExpression; - Finally *finallyExpression; - SourceLocation tryToken; -}; - class Catch: public Node { public: JAVASCRIPT_DECLARE_AST_NODE(Catch) - Catch(JavaScriptNameIdImpl *n, Statement *stmt): + Catch(JavaScriptNameIdImpl *n, Block *stmt): name (n), statement (stmt) { kind = K; } @@ -1588,7 +1878,7 @@ public: // attributes JavaScriptNameIdImpl *name; - Statement *statement; + Block *statement; SourceLocation catchToken; SourceLocation lparenToken; SourceLocation identifierToken; @@ -1600,7 +1890,7 @@ class Finally: public Node public: JAVASCRIPT_DECLARE_AST_NODE(Finally) - Finally(Statement *stmt): + Finally(Block *stmt): statement (stmt) { kind = K; } @@ -1609,10 +1899,51 @@ public: virtual void accept0(Visitor *visitor); // attributes - Statement *statement; + Block *statement; SourceLocation finallyToken; }; +class TryStatement: public Statement +{ +public: + JAVASCRIPT_DECLARE_AST_NODE(TryStatement) + + TryStatement(Statement *stmt, Catch *c, Finally *f): + statement (stmt), catchExpression (c), finallyExpression (f) + { kind = K; } + + TryStatement(Statement *stmt, Finally *f): + statement (stmt), catchExpression (0), finallyExpression (f) + { kind = K; } + + TryStatement(Statement *stmt, Catch *c): + statement (stmt), catchExpression (c), finallyExpression (0) + { kind = K; } + + virtual ~TryStatement() {} + + virtual void accept0(Visitor *visitor); + + virtual SourceLocation firstSourceLocation() const + { return tryToken; } + + virtual SourceLocation lastSourceLocation() const + { + if (finallyExpression) + return finallyExpression->statement->rbraceToken; + else if (catchExpression) + return catchExpression->statement->rbraceToken; + + return statement->lastSourceLocation(); + } + +// attributes + Statement *statement; + Catch *catchExpression; + Finally *finallyExpression; + SourceLocation tryToken; +}; + class FunctionExpression: public ExpressionNode { public: @@ -1626,6 +1957,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return functionToken; } + + virtual SourceLocation lastSourceLocation() const + { return rbraceToken; } + // attributes JavaScriptNameIdImpl *name; FormalParameterList *formals; @@ -1811,6 +2148,12 @@ public: virtual void accept0(Visitor *visitor); + virtual SourceLocation firstSourceLocation() const + { return debuggerToken; } + + virtual SourceLocation lastSourceLocation() const + { return semicolonToken; } + // attributes SourceLocation debuggerToken; SourceLocation semicolonToken; diff --git a/src/declarative/qml/parser/javascriptastfwd_p.h b/src/declarative/qml/parser/javascriptastfwd_p.h index e3951ed..858e393 100644 --- a/src/declarative/qml/parser/javascriptastfwd_p.h +++ b/src/declarative/qml/parser/javascriptastfwd_p.h @@ -140,6 +140,7 @@ class SourceElement; class FunctionSourceElement; class StatementSourceElement; class DebuggerStatement; +class NestedExpression; // ui elements class UiProgram; diff --git a/src/declarative/qml/parser/javascriptastvisitor_p.h b/src/declarative/qml/parser/javascriptastvisitor_p.h index e5f1427..81df364 100644 --- a/src/declarative/qml/parser/javascriptastvisitor_p.h +++ b/src/declarative/qml/parser/javascriptastvisitor_p.h @@ -135,6 +135,9 @@ public: virtual bool visit(PropertyNameAndValueList *) { return true; } virtual void endVisit(PropertyNameAndValueList *) {} + virtual bool visit(NestedExpression *) { return true; } + virtual void endVisit(NestedExpression *) {} + virtual bool visit(IdentifierPropertyName *) { return true; } virtual void endVisit(IdentifierPropertyName *) {} diff --git a/src/declarative/qml/parser/javascriptgrammar.cpp b/src/declarative/qml/parser/javascriptgrammar.cpp index dfa0c69..b06fd32 100644 --- a/src/declarative/qml/parser/javascriptgrammar.cpp +++ b/src/declarative/qml/parser/javascriptgrammar.cpp @@ -2,13 +2,41 @@ /**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the $MODULE$ of the Qt Toolkit. +** This file is part of the QtCore module of the Qt Toolkit. ** -** $TROLLTECH_DUAL_LICENSE$ +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 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 the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/declarative/qml/parser/javascriptgrammar_p.h b/src/declarative/qml/parser/javascriptgrammar_p.h index 4792cec..490acb2 100644 --- a/src/declarative/qml/parser/javascriptgrammar_p.h +++ b/src/declarative/qml/parser/javascriptgrammar_p.h @@ -2,13 +2,41 @@ /**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the $MODULE$ of the Qt Toolkit. +** This file is part of the QtCore module of the Qt Toolkit. ** -** $TROLLTECH_DUAL_LICENSE$ +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 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 the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/declarative/qml/parser/javascriptparser.cpp b/src/declarative/qml/parser/javascriptparser.cpp index f9661d5..6221386 100644 --- a/src/declarative/qml/parser/javascriptparser.cpp +++ b/src/declarative/qml/parser/javascriptparser.cpp @@ -384,18 +384,30 @@ case 39: { } break; case 40: { + AST::ObjectLiteral *node = 0; if (sym(2).Node) - sym(1).Node = makeAstNode (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ()); + node = makeAstNode (driver->nodePool(), + sym(2).PropertyNameAndValueList->finish ()); else - sym(1).Node = makeAstNode (driver->nodePool()); + node = makeAstNode (driver->nodePool()); + node->lbraceToken = loc(1); + node->lbraceToken = loc(3); + sym(1).Node = node; } break; case 41: { - sym(1).Node = makeAstNode (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ()); + AST::ObjectLiteral *node = makeAstNode (driver->nodePool(), + sym(2).PropertyNameAndValueList->finish ()); + node->lbraceToken = loc(1); + node->lbraceToken = loc(4); + sym(1).Node = node; } break; case 42: { - sym(1) = sym(2); + AST::NestedExpression *node = makeAstNode(driver->nodePool(), sym(2).Expression); + node->lparenToken = loc(1); + node->rparenToken = loc(3); + sym(1).Node = node; } break; case 43: { @@ -1339,7 +1351,7 @@ case 273: { } break; case 274: { - AST::Catch *node = makeAstNode (driver->nodePool(), sym(3).sval, sym(5).Statement); + AST::Catch *node = makeAstNode (driver->nodePool(), sym(3).sval, sym(5).Block); node->catchToken = loc(1); node->lparenToken = loc(2); node->identifierToken = loc(3); @@ -1348,7 +1360,7 @@ case 274: { } break; case 275: { - AST::Finally *node = makeAstNode (driver->nodePool(), sym(2).Statement); + AST::Finally *node = makeAstNode (driver->nodePool(), sym(2).Block); node->finallyToken = loc(1); sym(1).Node = node; } break; @@ -1451,6 +1463,8 @@ case 293: { tk.dval = yylval; tk.loc = yylloc; + yylloc.length = 0; + const QString msg = QString::fromUtf8("Missing `;'"); diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, diff --git a/src/declarative/qml/parser/javascriptparser_p.h b/src/declarative/qml/parser/javascriptparser_p.h index d31597b..c08a14a 100644 --- a/src/declarative/qml/parser/javascriptparser_p.h +++ b/src/declarative/qml/parser/javascriptparser_p.h @@ -97,6 +97,7 @@ public: JavaScript::AST::SourceElements *SourceElements; JavaScript::AST::Statement *Statement; JavaScript::AST::StatementList *StatementList; + JavaScript::AST::Block *Block; JavaScript::AST::VariableDeclaration *VariableDeclaration; JavaScript::AST::VariableDeclarationList *VariableDeclarationList; diff --git a/src/declarative/qml/qmlscriptparser.cpp b/src/declarative/qml/qmlscriptparser.cpp index dbf71dd..4e0c283 100644 --- a/src/declarative/qml/qmlscriptparser.cpp +++ b/src/declarative/qml/qmlscriptparser.cpp @@ -9,7 +9,6 @@ #include "parser/javascriptnodepool_p.h" #include "parser/javascriptastvisitor_p.h" #include "parser/javascriptast_p.h" -#include "parser/javascriptprettypretty_p.h" #include #include @@ -60,7 +59,7 @@ public: ProcessAST(QmlScriptParser *parser); virtual ~ProcessAST(); - void operator()(AST::Node *node); + void operator()(const QString &code, AST::Node *node); protected: Object *defineObjectBinding(int line, @@ -97,10 +96,36 @@ protected: QString qualifiedNameId() const; + QString textAt(const AST::SourceLocation &loc) const + { return _contents.mid(loc.offset, loc.length); } + + QString textAt(const AST::SourceLocation &first, + const AST::SourceLocation &last) const + { return _contents.mid(first.offset, last.offset + last.length - first.offset); } + + QString asString(AST::ExpressionNode *expr) const + { + if (! expr) + return QString(); + + return textAt(expr->firstSourceLocation(), expr->lastSourceLocation()); + } + + QString asString(AST::Statement *stmt) const + { + if (! stmt) + return QString(); + + QString s = textAt(stmt->firstSourceLocation(), stmt->lastSourceLocation()); + s += QLatin1Char('\n'); + return s; + } + private: QmlScriptParser *_parser; StateStack _stateStack; QStringList _scope; + QString _contents; inline bool isSignalProperty(const QByteArray &propertyName) const { return (propertyName.length() >= 3 && propertyName.startsWith("on") && @@ -118,8 +143,9 @@ ProcessAST::~ProcessAST() { } -void ProcessAST::operator()(AST::Node *node) +void ProcessAST::operator()(const QString &code, AST::Node *node) { + _contents = code; accept(node); } @@ -258,9 +284,7 @@ Object *ProcessAST::defineObjectBinding(int line, if (AST::ExpressionStatement *stmt = AST::cast(scriptBinding->statement)) { script = getPrimitive("script", stmt->expression); } else { - QTextStream out(&script); - PrettyPretty pp(out); - pp(scriptBinding->statement); + script = asString(scriptBinding->statement); } defineProperty(QLatin1String("script"), line, script); } else { @@ -378,27 +402,25 @@ bool ProcessAST::visit(AST::UiObjectBinding *node) QString ProcessAST::getPrimitive(const QByteArray &propertyName, AST::ExpressionNode *expr) { QString primitive; - QTextStream out(&primitive); - PrettyPretty pp(out); if(isSignalProperty(propertyName)) { - pp(expr); + primitive = asString(expr); } else if (propertyName == "id" && expr && expr->kind == AST::Node::Kind_IdentifierExpression) { - primitive = AST::cast(expr)->name->asString(); - } else if (expr->kind == AST::Node::Kind_StringLiteral) { + primitive = asString(expr); + } else if (AST::StringLiteral *lit = AST::cast(expr)) { // hack: emulate weird XML feature that string literals are not quoted. //This needs to be fixed in the qmlcompiler once xml goes away. - primitive = AST::cast(expr)->value->asString(); + primitive = lit->value->asString(); } else if (expr->kind == AST::Node::Kind_TrueLiteral || expr->kind == AST::Node::Kind_FalseLiteral || expr->kind == AST::Node::Kind_NumericLiteral ) { - pp(expr); + primitive = asString(expr); } else { // create a binding - out << "{"; - pp(expr); - out << "}"; + primitive += QLatin1Char('{'); + primitive += asString(expr); + primitive += QLatin1Char('}'); } return primitive; } @@ -407,7 +429,6 @@ QString ProcessAST::getPrimitive(const QByteArray &propertyName, AST::Expression // UiObjectMember: UiQualifiedId T_COLON Statement ; bool ProcessAST::visit(AST::UiScriptBinding *node) { - int propertyCount = 0; AST::UiQualifiedId *propertyName = node->qualifiedId; for (; propertyName; propertyName = propertyName->next){ @@ -417,17 +438,20 @@ bool ProcessAST::visit(AST::UiScriptBinding *node) Property *prop = currentProperty(); QString primitive; - QTextStream out(&primitive); - PrettyPretty pp(out); if (AST::ExpressionStatement *stmt = AST::cast(node->statement)) { primitive = getPrimitive(prop->name, stmt->expression); } else if (isSignalProperty(prop->name)) { - pp(node->statement); + if (AST::Block *block = AST::cast(node->statement)) { + const int start = block->lbraceToken.offset + block->rbraceToken.length; + primitive += _contents.mid(start, block->rbraceToken.offset - start); + } else { + primitive += asString(node->statement); + } } else { // do binding - out << '{'; - pp(node->statement); - out << '}'; + primitive += QLatin1Char('{'); + primitive += asString(node->statement); + primitive += QLatin1Char('}'); } Value *v = new Value; @@ -468,16 +492,15 @@ bool ProcessAST::visit(AST::UiSourceElement *node) } QString source; - QTextStream out(&source); - PrettyPretty pp(out); - - pp(node->sourceElement); int line = 0; - if (AST::FunctionDeclaration *funDecl = AST::cast(node->sourceElement)) + if (AST::FunctionDeclaration *funDecl = AST::cast(node->sourceElement)) { line = funDecl->functionToken.startLine; - else if (AST::VariableStatement *varStmt = AST::cast(node->sourceElement)) + source = asString(funDecl); + } else if (AST::VariableStatement *varStmt = AST::cast(node->sourceElement)) { + // ignore variable declarations line = varStmt->declarationKindToken.startLine; + } Value *value = new Value; value->primitive = source; @@ -538,7 +561,7 @@ bool QmlScriptParser::parse(const QByteArray &data, const QUrl &url) } ProcessAST process(this); - process(parser.ast()); + process(code, parser.ast()); return true; } -- cgit v0.12