summaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-04-27 13:45:31 (GMT)
committerRoberto Raggi <roberto.raggi@nokia.com>2009-04-27 13:45:31 (GMT)
commitd7ffaa8ccbf881d25004b9a710259701d1a8c9bc (patch)
tree633e12bfb5d356366acd980e7158148def8ee184 /src/declarative
parent38d90a2d93d51325ef5dad0904eab2e3a30f3064 (diff)
downloadQt-d7ffaa8ccbf881d25004b9a710259701d1a8c9bc.zip
Qt-d7ffaa8ccbf881d25004b9a710259701d1a8c9bc.tar.gz
Qt-d7ffaa8ccbf881d25004b9a710259701d1a8c9bc.tar.bz2
Introduced Node::firstSourceLocation(), Node::lastSourceLocation().
Diffstat (limited to 'src/declarative')
-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
-rw-r--r--src/declarative/qml/qmlscriptparser.cpp83
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<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;
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 <QStack>
#include <QtDebug>
@@ -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<AST::ExpressionStatement *>(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<AST::IdentifierExpression *>(expr)->name->asString();
- } else if (expr->kind == AST::Node::Kind_StringLiteral) {
+ primitive = asString(expr);
+ } else if (AST::StringLiteral *lit = AST::cast<AST::StringLiteral *>(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<AST::StringLiteral *>(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<AST::ExpressionStatement *>(node->statement)) {
primitive = getPrimitive(prop->name, stmt->expression);
} else if (isSignalProperty(prop->name)) {
- pp(node->statement);
+ if (AST::Block *block = AST::cast<AST::Block *>(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<AST::FunctionDeclaration *>(node->sourceElement))
+ if (AST::FunctionDeclaration *funDecl = AST::cast<AST::FunctionDeclaration *>(node->sourceElement)) {
line = funDecl->functionToken.startLine;
- else if (AST::VariableStatement *varStmt = AST::cast<AST::VariableStatement *>(node->sourceElement))
+ source = asString(funDecl);
+ } else if (AST::VariableStatement *varStmt = AST::cast<AST::VariableStatement *>(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;
}