Introduce methods to get the source location of the AST nodes.
authorRoberto Raggi <roberto.raggi@nokia.com>
Fri, 2 Dec 2011 15:53:32 +0000 (16:53 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 6 Dec 2011 07:58:39 +0000 (08:58 +0100)
Also removed deprecate AST nodes.

Change-Id: I9221e81b15b18530bb2ab8b09da2482df543bace
Reviewed-by: Christian Kamm <christian.d.kamm@nokia.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>

12 files changed:
src/declarative/qml/parser/qdeclarativejs.g
src/declarative/qml/parser/qdeclarativejsast.cpp
src/declarative/qml/parser/qdeclarativejsast_p.h
src/declarative/qml/parser/qdeclarativejsastfwd_p.h
src/declarative/qml/parser/qdeclarativejsastvisitor_p.h
src/declarative/qml/parser/qdeclarativejsparser.cpp
src/declarative/qml/parser/qdeclarativejsparser_p.h
src/declarative/qml/v4/qv4irbuilder.cpp
src/declarative/qml/v4/qv4irbuilder_p.h
tests/auto/declarative/declarative.pro
tests/auto/declarative/qdeclarativeparser/qdeclarativeparser.pro [new file with mode: 0644]
tests/auto/declarative/qdeclarativeparser/tst_qdeclarativeparser.cpp [new file with mode: 0644]

index 8a8342b..d99f1df 100644 (file)
@@ -255,9 +255,6 @@ public:
       AST::UiObjectMemberList *UiObjectMemberList;
       AST::UiArrayMemberList *UiArrayMemberList;
       AST::UiQualifiedId *UiQualifiedId;
-      AST::UiSignature *UiSignature;
-      AST::UiFormalList *UiFormalList;
-      AST::UiFormal *UiFormal;
     };
 
 public:
@@ -828,6 +825,7 @@ UiParameterList: UiPropertyType JsIdentifier ;
 /.
 case $rule_number: {
   AST::UiParameterList *node = new (pool) AST::UiParameterList(stringRef(1), stringRef(2));
+  node->propertyTypeToken = loc(1);
   node->identifierToken = loc(2);
   sym(1).Node = node;
 } break;
index 8aff1ad..18e9272 100644 (file)
@@ -808,31 +808,6 @@ void UiProgram::accept0(Visitor *visitor)
     visitor->endVisit(this);
 }
 
-void UiSignature::accept0(Visitor *visitor)
-{
-    if (visitor->visit(this)) {
-        accept(formals, visitor);
-    }
-    visitor->endVisit(this);
-}
-
-void UiFormalList::accept0(Visitor *visitor)
-{
-    if (visitor->visit(this)) {
-        for (UiFormalList *it = this; it; it = it->next) {
-            accept(it->formal, visitor);
-        }
-    }
-    visitor->endVisit(this);
-}
-
-void UiFormal::accept0(Visitor *visitor)
-{
-    if (visitor->visit(this)) {
-    }
-    visitor->endVisit(this);
-}
-
 void UiPublicMember::accept0(Visitor *visitor)
 {
     if (visitor->visit(this)) {
index b2c441d..8b37831 100644 (file)
@@ -216,10 +216,7 @@ public:
         Kind_UiPublicMember,
         Kind_UiQualifiedId,
         Kind_UiScriptBinding,
-        Kind_UiSourceElement,
-        Kind_UiFormal,
-        Kind_UiFormalList,
-        Kind_UiSignature
+        Kind_UiSourceElement
     };
 
     inline Node()
@@ -242,6 +239,8 @@ public:
     { return accept(node, visitor); } // ### remove
 
     virtual void accept0(Visitor *visitor) = 0;
+    virtual SourceLocation firstSourceLocation() const = 0;
+    virtual SourceLocation lastSourceLocation() const = 0;
 
 // attributes
     int kind;
@@ -253,9 +252,6 @@ public:
     ExpressionNode() {}
 
     virtual ExpressionNode *expressionCast();
-
-    virtual SourceLocation firstSourceLocation() const = 0;
-    virtual SourceLocation lastSourceLocation() const = 0;
 };
 
 class QML_PARSER_EXPORT Statement: public Node
@@ -264,92 +260,6 @@ public:
     Statement() {}
 
     virtual Statement *statementCast();
-
-    virtual SourceLocation firstSourceLocation() const = 0;
-    virtual SourceLocation lastSourceLocation() const = 0;
-};
-
-class QML_PARSER_EXPORT UiFormal: public Node
-{
-public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(UiFormal)
-
-    UiFormal(const QStringRef &name, const QStringRef &alias)
-      : name(name), alias(alias)
-    { }
-
-    virtual SourceLocation firstSourceLocation() const
-    { return SourceLocation(); }
-
-    virtual SourceLocation lastSourceLocation() const
-    { return SourceLocation(); }
-
-    virtual void accept0(Visitor *visitor);
-
-// attributes
-    QStringRef name;
-    QStringRef alias;
-    SourceLocation identifierToken;
-    SourceLocation asToken;
-    SourceLocation aliasToken;
-};
-
-class QML_PARSER_EXPORT UiFormalList: public Node
-{
-public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(UiFormalList)
-
-    UiFormalList(UiFormal *formal)
-            : formal(formal), next(this) {}
-
-    UiFormalList(UiFormalList *previous, UiFormal *formal)
-            : formal(formal)
-    {
-        next = previous->next;
-        previous->next = this;
-    }
-
-    UiFormalList *finish()
-    {
-        UiFormalList *head = next;
-        next = 0;
-        return head;
-    }
-
-    virtual SourceLocation firstSourceLocation() const
-    { return SourceLocation(); }
-
-    virtual SourceLocation lastSourceLocation() const
-    { return SourceLocation(); }
-
-    virtual void accept0(Visitor *visitor);
-
-// attributes
-    UiFormal *formal;
-    UiFormalList *next;
-};
-
-class QML_PARSER_EXPORT UiSignature: public Node
-{
-public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(UiSignature)
-
-    UiSignature(UiFormalList *formals = 0)
-        : formals(formals)
-    { }
-
-    virtual SourceLocation firstSourceLocation() const
-    { return SourceLocation(); }
-
-    virtual SourceLocation lastSourceLocation() const
-    { return SourceLocation(); }
-
-    virtual void accept0(Visitor *visitor);
-
-// attributes
-    SourceLocation lparenToken;
-    UiFormalList *formals;
-    SourceLocation rparenToken;
 };
 
 class QML_PARSER_EXPORT NestedExpression: public ExpressionNode
@@ -594,6 +504,41 @@ public:
     SourceLocation rbraceToken;
 };
 
+class QML_PARSER_EXPORT Elision: public Node
+{
+public:
+    QDECLARATIVEJS_DECLARE_AST_NODE(Elision)
+
+    Elision():
+        next (this) { kind = K; }
+
+    Elision(Elision *previous)
+    {
+        kind = K;
+        next = previous->next;
+        previous->next = this;
+    }
+
+    virtual void accept0(Visitor *visitor);
+
+    virtual SourceLocation firstSourceLocation() const
+    { return commaToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : commaToken; }
+
+    inline Elision *finish ()
+    {
+        Elision *front = next;
+        next = 0;
+        return front;
+    }
+
+// attributes
+    Elision *next;
+    SourceLocation commaToken;
+};
+
 class QML_PARSER_EXPORT ElementList: public Node
 {
 public:
@@ -620,6 +565,20 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    {
+        if (elision)
+            return elision->firstSourceLocation();
+        return expression->firstSourceLocation();
+    }
+
+    virtual SourceLocation lastSourceLocation() const
+    {
+        if (next)
+            return next->lastSourceLocation();
+        return expression->lastSourceLocation();
+    }
+
 // attributes
     Elision *elision;
     ExpressionNode *expression;
@@ -627,33 +586,21 @@ public:
     SourceLocation commaToken;
 };
 
-class QML_PARSER_EXPORT Elision: public Node
+class QML_PARSER_EXPORT PropertyName: public Node
 {
 public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(Elision)
-
-    Elision():
-        next (this) { kind = K; }
+    QDECLARATIVEJS_DECLARE_AST_NODE(PropertyName)
 
-    Elision(Elision *previous)
-    {
-        kind = K;
-        next = previous->next;
-        previous->next = this;
-    }
+    PropertyName() { kind = K; }
 
-    virtual void accept0(Visitor *visitor);
+    virtual SourceLocation firstSourceLocation() const
+    { return propertyNameToken; }
 
-    inline Elision *finish ()
-    {
-        Elision *front = next;
-        next = 0;
-        return front;
-    }
+    virtual SourceLocation lastSourceLocation() const
+    { return propertyNameToken; }
 
 // attributes
-    Elision *next;
-    SourceLocation commaToken;
+    SourceLocation propertyNameToken;
 };
 
 class QML_PARSER_EXPORT PropertyNameAndValueList: public Node
@@ -675,6 +622,16 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return name->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    {
+        if (next)
+            return next->lastSourceLocation();
+        return value->lastSourceLocation();
+    }
+
     inline PropertyNameAndValueList *finish ()
     {
         PropertyNameAndValueList *front = next;
@@ -690,17 +647,6 @@ public:
     SourceLocation commaToken;
 };
 
-class QML_PARSER_EXPORT PropertyName: public Node
-{
-public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(PropertyName)
-
-    PropertyName() { kind = K; }
-
-// attributes
-    SourceLocation propertyNameToken;
-};
-
 class QML_PARSER_EXPORT IdentifierPropertyName: public PropertyName
 {
 public:
@@ -880,6 +826,16 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return expression->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    {
+        if (next)
+            return next->lastSourceLocation();
+        return expression->lastSourceLocation();
+    }
+
     inline ArgumentList *finish ()
     {
         ArgumentList *front = next;
@@ -1238,6 +1194,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return statement->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : statement->lastSourceLocation(); }
+
     inline StatementList *finish ()
     {
         StatementList *front = next;
@@ -1284,6 +1246,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return identifierToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return expression ? expression->lastSourceLocation() : identifierToken; }
+
 // attributes
     QStringRef name;
     ExpressionNode *expression;
@@ -1310,6 +1278,16 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return declaration->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    {
+        if (next)
+            return next->lastSourceLocation();
+        return declaration->lastSourceLocation();
+    }
+
     inline VariableDeclarationList *finish (bool readOnly)
     {
         VariableDeclarationList *front = next;
@@ -1670,6 +1648,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return lbraceToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return rbraceToken; }
+
 // attributes
     CaseClauses *clauses;
     DefaultClause *defaultClause;
@@ -1703,6 +1687,30 @@ public:
     SourceLocation rparenToken;
 };
 
+class QML_PARSER_EXPORT CaseClause: public Node
+{
+public:
+    QDECLARATIVEJS_DECLARE_AST_NODE(CaseClause)
+
+    CaseClause(ExpressionNode *e, StatementList *slist):
+        expression (e), statements (slist)
+        { kind = K; }
+
+    virtual void accept0(Visitor *visitor);
+
+    virtual SourceLocation firstSourceLocation() const
+    { return caseToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return statements ? statements->lastSourceLocation() : colonToken; }
+
+// attributes
+    ExpressionNode *expression;
+    StatementList *statements;
+    SourceLocation caseToken;
+    SourceLocation colonToken;
+};
+
 class QML_PARSER_EXPORT CaseClauses: public Node
 {
 public:
@@ -1722,6 +1730,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return clause->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : clause->lastSourceLocation(); }
+
     inline CaseClauses *finish ()
     {
         CaseClauses *front = next;
@@ -1734,24 +1748,6 @@ public:
     CaseClauses *next;
 };
 
-class QML_PARSER_EXPORT CaseClause: public Node
-{
-public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(CaseClause)
-
-    CaseClause(ExpressionNode *e, StatementList *slist):
-        expression (e), statements (slist)
-        { kind = K; }
-
-    virtual void accept0(Visitor *visitor);
-
-// attributes
-    ExpressionNode *expression;
-    StatementList *statements;
-    SourceLocation caseToken;
-    SourceLocation colonToken;
-};
-
 class QML_PARSER_EXPORT DefaultClause: public Node
 {
 public:
@@ -1763,6 +1759,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return defaultToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return statements ? statements->lastSourceLocation() : colonToken; }
+
 // attributes
     StatementList *statements;
     SourceLocation defaultToken;
@@ -1826,6 +1828,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return catchToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return statement->lastSourceLocation(); }
+
 // attributes
     QStringRef name;
     Block *statement;
@@ -1846,6 +1854,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return finallyToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return statement ? statement->lastSourceLocation() : finallyToken; }
+
 // attributes
     Block *statement;
     SourceLocation finallyToken;
@@ -1950,6 +1964,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return identifierToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : identifierToken; }
+
     inline FormalParameterList *finish ()
     {
         FormalParameterList *front = next;
@@ -1964,34 +1984,13 @@ public:
     SourceLocation identifierToken;
 };
 
-class QML_PARSER_EXPORT FunctionBody: public Node
-{
-public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(FunctionBody)
-
-    FunctionBody(SourceElements *elts):
-        elements (elts)
-        { kind = K; }
-
-    virtual void accept0(Visitor *visitor);
-
-// attributes
-    SourceElements *elements;
-};
-
-class QML_PARSER_EXPORT Program: public Node
+class QML_PARSER_EXPORT SourceElement: public Node
 {
 public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(Program)
+    QDECLARATIVEJS_DECLARE_AST_NODE(SourceElement)
 
-    Program(SourceElements *elts):
-        elements (elts)
+    inline SourceElement()
         { kind = K; }
-
-    virtual void accept0(Visitor *visitor);
-
-// attributes
-    SourceElements *elements;
 };
 
 class QML_PARSER_EXPORT SourceElements: public Node
@@ -2013,6 +2012,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return element->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : element->lastSourceLocation(); }
+
     inline SourceElements *finish ()
     {
         SourceElements *front = next;
@@ -2025,13 +2030,46 @@ public:
     SourceElements *next;
 };
 
-class QML_PARSER_EXPORT SourceElement: public Node
+class QML_PARSER_EXPORT FunctionBody: public Node
 {
 public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(SourceElement)
+    QDECLARATIVEJS_DECLARE_AST_NODE(FunctionBody)
 
-    inline SourceElement()
+    FunctionBody(SourceElements *elts):
+        elements (elts)
+        { kind = K; }
+
+    virtual void accept0(Visitor *visitor);
+
+    virtual SourceLocation firstSourceLocation() const
+    { return elements ? elements->firstSourceLocation() : SourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return elements ? elements->lastSourceLocation() : SourceLocation(); }
+
+// attributes
+    SourceElements *elements;
+};
+
+class QML_PARSER_EXPORT Program: public Node
+{
+public:
+    QDECLARATIVEJS_DECLARE_AST_NODE(Program)
+
+    Program(SourceElements *elts):
+        elements (elts)
         { kind = K; }
+
+    virtual void accept0(Visitor *visitor);
+
+    virtual SourceLocation firstSourceLocation() const
+    { return elements ? elements->firstSourceLocation() : SourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return elements ? elements->lastSourceLocation() : SourceLocation(); }
+
+// attributes
+    SourceElements *elements;
 };
 
 class QML_PARSER_EXPORT FunctionSourceElement: public SourceElement
@@ -2045,6 +2083,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return declaration->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return declaration->lastSourceLocation(); }
+
 // attributes
     FunctionDeclaration *declaration;
 };
@@ -2060,6 +2104,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return statement->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return statement->lastSourceLocation(); }
+
 // attributes
     Statement *statement;
 };
@@ -2085,22 +2135,6 @@ public:
     SourceLocation semicolonToken;
 };
 
-class QML_PARSER_EXPORT UiProgram: public Node
-{
-public:
-    QDECLARATIVEJS_DECLARE_AST_NODE(UiProgram)
-
-    UiProgram(UiImportList *imports, UiObjectMemberList *members)
-        : imports(imports), members(members)
-    { kind = K; }
-
-    virtual void accept0(Visitor *visitor);
-
-// attributes
-    UiImportList *imports;
-    UiObjectMemberList *members;
-};
-
 class QML_PARSER_EXPORT UiQualifiedId: public Node
 {
 public:
@@ -2127,6 +2161,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return identifierToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : identifierToken; }
+
 // attributes
     UiQualifiedId *next;
     QStringRef name;
@@ -2146,14 +2186,14 @@ public:
         : importUri(uri)
     { kind = K; }
 
+    virtual void accept0(Visitor *visitor);
+
     virtual SourceLocation firstSourceLocation() const
     { return importToken; }
 
     virtual SourceLocation lastSourceLocation() const
     { return semicolonToken; }
 
-    virtual void accept0(Visitor *visitor);
-
 // attributes
     QStringRef fileName;
     UiQualifiedId *importUri;
@@ -2184,21 +2224,6 @@ public:
         previous->next = this;
     }
 
-    virtual SourceLocation firstSourceLocation() const
-    {
-        if (import) return import->firstSourceLocation();
-        else return SourceLocation();
-    }
-
-    virtual SourceLocation lastSourceLocation() const
-    {
-        for (const UiImportList *it = this; it; it = it->next)
-            if (!it->next && it->import)
-                return it->import->lastSourceLocation();
-
-        return SourceLocation();
-    }
-
     UiImportList *finish()
     {
         UiImportList *head = next;
@@ -2208,6 +2233,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return import->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : import->lastSourceLocation(); }
+
 // attributes
     UiImport *import;
     UiImportList *next;
@@ -2241,6 +2272,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return member->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : member->lastSourceLocation(); }
+
     UiObjectMemberList *finish()
     {
         UiObjectMemberList *head = next;
@@ -2253,6 +2290,40 @@ public:
     UiObjectMember *member;
 };
 
+class QML_PARSER_EXPORT UiProgram: public Node
+{
+public:
+    QDECLARATIVEJS_DECLARE_AST_NODE(UiProgram)
+
+    UiProgram(UiImportList *imports, UiObjectMemberList *members)
+        : imports(imports), members(members)
+    { kind = K; }
+
+    virtual void accept0(Visitor *visitor);
+
+    virtual SourceLocation firstSourceLocation() const
+    {
+        if (imports)
+            return imports->firstSourceLocation();
+        else if (members)
+            return members->firstSourceLocation();
+        return SourceLocation();
+    }
+
+    virtual SourceLocation lastSourceLocation() const
+    {
+        if (members)
+            return members->lastSourceLocation();
+        else if (imports)
+            return imports->lastSourceLocation();
+        return SourceLocation();
+    }
+
+// attributes
+    UiImportList *imports;
+    UiObjectMemberList *members;
+};
+
 class QML_PARSER_EXPORT UiArrayMemberList: public Node
 {
 public:
@@ -2272,6 +2343,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return member->firstSourceLocation(); }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : member->lastSourceLocation(); }
+
     UiArrayMemberList *finish()
     {
         UiArrayMemberList *head = next;
@@ -2296,6 +2373,12 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+    virtual SourceLocation firstSourceLocation() const
+    { return lbraceToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return rbraceToken; }
+
 // attributes
     SourceLocation lbraceToken;
     UiObjectMemberList *members;
@@ -2321,6 +2404,12 @@ public:
 
     virtual void accept0(Visitor *) {}
 
+    virtual SourceLocation firstSourceLocation() const
+    { return propertyTypeToken; }
+
+    virtual SourceLocation lastSourceLocation() const
+    { return next ? next->lastSourceLocation() : identifierToken; }
+
     inline UiParameterList *finish ()
     {
         UiParameterList *front = next;
@@ -2333,6 +2422,7 @@ public:
     QStringRef name;
     UiParameterList *next;
     SourceLocation commaToken;
+    SourceLocation propertyTypeToken;
     SourceLocation identifierToken;
 };
 
@@ -2352,6 +2442,8 @@ public:
         : type(Property), memberType(memberType), name(name), statement(statement), binding(0), isDefaultMember(false), isReadonlyMember(false), parameters(0)
     { kind = K; }
 
+    virtual void accept0(Visitor *visitor);
+
     virtual SourceLocation firstSourceLocation() const
     {
       if (defaultToken.isValid())
@@ -2372,8 +2464,6 @@ public:
       return semicolonToken;
     }
 
-    virtual void accept0(Visitor *visitor);
-
 // attributes
     enum { Signal, Property } type;
     QStringRef typeModifier;
@@ -2404,14 +2494,14 @@ public:
         : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer)
     { kind = K; }
 
+    virtual void accept0(Visitor *visitor);
+
     virtual SourceLocation firstSourceLocation() const
     { return qualifiedTypeNameId->identifierToken; }
 
     virtual SourceLocation lastSourceLocation() const
     { return initializer->rbraceToken; }
 
-    virtual void accept0(Visitor *visitor);
-
 // attributes
     UiQualifiedId *qualifiedTypeNameId;
     UiObjectInitializer *initializer;
@@ -2446,9 +2536,9 @@ public:
       return SourceLocation();
     }
 
-
     virtual void accept0(Visitor *visitor);
 
+
 // attributes
     Node *sourceElement;
 };
@@ -2480,6 +2570,7 @@ public:
 
     virtual void accept0(Visitor *visitor);
 
+
 // attributes
     UiQualifiedId *qualifiedId;
     UiQualifiedId *qualifiedTypeNameId;
index fbc983a..28462ff 100644 (file)
@@ -178,9 +178,6 @@ class UiObjectMember;
 class UiObjectMemberList;
 class UiArrayMemberList;
 class UiQualifiedId;
-class UiFormalList;
-class UiFormal;
-class UiSignature;
 
 } } // namespace AST
 
index 8f51066..0381388 100644 (file)
@@ -83,9 +83,6 @@ public:
     virtual bool visit(UiObjectMemberList *) { return true; }
     virtual bool visit(UiArrayMemberList *) { return true; }
     virtual bool visit(UiQualifiedId *) { return true; }
-    virtual bool visit(UiSignature *) { return true; }
-    virtual bool visit(UiFormalList *) { return true; }
-    virtual bool visit(UiFormal *) { return true; }
 
     virtual void endVisit(UiProgram *) {}
     virtual void endVisit(UiImportList *) {}
@@ -100,9 +97,6 @@ public:
     virtual void endVisit(UiObjectMemberList *) {}
     virtual void endVisit(UiArrayMemberList *) {}
     virtual void endVisit(UiQualifiedId *) {}
-    virtual void endVisit(UiSignature *) {}
-    virtual void endVisit(UiFormalList *) {}
-    virtual void endVisit(UiFormal *) {}
 
     // QDeclarativeJS
     virtual bool visit(ThisExpression *) { return true; }
index 4db8a10..5326fea 100644 (file)
@@ -378,6 +378,7 @@ case 46: {
 
 case 47: {
   AST::UiParameterList *node = new (pool) AST::UiParameterList(stringRef(1), stringRef(2));
+  node->propertyTypeToken = loc(1);
   node->identifierToken = loc(2);
   sym(1).Node = node;
 } break;
index a398015..f0dc25f 100644 (file)
@@ -117,9 +117,6 @@ public:
       AST::UiObjectMemberList *UiObjectMemberList;
       AST::UiArrayMemberList *UiArrayMemberList;
       AST::UiQualifiedId *UiQualifiedId;
-      AST::UiSignature *UiSignature;
-      AST::UiFormalList *UiFormalList;
-      AST::UiFormal *UiFormal;
     };
 
 public:
index c65b348..389533e 100644 (file)
@@ -314,24 +314,6 @@ bool QV4IRBuilder::visit(AST::UiQualifiedId *)
     return false;
 }
 
-bool QV4IRBuilder::visit(AST::UiSignature *)
-{
-    Q_ASSERT(!"unreachable");
-    return false;
-}
-
-bool QV4IRBuilder::visit(AST::UiFormalList *)
-{
-    Q_ASSERT(!"unreachable");
-    return false;
-}
-
-bool QV4IRBuilder::visit(AST::UiFormal *)
-{
-    Q_ASSERT(!"unreachable");
-    return false;
-}
-
 
 // JS
 bool QV4IRBuilder::visit(AST::Program *)
index 28df5c4..ed21fc9 100644 (file)
@@ -131,9 +131,6 @@ protected:
     virtual bool visit(QDeclarativeJS::AST::UiObjectMemberList *ast);
     virtual bool visit(QDeclarativeJS::AST::UiArrayMemberList *ast);
     virtual bool visit(QDeclarativeJS::AST::UiQualifiedId *ast);
-    virtual bool visit(QDeclarativeJS::AST::UiSignature *ast);
-    virtual bool visit(QDeclarativeJS::AST::UiFormalList *ast);
-    virtual bool visit(QDeclarativeJS::AST::UiFormal *ast);
 
     // JS
     virtual bool visit(QDeclarativeJS::AST::Program *ast);
index 8e52392..6780a87 100644 (file)
@@ -19,6 +19,7 @@ PUBLICTESTS += \
     qdeclarativeqt \
     qdeclarativetranslation \
     qdeclarativexmlhttprequest \
+    qdeclarativeparser \
     qjsengine \
     qjsvalue \
     qjsvalueiterator \
diff --git a/tests/auto/declarative/qdeclarativeparser/qdeclarativeparser.pro b/tests/auto/declarative/qdeclarativeparser/qdeclarativeparser.pro
new file mode 100644 (file)
index 0000000..f864337
--- /dev/null
@@ -0,0 +1,9 @@
+CONFIG += testcase
+TARGET = tst_qdeclarativeparser
+QT += qmldevtools-private testlib
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qdeclarativeparser.cpp
+DEFINES += SRCDIR=\\\"$$PWD\\\"
+
+CONFIG += parallel_test
diff --git a/tests/auto/declarative/qdeclarativeparser/tst_qdeclarativeparser.cpp b/tests/auto/declarative/qdeclarativeparser/tst_qdeclarativeparser.cpp
new file mode 100644 (file)
index 0000000..1231376
--- /dev/null
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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.1, 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qdeclarativejsengine_p.h>
+#include <private/qdeclarativejsparser_p.h>
+#include <private/qdeclarativejslexer_p.h>
+#include <private/qdeclarativejsastvisitor_p.h>
+#include <private/qdeclarativejsast_p.h>
+
+#include <qtest.h>
+#include <QDir>
+#include <QDebug>
+#include <cstdlib>
+
+class tst_qdeclarativeparser : public QObject
+{
+    Q_OBJECT
+public:
+    tst_qdeclarativeparser();
+
+private slots:
+    void initTestCase();
+    void qmlParser_data();
+    void qmlParser();
+
+private:
+    QStringList excludedDirs;
+
+    QStringList findFiles(const QDir &);
+};
+
+namespace check {
+
+using namespace QDeclarativeJS;
+
+class Check: public AST::Visitor
+{
+    Engine *engine;
+    QList<AST::Node *> nodeStack;
+
+public:
+    Check(Engine *engine)
+        : engine(engine)
+    {
+    }
+
+    void operator()(AST::Node *node)
+    {
+        AST::Node::accept(node, this);
+    }
+
+    void checkNode(AST::Node *node)
+    {
+        if (! nodeStack.isEmpty()) {
+            AST::Node *parent = nodeStack.last();
+            const quint32 parentBegin = parent->firstSourceLocation().begin();
+            const quint32 parentEnd = parent->lastSourceLocation().end();
+
+            QVERIFY(node->firstSourceLocation().begin() >= parentBegin);
+            QVERIFY(node->lastSourceLocation().end() <= parentEnd);
+        }
+    }
+
+    virtual bool preVisit(AST::Node *node)
+    {
+        checkNode(node);
+        nodeStack.append(node);
+        return true;
+    }
+
+    virtual void postVisit(AST::Node *)
+    {
+        nodeStack.removeLast();
+    }
+};
+
+}
+
+tst_qdeclarativeparser::tst_qdeclarativeparser()
+{
+}
+
+void tst_qdeclarativeparser::initTestCase()
+{
+    // Add directories you want excluded here
+
+    // These snippets are not expected to run on their own.
+    excludedDirs << "doc/src/snippets/declarative/visualdatamodel_rootindex";
+    excludedDirs << "doc/src/snippets/declarative/qtbinding";
+    excludedDirs << "doc/src/snippets/declarative/imports";
+    excludedDirs << "doc/src/snippets/qtquick1/visualdatamodel_rootindex";
+    excludedDirs << "doc/src/snippets/qtquick1/qtbinding";
+    excludedDirs << "doc/src/snippets/qtquick1/imports";
+}
+
+QStringList tst_qdeclarativeparser::findFiles(const QDir &d)
+{
+    for (int ii = 0; ii < excludedDirs.count(); ++ii) {
+        QString s = excludedDirs.at(ii);
+        if (d.absolutePath().endsWith(s))
+            return QStringList();
+    }
+
+    QStringList rv;
+
+    QStringList files = d.entryList(QStringList() << QLatin1String("*.qml") << QLatin1String("*.js"),
+                                    QDir::Files);
+    foreach (const QString &file, files) {
+        rv << d.absoluteFilePath(file);
+    }
+
+    QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot |
+                                   QDir::NoSymLinks);
+    foreach (const QString &dir, dirs) {
+        QDir sub = d;
+        sub.cd(dir);
+        rv << findFiles(sub);
+    }
+
+    return rv;
+}
+
+/*
+This test checks all the qml and js files in the declarative UI source tree
+and ensures that the subnode's source locations are inside parent node's source locations
+*/
+
+void tst_qdeclarativeparser::qmlParser_data()
+{
+    QTest::addColumn<QString>("file");
+
+    QString examples = QLatin1String(SRCDIR) + "/../../../../examples/";
+    QString tests = QLatin1String(SRCDIR) + "/../../../../tests/";
+
+    QStringList files;
+    files << findFiles(QDir(examples));
+    files << findFiles(QDir(tests));
+
+    foreach (const QString &file, files)
+        QTest::newRow(qPrintable(file)) << file;
+}
+
+void tst_qdeclarativeparser::qmlParser()
+{
+    QFETCH(QString, file);
+
+    using namespace QDeclarativeJS;
+
+    QString code;
+
+    QFile f(file);
+    if (f.open(QFile::ReadOnly))
+        code = QString::fromUtf8(f.readAll());
+
+    const bool qmlMode = file.endsWith(QLatin1String(".qml"));
+
+    Engine engine;
+    Lexer lexer(&engine);
+    lexer.setCode(code, 1, qmlMode);
+    Parser parser(&engine);
+    if (qmlMode)
+        parser.parse();
+    else
+        parser.parseProgram();
+
+    check::Check chk(&engine);
+    chk(parser.rootNode());
+}
+
+QTEST_MAIN(tst_qdeclarativeparser)
+
+#include "tst_qdeclarativeparser.moc"