summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/parser')
-rw-r--r--src/declarative/qml/parser/javascript.g27
-rw-r--r--src/declarative/qml/parser/javascriptast.cpp8
-rw-r--r--src/declarative/qml/parser/javascriptast_p.h459
-rw-r--r--src/declarative/qml/parser/javascriptastfwd_p.h1
-rw-r--r--src/declarative/qml/parser/javascriptastvisitor_p.h3
-rw-r--r--src/declarative/qml/parser/javascriptgrammar.cpp36
-rw-r--r--src/declarative/qml/parser/javascriptgrammar_p.h36
-rw-r--r--src/declarative/qml/parser/javascriptparser.cpp26
-rw-r--r--src/declarative/qml/parser/javascriptparser_p.h1
9 files changed, 519 insertions, 78 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<AST::ObjectLiteral> (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ());
+ node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
+ sym(2).PropertyNameAndValueList->finish ());
else
- sym(1).Node = makeAstNode<AST::ObjectLiteral> (driver->nodePool());
+ node = makeAstNode<AST::ObjectLiteral> (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<AST::ObjectLiteral> (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ());
+ AST::ObjectLiteral *node = makeAstNode<AST::ObjectLiteral> (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<AST::NestedExpression>(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<AST::Catch> (driver->nodePool(), sym(3).sval, sym(5).Statement);
+ AST::Catch *node = makeAstNode<AST::Catch> (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<AST::Finally> (driver->nodePool(), sym(2).Statement);
+ AST::Finally *node = makeAstNode<AST::Finally> (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<AST::ObjectLiteral> (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ());
+ node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
+ sym(2).PropertyNameAndValueList->finish ());
else
- sym(1).Node = makeAstNode<AST::ObjectLiteral> (driver->nodePool());
+ node = makeAstNode<AST::ObjectLiteral> (driver->nodePool());
+ node->lbraceToken = loc(1);
+ node->lbraceToken = loc(3);
+ sym(1).Node = node;
} break;
case 41: {
- sym(1).Node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(), sym(2).PropertyNameAndValueList->finish ());
+ AST::ObjectLiteral *node = makeAstNode<AST::ObjectLiteral> (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<AST::NestedExpression>(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<AST::Catch> (driver->nodePool(), sym(3).sval, sym(5).Statement);
+ AST::Catch *node = makeAstNode<AST::Catch> (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<AST::Finally> (driver->nodePool(), sym(2).Statement);
+ AST::Finally *node = makeAstNode<AST::Finally> (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;