Skip to content

Commit

Permalink
Fix the QML front-end to allow side effects in the initializer.
Browse files Browse the repository at this point in the history
Task-number: QTBUG-15117
  • Loading branch information
Roberto Raggi committed May 12, 2011
1 parent 35559a2 commit f31d94f
Show file tree
Hide file tree
Showing 9 changed files with 1,040 additions and 992 deletions.
35 changes: 12 additions & 23 deletions src/declarative/qml/parser/qdeclarativejs.g
Expand Up @@ -782,19 +782,14 @@ case $rule_number: {
} break;
./

UiObjectMember: UiQualifiedId T_COLON Block ;
/.case $rule_number:./

UiObjectMember: UiQualifiedId T_COLON EmptyStatement ;
/.case $rule_number:./

UiObjectMember: UiQualifiedId T_COLON ExpressionStatement ;
/.case $rule_number:./

UiObjectMember: UiQualifiedId T_COLON IfStatement ; --- ### do we really want if statement in a binding?
/.case $rule_number:./
UiScriptStatement: Block ;
UiScriptStatement: EmptyStatement ;
UiScriptStatement: ExpressionStatement ;
UiScriptStatement: IfStatement ; --- ### do we really want if statement in a binding?

UiObjectMember: UiQualifiedId T_COLON UiScriptStatement ;
/.
case $rule_number:
{
AST::UiScriptBinding *node = makeAstNode<AST::UiScriptBinding> (driver->nodePool(),
sym(1).UiQualifiedId, sym(3).Statement);
Expand Down Expand Up @@ -922,51 +917,45 @@ case $rule_number: {
} break;
./

UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ;
UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ;
UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON UiScriptStatement ;
/.
case $rule_number: {
AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval,
sym(5).Expression);
sym(5).Statement);
node->propertyToken = loc(1);
node->typeToken = loc(2);
node->identifierToken = loc(3);
node->colonToken = loc(4);
node->semicolonToken = loc(6);
sym(1).Node = node;
} break;
./

UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ;
UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ;
UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON UiScriptStatement ;
/.
case $rule_number: {
AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
sym(6).Expression);
sym(6).Statement);
node->isReadonlyMember = true;
node->readonlyToken = loc(1);
node->propertyToken = loc(2);
node->typeToken = loc(3);
node->identifierToken = loc(4);
node->colonToken = loc(5);
node->semicolonToken = loc(7);
sym(1).Node = node;
} break;
./

UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ;
UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ;
UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_COLON UiScriptStatement ;
/.
case $rule_number: {
AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
sym(6).Expression);
sym(6).Statement);
node->isDefaultMember = true;
node->defaultToken = loc(1);
node->propertyToken = loc(2);
node->typeToken = loc(3);
node->identifierToken = loc(4);
node->colonToken = loc(5);
node->semicolonToken = loc(7);
sym(1).Node = node;
} break;
./
Expand Down
2 changes: 1 addition & 1 deletion src/declarative/qml/parser/qdeclarativejsast.cpp
Expand Up @@ -836,7 +836,7 @@ void UiFormal::accept0(Visitor *visitor)
void UiPublicMember::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
accept(expression, visitor);
accept(statement, visitor);
accept(binding, visitor);
}

Expand Down
8 changes: 4 additions & 4 deletions src/declarative/qml/parser/qdeclarativejsast_p.h
Expand Up @@ -2342,13 +2342,13 @@ class QML_PARSER_EXPORT UiPublicMember: public UiObjectMember

UiPublicMember(NameId *memberType,
NameId *name)
: type(Property), typeModifier(0), memberType(memberType), name(name), expression(0), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
: type(Property), typeModifier(0), memberType(memberType), name(name), statement(0), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
{ kind = K; }

UiPublicMember(NameId *memberType,
NameId *name,
ExpressionNode *expression)
: type(Property), typeModifier(0), memberType(memberType), name(name), expression(expression), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
Statement *statement)
: type(Property), typeModifier(0), memberType(memberType), name(name), statement(statement), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
{ kind = K; }

virtual SourceLocation firstSourceLocation() const
Expand Down Expand Up @@ -2376,7 +2376,7 @@ class QML_PARSER_EXPORT UiPublicMember: public UiObjectMember
NameId *typeModifier;
NameId *memberType;
NameId *name;
ExpressionNode *expression; // initialized with a JS expression
Statement *statement; // initialized with a JS expression
UiObjectMember *binding; // initialized with a QML object or array.
bool isDefaultMember;
bool isReadonlyMember;
Expand Down

0 comments on commit f31d94f

Please sign in to comment.