OSDN Git Service

QmlJS: Adjust existing code for updated QML parser.
authorChristian Kamm <christian.d.kamm@nokia.com>
Tue, 13 Sep 2011 07:57:24 +0000 (09:57 +0200)
committerChristian Kamm <christian.d.kamm@nokia.com>
Wed, 14 Sep 2011 09:48:22 +0000 (11:48 +0200)
Change-Id: I153723eeb9973be025daf47e317f7b9d076a3c72
Reviewed-on: http://codereview.qt-project.org/4733
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
30 files changed:
src/libs/qmljs/qmljsbind.cpp
src/libs/qmljs/qmljscheck.cpp
src/libs/qmljs/qmljscontext.cpp
src/libs/qmljs/qmljsdelta.cpp
src/libs/qmljs/qmljsdocument.cpp
src/libs/qmljs/qmljsdocument.h
src/libs/qmljs/qmljsevaluate.cpp
src/libs/qmljs/qmljsinterpreter.cpp
src/libs/qmljs/qmljsinterpreter.h
src/libs/qmljs/qmljspropertyreader.cpp
src/libs/qmljs/qmljsrewriter.cpp
src/libs/qmljs/qmljsscopebuilder.cpp
src/libs/qmljs/qmljstypedescriptionreader.cpp
src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp
src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp
src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp
src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp
src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
src/plugins/qmljseditor/qmljscompletionassist.cpp
src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
src/plugins/qmljseditor/qmljseditor.cpp
src/plugins/qmljseditor/qmljsfindreferences.cpp
src/plugins/qmljseditor/qmljshoverhandler.cpp
src/plugins/qmljseditor/qmljssemantichighlighter.cpp
src/plugins/qmljseditor/qmloutlinemodel.cpp
src/plugins/qmljseditor/quicktoolbar.cpp
src/plugins/qmljsinspector/qmljslivetextpreview.cpp
src/plugins/qmljstools/qmljslocatordata.cpp
src/plugins/qttest/testcode.cpp

index fac2738..74ba761 100644 (file)
@@ -124,9 +124,10 @@ bool Bind::usesQmlPrototype(ObjectValue *prototype,
     // if there are no renamed imports and the document does not use
     // the className string anywhere, it's out
     if (possibleNames.isEmpty()) {
-        NameId nameId(componentName.data(), componentName.size());
-        if (!_doc->engine()->literals().contains(nameId))
-            return false;
+        // ### FIXME!
+//        NameId nameId(componentName.data(), componentName.size());
+//        if (!_doc->engine()->literals().contains(nameId))
+//            return false;
     }
 
     QHashIterator<Node *, ObjectValue *> it(_qmlObjects);
@@ -148,12 +149,12 @@ bool Bind::usesQmlPrototype(ObjectValue *prototype,
         // optimize the common case of no renamed imports
         if (possibleNames.isEmpty()) {
             for (UiQualifiedId *idIt = id; idIt; idIt = idIt->next) {
-                if (!idIt->next && idIt->name->asString() != componentName)
+                if (!idIt->next && idIt->name != componentName)
                     skip = true;
             }
         } else {
             for (UiQualifiedId *idIt = id; idIt; idIt = idIt->next) {
-                if (!idIt->next && !possibleNames.contains(idIt->name->asString()))
+                if (!idIt->next && !possibleNames.contains(idIt->name.toString()))
                     skip = true;
             }
         }
@@ -195,8 +196,7 @@ QString Bind::toString(UiQualifiedId *qualifiedId, QChar delimiter)
         if (iter != qualifiedId)
             result += delimiter;
 
-        if (iter->name)
-            result += iter->name->asString();
+        result += iter->name;
     }
 
     return result;
@@ -267,10 +267,11 @@ bool Bind::visit(UiImport *ast)
             _diagnosticMessages->append(
                         errorMessage(ast, tr("package import requires a version number")));
         }
-    } else if (ast->fileName) {
-        QFileInfo importFileInfo(ast->fileName->asString());
+    } else if (!ast->fileName.isEmpty()) {
+        const QString &fileName = ast->fileName.toString();
+        QFileInfo importFileInfo(fileName);
         if (!importFileInfo.isAbsolute()) {
-            importFileInfo=QFileInfo(_doc->path() + QDir::separator() + ast->fileName->asString());
+            importFileInfo=QFileInfo(_doc->path() + QDir::separator() + fileName);
         }
         name = importFileInfo.absoluteFilePath();
         if (importFileInfo.isFile())
@@ -306,8 +307,8 @@ bool Bind::visit(UiObjectDefinition *ast)
     // an UiObjectDefinition may be used to group property bindings
     // think anchors { ... }
     bool isGroupedBinding = ast->qualifiedTypeNameId
-            && ast->qualifiedTypeNameId->name
-            && ast->qualifiedTypeNameId->name->asString().at(0).isLower();
+            && !ast->qualifiedTypeNameId->name.isEmpty()
+            && ast->qualifiedTypeNameId->name.at(0).isLower();
 
     if (!isGroupedBinding) {
         ObjectValue *value = bindObject(ast->qualifiedTypeNameId, ast->initializer);
@@ -338,8 +339,8 @@ bool Bind::visit(UiScriptBinding *ast)
     if (_currentObjectValue && toString(ast->qualifiedId) == QLatin1String("id")) {
         if (ExpressionStatement *e = cast<ExpressionStatement*>(ast->statement))
             if (IdentifierExpression *i = cast<IdentifierExpression*>(e->expression))
-                if (i->name)
-                    _idEnvironment->setMember(i->name->asString(), _currentObjectValue);
+                if (!i->name.isEmpty())
+                    _idEnvironment->setMember(i->name.toString(), _currentObjectValue);
     }
     const Block *block = AST::cast<const Block*>(ast->statement);
     if (block) {
@@ -363,12 +364,12 @@ bool Bind::visit(UiArrayBinding *)
 
 bool Bind::visit(VariableDeclaration *ast)
 {
-    if (! ast->name)
+    if (ast->name.isEmpty())
         return false;
 
     ASTVariableReference *ref = new ASTVariableReference(ast, _doc, &_valueOwner);
     if (_currentObjectValue)
-        _currentObjectValue->setMember(ast->name->asString(), ref);
+        _currentObjectValue->setMember(ast->name.toString(), ref);
     return true;
 }
 
@@ -379,8 +380,8 @@ bool Bind::visit(FunctionExpression *ast)
     //    return false;
 
     ASTFunctionValue *function = new ASTFunctionValue(ast, _doc, &_valueOwner);
-    if (_currentObjectValue && ast->name && cast<FunctionDeclaration *>(ast))
-        _currentObjectValue->setMember(ast->name->asString(), function);
+    if (_currentObjectValue && !ast->name.isEmpty() && cast<FunctionDeclaration *>(ast))
+        _currentObjectValue->setMember(ast->name.toString(), function);
 
     // build function scope
     ObjectValue *functionScope = _valueOwner.newObject(/*prototype=*/0);
@@ -392,8 +393,8 @@ bool Bind::visit(FunctionExpression *ast)
 
     // 1. Function formal arguments
     for (FormalParameterList *it = ast->formals; it; it = it->next) {
-        if (it->name)
-            functionScope->setMember(it->name->asString(), _valueOwner.undefinedValue());
+        if (!it->name.isEmpty())
+            functionScope->setMember(it->name.toString(), _valueOwner.undefinedValue());
     }
 
     // 2. Functions defined inside the function body
index 1e63a8f..927f2bf 100644 (file)
@@ -80,7 +80,7 @@ SourceLocation QmlJS::fullLocationForQualifiedId(AST::UiQualifiedId *qualifiedId
     SourceLocation end = qualifiedId->identifierToken;
 
     for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) {
-        if (iter->name)
+        if (iter->identifierToken.isValid())
             end = iter->identifierToken;
     }
 
@@ -160,7 +160,7 @@ public:
     {
         if (const QmlEnumValue *enumValue = dynamic_cast<const QmlEnumValue *>(value)) {
             if (StringLiteral *stringLiteral = cast<StringLiteral *>(_ast)) {
-                const QString valueName = stringLiteral->value->asString();
+                const QString valueName = stringLiteral->value.toString();
 
                 if (!enumValue->keys().contains(valueName)) {
                     _message.message = Check::tr("unknown value for enum");
@@ -201,7 +201,7 @@ public:
 
         if (value && value->asUrlValue()) {
             if (StringLiteral *literal = cast<StringLiteral *>(_ast)) {
-                QUrl url(literal->value->asString());
+                QUrl url(literal->value.toString());
                 if (!url.isValid() && !url.isEmpty()) {
                     _message.message = Check::tr("not a valid url");
                 } else {
@@ -224,7 +224,7 @@ public:
     virtual void visit(const ColorValue *)
     {
         if (StringLiteral *stringLiteral = cast<StringLiteral *>(_ast)) {
-            if (!toQColor(stringLiteral->value->asString()).isValid())
+            if (!toQColor(stringLiteral->value.toString()).isValid())
                 _message.message = Check::tr("not a valid color");
         } else {
             visit((StringValue *)0);
@@ -302,16 +302,16 @@ protected:
             else
                 break;
         }
-        if (ast->label)
-            _labels[ast->label->asString()] = end;
+        if (!ast->label.isEmpty())
+            _labels[ast->label.toString()] = end;
         return true;
     }
 
     virtual bool visit(BreakStatement *ast)
     {
         _state = Break;
-        if (ast->label) {
-            if (Node *target = _labels.value(ast->label->asString()))
+        if (!ast->label.isEmpty()) {
+            if (Node *target = _labels.value(ast->label.toString()))
                 _labelledBreaks.insert(target);
         }
         return false;
@@ -441,8 +441,8 @@ public:
         clear();
         _options = options;
         for (FormalParameterList *plist = function->formals; plist; plist = plist->next) {
-            if (plist->name)
-                _formalParameterNames += plist->name->asString();
+            if (!plist->name.isEmpty())
+                _formalParameterNames += plist->name.toString();
         }
 
         Node::accept(function->body, this);
@@ -478,9 +478,9 @@ protected:
 
     bool visit(IdentifierExpression *ast)
     {
-        if (!ast->name)
+        if (ast->name.isEmpty())
             return false;
-        const QString name = ast->name->asString();
+        const QString &name = ast->name.toString();
         if (!_declaredFunctions.contains(name) && !_declaredVariables.contains(name))
             _possiblyUndeclaredUses[name].append(ast->identifierToken);
         return false;
@@ -496,9 +496,9 @@ protected:
 
     bool visit(VariableDeclaration *ast)
     {
-        if (!ast->name)
+        if (ast->name.isEmpty())
             return true;
-        const QString name = ast->name->asString();
+        const QString &name = ast->name.toString();
 
         if (_options & Check::WarnDuplicateDeclaration) {
             if (_formalParameterNames.contains(name)) {
@@ -534,9 +534,9 @@ protected:
 
     bool visit(FunctionExpression *ast)
     {
-        if (!ast->name)
+        if (ast->name.isEmpty())
             return false;
-        const QString name = ast->name->asString();
+        const QString &name = ast->name.toString();
 
         if (_options & Check::WarnDuplicateDeclaration) {
             if (_formalParameterNames.contains(name)) {
@@ -627,10 +627,10 @@ bool Check::visit(UiObjectInitializer *)
 {
     m_propertyStack.push(StringSet());
     UiObjectDefinition *objectDefinition = cast<UiObjectDefinition *>(parent());
-    if (objectDefinition && objectDefinition->qualifiedTypeNameId->name->asString() == "Component")
+    if (objectDefinition && objectDefinition->qualifiedTypeNameId->name == "Component")
         m_idStack.push(StringSet());
     UiObjectBinding *objectBinding = cast<UiObjectBinding *>(parent());
-    if (objectBinding && objectBinding->qualifiedTypeNameId->name->asString() == "Component")
+    if (objectBinding && objectBinding->qualifiedTypeNameId->name == "Component")
         m_idStack.push(StringSet());
     if (m_idStack.isEmpty())
         m_idStack.push(StringSet());
@@ -641,10 +641,10 @@ void Check::endVisit(UiObjectInitializer *)
 {
     m_propertyStack.pop();
     UiObjectDefinition *objectDenition = cast<UiObjectDefinition *>(parent());
-    if (objectDenition && objectDenition->qualifiedTypeNameId->name->asString() == "Component")
+    if (objectDenition && objectDenition->qualifiedTypeNameId->name == "Component")
         m_idStack.pop();
     UiObjectBinding *objectBinding = cast<UiObjectBinding *>(parent());
-    if (objectBinding && objectBinding->qualifiedTypeNameId->name->asString() == "Component")
+    if (objectBinding && objectBinding->qualifiedTypeNameId->name == "Component")
         m_idStack.pop();
 }
 
@@ -738,7 +738,7 @@ void Check::visitQmlObject(Node *ast, UiQualifiedId *typeId,
 bool Check::visit(UiScriptBinding *ast)
 {
     // special case for id property
-    if (ast->qualifiedId->name->asString() == QLatin1String("id") && ! ast->qualifiedId->next) {
+    if (ast->qualifiedId->name == QLatin1String("id") && ! ast->qualifiedId->next) {
         if (! ast->statement)
             return false;
 
@@ -753,16 +753,16 @@ bool Check::visit(UiScriptBinding *ast)
 
         QString id;
         if (IdentifierExpression *idExp = cast<IdentifierExpression *>(expStmt->expression)) {
-            id = idExp->name->asString();
+            id = idExp->name.toString();
         } else if (StringLiteral *strExp = cast<StringLiteral *>(expStmt->expression)) {
-            id = strExp->value->asString();
+            id = strExp->value.toString();
             warning(loc, Check::tr("using string literals for ids is discouraged"));
         } else {
             error(loc, Check::tr("expected id"));
             return false;
         }
 
-        if (id.isEmpty() || (!id[0].isLower() && id[0] != '_')) {
+        if (id.isEmpty() || (!id.at(0).isLower() && id.at(0) != '_')) {
             error(loc, Check::tr("ids must be lower case or start with underscore"));
             return false;
         }
@@ -813,8 +813,8 @@ bool Check::visit(UiArrayBinding *ast)
 bool Check::visit(UiPublicMember *ast)
 {
     // check if the member type is valid
-    if (ast->memberType) {
-        const QString name = ast->memberType->asString();
+    if (!ast->memberType.isEmpty()) {
+        const QString &name = ast->memberType.toString();
         if (!name.isEmpty() && name.at(0).isLower()) {
             if (!isValidBuiltinPropertyType(name))
                 error(ast->typeToken, tr("'%1' is not a valid property type").arg(name));
@@ -837,7 +837,7 @@ bool Check::visit(IdentifierExpression *ast)
     return true;
 
     _lastValue = 0;
-    if (ast->name) {
+    if (!ast->name.isEmpty()) {
         Evaluate evaluator(&_scopeChain);
         _lastValue = evaluator.reference(ast);
         if (!_lastValue)
@@ -864,11 +864,11 @@ bool Check::visit(FieldMemberExpression *ast)
         error(locationFromRange(ast->base->firstSourceLocation(), ast->base->lastSourceLocation()),
               tr("does not have members"));
     }
-    if (!obj || !ast->name) {
+    if (!obj || ast->name.isEmpty()) {
         _lastValue = 0;
         return false;
     }
-    _lastValue = obj->lookupMember(ast->name->asString(), _context);
+    _lastValue = obj->lookupMember(ast->name.toString(), _context);
     if (!_lastValue)
         error(ast->identifierToken, tr("unknown member"));
     return false;
@@ -1093,14 +1093,14 @@ bool Check::visit(DefaultClause *ast)
 static QString functionName(ExpressionNode *ast, SourceLocation *location)
 {
     if (IdentifierExpression *id = cast<IdentifierExpression *>(ast)) {
-        if (id->name) {
+        if (!id->name.isEmpty()) {
             *location = id->identifierToken;
-            return id->name->asString();
+            return id->name.toString();
         }
     } else if (FieldMemberExpression *fme = cast<FieldMemberExpression *>(ast)) {
-        if (fme->name) {
+        if (!fme->name.isEmpty()) {
             *location = fme->identifierToken;
-            return fme->name->asString();
+            return fme->name.toString();
         }
     }
     return QString();
@@ -1169,10 +1169,10 @@ const Value *Check::checkScopeObjectMember(const UiQualifiedId *id)
     if (! id)
         return 0; // ### error?
 
-    if (! id->name) // possible after error recovery
+    if (id->name.isEmpty()) // possible after error recovery
         return 0;
 
-    QString propertyName = id->name->asString();
+    QString propertyName = id->name.toString();
 
     if (propertyName == QLatin1String("id") && ! id->next)
         return 0; // ### should probably be a special value
@@ -1219,14 +1219,14 @@ const Value *Check::checkScopeObjectMember(const UiQualifiedId *id)
             return 0;
         }
 
-        if (! idPart->next->name) {
+        if (idPart->next->name.isEmpty()) {
             // somebody typed "id." and error recovery still gave us a valid tree,
             // so just bail out here.
             return 0;
         }
 
         idPart = idPart->next;
-        propertyName = idPart->name->asString();
+        propertyName = idPart->name.toString();
 
         value = objectValue->lookupMember(propertyName, _context);
         if (! value) {
index 60112e5..c19cf11 100644 (file)
@@ -90,10 +90,7 @@ const ObjectValue *Context::lookupType(const QmlJS::Document *doc, UiQualifiedId
 
     for (UiQualifiedId *iter = qmlTypeName; objectValue && iter && iter != qmlTypeNameEnd;
          iter = iter->next) {
-        if (! iter->name)
-            return 0;
-
-        const Value *value = objectValue->lookupMember(iter->name->asString(), this);
+        const Value *value = objectValue->lookupMember(iter->name.toString(), this);
         if (!value)
             return 0;
 
index c385284..c1ed4c2 100644 (file)
@@ -83,11 +83,11 @@ static QString label(UiQualifiedId *id)
 {
     QString str;
     for (; id ; id = id->next) {
-        if (!id->name)
+        if (id->name.isEmpty())
             return QString();
         if (!str.isEmpty())
             str += QLatin1Char('.');
-        str += id->name->asString();
+        str += id->name;
     }
     return str;
 }
@@ -284,10 +284,10 @@ static QString _propertyName(UiQualifiedId *id)
     QString s;
 
     for (; id; id = id->next) {
-        if (! id->name)
+        if (id->name.isEmpty())
             return QString();
 
-        s += id->name->asString();
+        s += id->name;
 
         if (id->next)
             s += QLatin1Char('.');
@@ -300,7 +300,7 @@ static QString _methodName(UiSourceElement *source)
 {
     if (source) {
         if (FunctionDeclaration *declaration = cast<FunctionDeclaration*>(source->sourceElement)) {
-            return declaration->name->asString();
+            return declaration->name.toString();
         }
     }
     return QString();
index 7fb1379..0cfabbb 100644 (file)
@@ -35,7 +35,6 @@
 #include <qmljs/parser/qmljsast_p.h>
 #include <qmljs/parser/qmljslexer_p.h>
 #include <qmljs/parser/qmljsparser_p.h>
-#include <qmljs/parser/qmljsnodepool_p.h>
 #include <qmljs/parser/qmljsastfwd_p.h>
 #include <QtCore/QDir>
 
@@ -85,7 +84,6 @@ using namespace QmlJS::AST;
 
 Document::Document(const QString &fileName, Language language)
     : _engine(0)
-    , _pool(0)
     , _ast(0)
     , _bind(0)
     , _fileName(QDir::cleanPath(fileName))
@@ -115,9 +113,6 @@ Document::~Document()
 
     if (_engine)
         delete _engine;
-
-    if (_pool)
-        delete _pool;
 }
 
 Document::Ptr Document::create(const QString &fileName, Language language)
@@ -219,12 +214,10 @@ QString Document::componentName() const
 bool Document::parse_helper(int startToken)
 {
     Q_ASSERT(! _engine);
-    Q_ASSERT(! _pool);
     Q_ASSERT(! _ast);
     Q_ASSERT(! _bind);
 
     _engine = new Engine();
-    _pool = new NodePool(_fileName, _engine);
 
     Lexer lexer(_engine);
     Parser parser(_engine);
@@ -233,7 +226,7 @@ bool Document::parse_helper(int startToken)
     if (startToken == QmlJSGrammar::T_FEED_JS_PROGRAM)
         extractPragmas(&source);
 
-    lexer.setCode(source, /*line = */ 1);
+    lexer.setCode(source, /*line = */ 1, /*qmlMode = */_language == QmlLanguage);
 
     switch (startToken) {
     case QmlJSGrammar::T_FEED_UI_PROGRAM:
index 95a9416..5361246 100644 (file)
@@ -112,7 +112,6 @@ private:
 
 private:
     QmlJS::Engine *_engine;
-    NodePool *_pool;
     AST::Node *_ast;
     Bind *_bind;
     QList<QmlJS::DiagnosticMessage> _diagnosticMessages;
index 29ee818..bbb9f02 100644 (file)
@@ -168,10 +168,10 @@ bool Evaluate::visit(AST::UiArrayMemberList *)
 
 bool Evaluate::visit(AST::UiQualifiedId *ast)
 {
-    if (! ast->name)
+    if (ast->name.isEmpty())
          return false;
 
-    const Value *value = _scopeChain->lookup(ast->name->asString());
+    const Value *value = _scopeChain->lookup(ast->name.toString());
     if (! ast->next) {
         _result = value;
 
@@ -179,11 +179,11 @@ bool Evaluate::visit(AST::UiQualifiedId *ast)
         const ObjectValue *base = value_cast<const ObjectValue *>(value);
 
         for (AST::UiQualifiedId *it = ast->next; base && it; it = it->next) {
-            NameId *name = it->name;
-            if (! name)
+            const QString &name = it->name.toString();
+            if (name.isEmpty())
                 break;
 
-            const Value *value = base->lookupMember(name->asString(), _context);
+            const Value *value = base->lookupMember(name, _context);
             if (! it->next)
                 _result = value;
             else
@@ -216,10 +216,10 @@ bool Evaluate::visit(AST::ThisExpression *)
 
 bool Evaluate::visit(AST::IdentifierExpression *ast)
 {
-    if (! ast->name)
+    if (ast->name.isEmpty())
         return false;
 
-    _result = _scopeChain->lookup(ast->name->asString());
+    _result = _scopeChain->lookup(ast->name.toString());
     return false;
 }
 
@@ -314,12 +314,12 @@ bool Evaluate::visit(AST::ArrayMemberExpression *)
 
 bool Evaluate::visit(AST::FieldMemberExpression *ast)
 {
-    if (! ast->name)
+    if (ast->name.isEmpty())
         return false;
 
     if (const Value *base = _valueOwner->convertToObject(value(ast->base))) {
         if (const ObjectValue *obj = base->asObjectValue()) {
-            _result = obj->lookupMember(ast->name->asString(), _context);
+            _result = obj->lookupMember(ast->name.toString(), _context);
         }
     }
 
index 637f6dd..34ae127 100644 (file)
@@ -1667,12 +1667,12 @@ ASTObjectValue::ASTObjectValue(UiQualifiedId *typeName,
         for (UiObjectMemberList *it = _initializer->members; it; it = it->next) {
             UiObjectMember *member = it->member;
             if (UiPublicMember *def = cast<UiPublicMember *>(member)) {
-                if (def->type == UiPublicMember::Property && def->name && def->memberType) {
+                if (def->type == UiPublicMember::Property && !def->name.isEmpty() && !def->memberType.isEmpty()) {
                     ASTPropertyReference *ref = new ASTPropertyReference(def, _doc, valueOwner);
                     _properties.append(ref);
                     if (def->defaultToken.isValid())
                         _defaultPropertyRef = ref;
-                } else if (def->type == UiPublicMember::Signal && def->name) {
+                } else if (def->type == UiPublicMember::Signal && !def->name.isEmpty()) {
                     ASTSignalReference *ref = new ASTSignalReference(def, _doc, valueOwner);
                     _signals.append(ref);
                 }
@@ -1696,12 +1696,12 @@ bool ASTObjectValue::getSourceLocation(QString *fileName, int *line, int *column
 void ASTObjectValue::processMembers(MemberProcessor *processor) const
 {
     foreach (ASTPropertyReference *ref, _properties) {
-        processor->processProperty(ref->ast()->name->asString(), ref);
+        processor->processProperty(ref->ast()->name.toString(), ref);
         // ### Should get a different value?
         processor->processGeneratedSlot(ref->onChangedSlotName(), ref);
     }
     foreach (ASTSignalReference *ref, _signals) {
-        processor->processSignal(ref->ast()->name->asString(), ref);
+        processor->processSignal(ref->ast()->name.toString(), ref);
         // ### Should get a different value?
         processor->processGeneratedSlot(ref->slotName(), ref);
     }
@@ -1713,8 +1713,8 @@ QString ASTObjectValue::defaultPropertyName() const
 {
     if (_defaultPropertyRef) {
         UiPublicMember *prop = _defaultPropertyRef->ast();
-        if (prop && prop->name)
-            return prop->name->asString();
+        if (prop)
+            return prop->name.toString();
     }
     return QString();
 }
@@ -1773,7 +1773,7 @@ ASTFunctionValue::ASTFunctionValue(FunctionExpression *ast, const Document *doc,
     setPrototype(valueOwner->functionPrototype());
 
     for (FormalParameterList *it = ast->formals; it; it = it->next)
-        _argumentNames.append(it->name);
+        _argumentNames.append(it->name.toString());
 }
 
 ASTFunctionValue::~ASTFunctionValue()
@@ -1803,8 +1803,9 @@ const Value *ASTFunctionValue::argument(int) const
 QString ASTFunctionValue::argumentName(int index) const
 {
     if (index < _argumentNames.size()) {
-        if (NameId *nameId = _argumentNames.at(index))
-            return nameId->asString();
+        const QString &name = _argumentNames.at(index);
+        if (!name.isEmpty())
+            return name;
     }
 
     return FunctionValue::argumentName(index);
@@ -1848,7 +1849,7 @@ const Value *QmlPrototypeReference::value(ReferenceContext *referenceContext) co
 ASTPropertyReference::ASTPropertyReference(UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner)
     : Reference(valueOwner), _ast(ast), _doc(doc)
 {
-    const QString propertyName = ast->name->asString();
+    const QString &propertyName = ast->name.toString();
     _onChangedSlotName = QLatin1String("on");
     _onChangedSlotName += propertyName.at(0).toUpper();
     _onChangedSlotName += propertyName.midRef(1);
@@ -1870,8 +1871,8 @@ bool ASTPropertyReference::getSourceLocation(QString *fileName, int *line, int *
 const Value *ASTPropertyReference::value(ReferenceContext *referenceContext) const
 {
     if (_ast->statement
-            && (!_ast->memberType || _ast->memberType->asString() == QLatin1String("variant")
-                || _ast->memberType->asString() == QLatin1String("alias"))) {
+            && (_ast->memberType.isEmpty() || _ast->memberType == QLatin1String("variant")
+                || _ast->memberType == QLatin1String("alias"))) {
 
         // Adjust the context for the current location - expensive!
         // ### Improve efficiency by caching the 'use chain' constructed in ScopeBuilder.
@@ -1887,8 +1888,8 @@ const Value *ASTPropertyReference::value(ReferenceContext *referenceContext) con
         return evaluator(_ast->statement);
     }
 
-    if (_ast->memberType)
-        return valueOwner()->defaultValueForBuiltinType(_ast->memberType->asString());
+    if (!_ast->memberType.isEmpty())
+        return valueOwner()->defaultValueForBuiltinType(_ast->memberType.toString());
 
     return valueOwner()->undefinedValue();
 }
@@ -1896,7 +1897,7 @@ const Value *ASTPropertyReference::value(ReferenceContext *referenceContext) con
 ASTSignalReference::ASTSignalReference(UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner)
     : Reference(valueOwner), _ast(ast), _doc(doc)
 {
-    const QString signalName = ast->name->asString();
+    const QString &signalName = ast->name.toString();
     _slotName = QLatin1String("on");
     _slotName += signalName.at(0).toUpper();
     _slotName += signalName.midRef(1);
@@ -1951,8 +1952,8 @@ QString ImportInfo::name() const
 
 QString ImportInfo::id() const
 {
-    if (_ast && _ast->importId)
-        return _ast->importId->asString();
+    if (_ast)
+        return _ast->importId.toString();
     return QString();
 }
 
index 22c0fb8..7b1116d 100644 (file)
@@ -723,7 +723,7 @@ class QMLJS_EXPORT ASTFunctionValue: public FunctionValue
 {
     AST::FunctionExpression *_ast;
     const Document *_doc;
-    QList<NameId *> _argumentNames;
+    QList<QString> _argumentNames;
 
 public:
     ASTFunctionValue(AST::FunctionExpression *ast, const Document *doc, ValueOwner *valueOwner);
index 56974f5..3eb8302 100644 (file)
@@ -131,13 +131,13 @@ static inline QString flatten(UiQualifiedId *qualifiedId)
     QString result;
 
     for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) {
-        if (!iter->name)
+        if (iter->name.isEmpty())
             continue;
 
         if (!result.isEmpty())
             result.append(QLatin1Char('.'));
 
-        result.append(iter->name->asString());
+        result.append(iter->name);
     }
     return result;
 }
@@ -203,7 +203,7 @@ PropertyReader::PropertyReader(Document::Ptr doc, AST::UiObjectInitializer *ast)
                  m_bindingOrEnum.append(propertyName);
             }
         } else if (UiObjectDefinition *objectDefinition = cast<UiObjectDefinition *>(member)) { //font { bold: true }
-            const QString propertyName = objectDefinition->qualifiedTypeNameId->name->asString();
+            const QString propertyName = objectDefinition->qualifiedTypeNameId->name.toString();
             if (!propertyName.isEmpty() && !propertyName.at(0).isUpper()) {
                 for (UiObjectMemberList *iter = objectDefinition->initializer->members; iter; iter = iter->next) {
                     UiObjectMember *objectMember = iter->member;
@@ -226,7 +226,7 @@ PropertyReader::PropertyReader(Document::Ptr doc, AST::UiObjectInitializer *ast)
             const QString astValue = cleanupSemicolon(textAt(doc,
                               initializer->lbraceToken,
                               initializer->rbraceToken));
-            const QString propertyName = objectBinding->qualifiedId->name->asString();
+            const QString propertyName = objectBinding->qualifiedId->name.toString();
             m_properties.insert(propertyName, QVariant(astValue));
         }
     }
@@ -247,8 +247,8 @@ QLinearGradient PropertyReader::parseGradient(const QString &propertyName,  bool
             const QString astValue = cleanupSemicolon(textAt(m_doc,
                                                              initializer->lbraceToken,
                                                              initializer->rbraceToken));
-            const QString objectPropertyName = objectBinding->qualifiedId->name->asString();
-            const QString typeName = objectBinding->qualifiedTypeNameId->name->asString();
+            const QString objectPropertyName = objectBinding->qualifiedId->name.toString();
+            const QString typeName = objectBinding->qualifiedTypeNameId->name.toString();
             if (objectPropertyName == propertyName && typeName.contains("Gradient")) {
                 QLinearGradient gradient;
                 QVector<QGradientStop> stops;
index 797d3fc..c95a7e8 100644 (file)
@@ -259,8 +259,7 @@ QString Rewriter::flatten(UiQualifiedId *first)
         if (current != first)
             flatId += '.';
 
-        if (current->name)
-            flatId += current->name->asString();
+        flatId += current->name;
     }
 
     return flatId;
@@ -357,7 +356,7 @@ bool Rewriter::isMatchingPropertyMember(const QString &propertyName,
                                         UiObjectMember *member)
 {
     if (UiPublicMember *publicMember = cast<UiPublicMember*>(member))
-        return publicMember->name->asString() == propertyName;
+        return publicMember->name == propertyName;
     else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member))
         return flatten(objectBinding->qualifiedId) == propertyName;
     else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member))
@@ -529,8 +528,8 @@ void Rewriter::includeLeadingEmptyLine(const QString &source, int &start)
 
 void Rewriter::includeEmptyGroupedProperty(UiObjectDefinition *groupedProperty, UiObjectMember *memberToBeRemoved, int &start, int &end)
 {
-    if (groupedProperty->qualifiedTypeNameId
-            && groupedProperty->qualifiedTypeNameId->name->asString().at(0).isLower()) {
+    if (groupedProperty->qualifiedTypeNameId && !groupedProperty->qualifiedTypeNameId->name.isEmpty()
+            && groupedProperty->qualifiedTypeNameId->name.at(0).isLower()) {
         // grouped property
         UiObjectMemberList *memberIter = groupedProperty->initializer->members;
         while (memberIter) {
index f7e78f3..0e455da 100644 (file)
@@ -175,8 +175,8 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
         if (initializer) {
             for (UiObjectMemberList *m = initializer->members; m; m = m->next) {
                 if (UiScriptBinding *scriptBinding = cast<UiScriptBinding *>(m->member)) {
-                    if (scriptBinding->qualifiedId && scriptBinding->qualifiedId->name
-                            && scriptBinding->qualifiedId->name->asString() == QLatin1String("target")
+                    if (scriptBinding->qualifiedId
+                            && scriptBinding->qualifiedId->name == QLatin1String("target")
                             && ! scriptBinding->qualifiedId->next) {
                         Evaluate evaluator(_scopeChain);
                         const Value *targetValue = evaluator(scriptBinding->statement);
@@ -202,9 +202,9 @@ const Value *ScopeBuilder::scopeObjectLookup(AST::UiQualifiedId *id)
     foreach (const ObjectValue *scopeObject, _scopeChain->qmlScopeObjects()) {
         const ObjectValue *object = scopeObject;
         for (UiQualifiedId *it = id; it; it = it->next) {
-            if (!it->name)
+            if (it->name.isEmpty())
                 return 0;
-            result = object->lookupMember(it->name->asString(), _scopeChain->context());
+            result = object->lookupMember(it->name.toString(), _scopeChain->context());
             if (!result)
                 break;
             if (it->next) {
index d0b0480..7c2dc9d 100644 (file)
@@ -35,7 +35,6 @@
 #include "parser/qmljsparser_p.h"
 #include "parser/qmljslexer_p.h"
 #include "parser/qmljsengine_p.h"
-#include "parser/qmljsnodepool_p.h"
 #include "parser/qmljsast_p.h"
 #include "parser/qmljsastvisitor_p.h"
 
@@ -61,14 +60,12 @@ TypeDescriptionReader::~TypeDescriptionReader()
 
 bool TypeDescriptionReader::operator()(QHash<QString, FakeMetaObject::ConstPtr> *objects)
 {
-    QString fileName("typeDescription");
     Engine engine;
-    NodePool pool(fileName, &engine);
 
     Lexer lexer(&engine);
     Parser parser(&engine);
 
-    lexer.setCode(_source, /*line = */ 1);
+    lexer.setCode(_source, /*line = */ 1, /*qmlMode = */true);
 
     if (!parser.parse()) {
         _errorMessage = QString("%1:%2: %3").arg(
@@ -386,7 +383,7 @@ QString TypeDescriptionReader::readStringBinding(UiScriptBinding *ast)
         return QString();
     }
 
-    return stringLit->value->asString();
+    return stringLit->value.toString();
 }
 
 bool TypeDescriptionReader::readBoolBinding(AST::UiScriptBinding *ast)
@@ -472,7 +469,7 @@ void TypeDescriptionReader::readExports(UiScriptBinding *ast, FakeMetaObject::Pt
             addError(arrayLit->firstSourceLocation(), "Expected array literal with only string literal members");
             return;
         }
-        QString exp = stringLit->value->asString();
+        QString exp = stringLit->value.toString();
         int slashIdx = exp.indexOf(QLatin1Char('/'));
         int spaceIdx = exp.indexOf(QLatin1Char(' '));
         ComponentVersion version(exp.mid(spaceIdx + 1));
@@ -524,6 +521,6 @@ void TypeDescriptionReader::readEnumValues(AST::UiScriptBinding *ast, LanguageUt
         double v = value->value;
         if (minus)
             v = -v;
-        fme->addKey(propName->id->asString(), v);
+        fme->addKey(propName->id.toString(), v);
     }
 }
index 288fef9..b3bf518 100644 (file)
@@ -99,7 +99,7 @@ bool ChangeImportsVisitor::equals(QmlJS::AST::UiImport *ast, const Import &impor
     if (import.isLibraryImport()) {
         return flatten(ast->importUri) == import.url();
     } else if (import.isFileImport()) {
-        return ast->fileName->asString() == import.file();
+        return ast->fileName == import.file();
     } else {
         return false;
     }
index 460e49d..85bfb73 100644 (file)
@@ -182,7 +182,7 @@ bool ChangePropertyVisitor::isMatchingPropertyMember(const QString &propName,
     } else if (UiArrayBinding *arrayBinding = AST::cast<UiArrayBinding *>(member)) {
         return propName == flatten(arrayBinding->qualifiedId);
     } else if (UiPublicMember *publicMember = AST::cast<UiPublicMember *>(member)) {
-        return propName == publicMember->name->asString();
+        return propName == publicMember->name;
     } else {
         return false;
     }
index 5862e1b..ca169c6 100644 (file)
@@ -207,7 +207,7 @@ QString QMLRewriter::flatten(UiQualifiedId *first)
         if (current != first)
             flatId += '.';
 
-        flatId += current->name->asString();
+        flatId += current->name;
     }
 
     return flatId;
index f009f05..e21664a 100644 (file)
@@ -145,7 +145,7 @@ void RemovePropertyVisitor::removeMember(UiObjectMember *member)
 bool RemovePropertyVisitor::memberNameMatchesPropertyName(const QString &propertyName, UiObjectMember *ast)
 {
     if (UiPublicMember *publicMember = cast<UiPublicMember*>(ast))
-        return publicMember->name->asString() == propertyName;
+        return publicMember->name == propertyName;
     else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(ast))
         return flatten(objectBinding->qualifiedId) == propertyName;
     else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(ast))
index eabd0bb..5afb1a3 100644 (file)
@@ -99,8 +99,8 @@ public:
         const ASTPropertyReference *ref = dynamic_cast<const ASTPropertyReference*>(value);
         if (ref) {
             QString type = "unknown";
-            if (ref->ast()->memberType)
-                type = ref->ast()->memberType->asString();
+            if (!ref->ast()->memberType.isEmpty())
+                type = ref->ast()->memberType.toString();
             m_properties.append(qMakePair(name, type));
         } else {
             if (const QmlObjectValue * ov = dynamic_cast<const QmlObjectValue *>(value)) {
index fa77d1f..b636fd8 100644 (file)
@@ -176,13 +176,13 @@ static QString flatten(UiQualifiedId *qualifiedId)
     QString result;
 
     for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) {
-        if (!iter->name)
+        if (iter->name.isEmpty())
             continue;
 
         if (!result.isEmpty())
             result.append(QLatin1Char('.'));
 
-        result.append(iter->name->asString());
+        result.append(iter->name);
     }
 
     return result;
@@ -369,13 +369,13 @@ public:
             minorVersion = fixUpMinorVersionForQt(qmlValue->packageName(), qmlValue->version().minorVersion());
         } else {
             for (UiQualifiedId *iter = astTypeNode; iter; iter = iter->next)
-                if (!iter->next && iter->name)
-                    typeName = iter->name->asString();
+                if (!iter->next && !iter->name.isEmpty())
+                    typeName = iter->name.toString();
 
             QString fullTypeName;
             for (UiQualifiedId *iter = astTypeNode; iter; iter = iter->next)
-                if (iter->name)
-                    fullTypeName += iter->name->asString() + ".";
+                if (!iter->name.isEmpty())
+                    fullTypeName += iter->name.toString() + ".";
 
             if (fullTypeName.endsWith("."))
                 fullTypeName.chop(1);
@@ -413,12 +413,12 @@ public:
         if (! id)
             return false; // ### error?
 
-        if (! id->name) // possible after error recovery
+        if (id->name.isEmpty()) // possible after error recovery
             return false;
 
         QString propertyName;
         if (prefix.isEmpty())
-            propertyName = id->name->asString();
+            propertyName = id->name.toString();
         else
             propertyName = prefix;
 
@@ -478,13 +478,13 @@ public:
             if (parentObject)
                 *parentObject = objectValue;
 
-            if (! idPart->name) {
+            if (idPart->name.isEmpty()) {
                 // somebody typed "id." and error recovery still gave us a valid tree,
                 // so just bail out here.
                 return false;
             }
 
-            propertyName = idPart->name->asString();
+            propertyName = idPart->name.toString();
             if (name)
                 *name = propertyName;
 
@@ -595,15 +595,15 @@ public:
         if (IdentifierExpression *idExp = cast<IdentifierExpression *>(eStmt->expression)) {
             if (!m_scopeChain.qmlScopeObjects().isEmpty())
                 rhsValueObject = m_scopeChain.qmlScopeObjects().last();
-            if (idExp->name)
-                rhsValueName = idExp->name->asString();
+            if (!idExp->name.isEmpty())
+                rhsValueName = idExp->name.toString();
         } else if (FieldMemberExpression *memberExp = cast<FieldMemberExpression *>(eStmt->expression)) {
             Evaluate evaluate(&m_scopeChain);
             const Value *result = evaluate(memberExp->base);
             rhsValueObject = result->asObjectValue();
 
-            if (memberExp->name)
-                rhsValueName = memberExp->name->asString();
+            if (!memberExp->name.isEmpty())
+                rhsValueName = memberExp->name.toString();
         }
 
         if (rhsValueObject)
@@ -708,12 +708,10 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc,
         QString version;
         if (import->versionToken.isValid())
             version = textAt(doc, import->versionToken);
-        QString as;
-        if (import->importId)
-            as = import->importId->asString();
+        const QString &as = import->importId.toString();
 
-        if (import->fileName) {
-            const QString strippedFileName = stripQuotes(import->fileName->asString());
+        if (!import->fileName.isEmpty()) {
+            const QString strippedFileName = stripQuotes(import->fileName.toString());
             const Import newImport = Import::createFileImport(strippedFileName,
                                                               version, as, m_rewriterView->textModifier()->importPaths());
 
@@ -910,7 +908,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode,
                            << "for node type" << modelNode.type();
             }
         } else if (UiObjectDefinition *def = cast<UiObjectDefinition *>(member)) {
-            const QString name = def->qualifiedTypeNameId->name->asString();
+            const QString &name = def->qualifiedTypeNameId->name.toString();
             if (name.isEmpty() || !name.at(0).isUpper()) {
                 QStringList props = syncGroupedProperties(modelNode,
                                                           name,
@@ -949,16 +947,16 @@ void TextToModelMerger::syncNode(ModelNode &modelNode,
             if (property->type == UiPublicMember::Signal)
                 continue; // QML designer doesn't support this yet.
 
-            if (!property->name || !property->memberType)
+            if (property->name.isEmpty() || property->memberType.isEmpty())
                 continue; // better safe than sorry.
 
-            const QString astName = property->name->asString();
+            const QString &astName = property->name.toString();
             QString astValue;
             if (property->statement)
                 astValue = textAt(context->doc(),
                                   property->statement->firstSourceLocation(),
                                   property->statement->lastSourceLocation());
-            const QString astType = property->memberType->asString();
+            const QString &astType = property->memberType.toString();
             AbstractProperty modelProperty = modelNode.property(astName);
             if (!property->statement || isLiteralValue(property->statement)) {
                 const QVariant variantValue = convertDynamicPropertyValueToVariant(astValue, astType);
index 8a77569..e14e0ce 100644 (file)
@@ -452,11 +452,11 @@ IAssistProposal *QmlJSCompletionAssistProcessor::perform(const IAssistInterface
                 break;
             const ObjectValue *newScopeType = qmlScopeType;
             for (AST::UiQualifiedId *it = objDef->qualifiedTypeNameId; it; it = it->next) {
-                if (!newScopeType || !it->name) {
+                if (!newScopeType || it->name.isEmpty()) {
                     newScopeType = 0;
                     break;
                 }
-                const Value *v = newScopeType->lookupMember(it->name->asString(), context);
+                const Value *v = newScopeType->lookupMember(it->name.toString(), context);
                 v = context->lookupReference(v);
                 newScopeType = value_cast<const ObjectValue *>(v);
             }
index f8baece..73b0263 100644 (file)
@@ -57,9 +57,9 @@ static QString toString(Statement *statement)
     if (!expStmt)
         return QString();
     if (IdentifierExpression *idExp = cast<IdentifierExpression *>(expStmt->expression)) {
-        return idExp->name->asString();
+        return idExp->name.toString();
     } else if (StringLiteral *strExp = cast<StringLiteral *>(expStmt->expression)) {
-        return strExp->value->asString();
+        return strExp->value.toString();
     }
     return QString();
 }
@@ -75,10 +75,10 @@ static QString getIdProperty(UiObjectDefinition *def)
                     continue;
                 if (script->qualifiedId->next)
                     continue;
-                if (script->qualifiedId->name) {
-                    if (script->qualifiedId->name->asString() == QLatin1String("id"))
+                if (!script->qualifiedId->name.isEmpty()) {
+                    if (script->qualifiedId->name == QLatin1String("id"))
                         return toString(script->statement);
-                    if (script->qualifiedId->name->asString() == QLatin1String("objectName"))
+                    if (script->qualifiedId->name == QLatin1String("objectName"))
                         objectName = toString(script->statement);
                 }
             }
index 5ec720f..69b8380 100644 (file)
@@ -126,8 +126,8 @@ protected:
     {
         QString text;
         for (; id; id = id->next) {
-            if (id->name)
-                text += id->name->asString();
+            if (!id->name.isEmpty())
+                text += id->name;
             else
                 text += QLatin1Char('?');
 
@@ -149,8 +149,8 @@ protected:
         if (asString(node->qualifiedId) == QLatin1String("id")) {
             if (AST::ExpressionStatement *stmt = AST::cast<AST::ExpressionStatement*>(node->statement)) {
                 if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(stmt->expression)) {
-                    if (idExpr->name) {
-                        const QString id = idExpr->name->asString();
+                    if (!idExpr->name.isEmpty()) {
+                        const QString &id = idExpr->name.toString();
                         QList<AST::SourceLocation> *locs = &_ids[id];
                         locs->append(idExpr->firstSourceLocation());
                         locs->append(_maybeIds.value(id));
@@ -168,8 +168,8 @@ protected:
 
     virtual bool visit(AST::IdentifierExpression *node)
     {
-        if (node->name) {
-            const QString name = node->name->asString();
+        if (!node->name.isEmpty()) {
+            const QString &name = node->name.toString();
 
             if (_ids.contains(name))
                 _ids[name].append(node->identifierToken);
@@ -206,8 +206,8 @@ protected:
     {
         QString text;
         for (; id; id = id->next) {
-            if (id->name)
-                text += id->name->asString();
+            if (!id->name.isEmpty())
+                text += id->name;
             else
                 text += QLatin1Char('?');
 
@@ -320,19 +320,19 @@ protected:
 
     virtual bool visit(AST::FunctionDeclaration *ast)
     {
-        if (! ast->name)
+        if (ast->name.isEmpty())
             return false;
 
         Declaration decl;
         init(&decl, ast);
 
         decl.text.fill(QLatin1Char(' '), _depth);
-        decl.text += ast->name->asString();
+        decl.text += ast->name;
 
         decl.text += QLatin1Char('(');
         for (FormalParameterList *it = ast->formals; it; it = it->next) {
-            if (it->name)
-                decl.text += it->name->asString();
+            if (!it->name.isEmpty())
+                decl.text += it->name;
 
             if (it->next)
                 decl.text += QLatin1String(", ");
@@ -347,12 +347,12 @@ protected:
 
     virtual bool visit(AST::VariableDeclaration *ast)
     {
-        if (! ast->name)
+        if (ast->name.isEmpty())
             return false;
 
         Declaration decl;
         decl.text.fill(QLatin1Char(' '), _depth);
-        decl.text += ast->name->asString();
+        decl.text += ast->name;
 
         const SourceLocation first = ast->identifierToken;
         decl.startLine = first.startLine;
@@ -568,8 +568,8 @@ QmlJS::AST::Node *SemanticInfo::declaringMemberNoProperties(int cursorPosition)
    AST::Node *node = rangeAt(cursorPosition);
 
    if (UiObjectDefinition *objectDefinition = cast<UiObjectDefinition*>(node)) {
-       QString name = objectDefinition->qualifiedTypeNameId->name->asString();
-       if (!name.isNull() && name.at(0).isLower()) {
+       const QString &name = objectDefinition->qualifiedTypeNameId->name.toString();
+       if (!name.isEmpty() && name.at(0).isLower()) {
            QList<AST::Node *> path = rangePath(cursorPosition);
            if (path.size() > 1)
                return path.at(path.size() - 2);
@@ -579,7 +579,7 @@ QmlJS::AST::Node *SemanticInfo::declaringMemberNoProperties(int cursorPosition)
                return path.at(path.size() - 3);
        }
    } else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(node)) {
-       QString name = objectBinding->qualifiedTypeNameId->name->asString();
+       const QString &name = objectBinding->qualifiedTypeNameId->name.toString();
        if (name.contains("Gradient")) {
            QList<AST::Node *> path = rangePath(cursorPosition);
            if (path.size() > 1)
@@ -1085,7 +1085,7 @@ protected:
             id = binding->qualifiedTypeNameId;
 
         if (id) {
-            QString name = id->name->asString();
+            const QStringRef &name = id->name;
             if (!name.isEmpty() && name.at(0).isUpper()) {
                 return true;
             }
@@ -1108,12 +1108,12 @@ protected:
         if (UiScriptBinding *script = cast<UiScriptBinding *>(member)) {
             if (! script->qualifiedId)
                 return false;
-            else if (! script->qualifiedId->name)
+            else if (script->qualifiedId->name.isEmpty())
                 return false;
             else if (script->qualifiedId->next)
                 return false;
 
-            const QString propertyName = script->qualifiedId->name->asString();
+            const QStringRef &propertyName = script->qualifiedId->name;
 
             if (propertyName == QLatin1String("id"))
                 return true;
@@ -1313,7 +1313,7 @@ TextEditor::BaseTextEditorWidget::Link QmlJSTextEditorWidget::findLinkAt(const Q
 
     // string literals that could refer to a file link to them
     if (StringLiteral *literal = cast<StringLiteral *>(node)) {
-        const QString text = literal->value->asString();
+        const QString &text = literal->value.toString();
         BaseTextEditorWidget::Link link;
         link.begin = literal->literalToken.begin();
         link.end = literal->literalToken.end();
index 716e448..b5d7965 100644 (file)
@@ -104,8 +104,7 @@ protected:
 
     virtual bool visit(AST::UiPublicMember *node)
     {
-        if (node->name
-                && node->name->asString() == _name
+        if (node->name == _name
                 && _scopeChain.qmlScopeObjects().contains(_scope)) {
             _usages.append(node->identifierToken);
         }
@@ -130,7 +129,7 @@ protected:
     {
         if (node->qualifiedId
                 && !node->qualifiedId->next
-                && node->qualifiedId->name->asString() == _name
+                && node->qualifiedId->name == _name
                 && checkQmlScope()) {
             _usages.append(node->qualifiedId->identifierToken);
         }
@@ -145,7 +144,7 @@ protected:
     {
         if (node->qualifiedId
                 && !node->qualifiedId->next
-                && node->qualifiedId->name->asString() == _name
+                && node->qualifiedId->name == _name
                 && checkQmlScope()) {
             _usages.append(node->qualifiedId->identifierToken);
         }
@@ -163,7 +162,7 @@ protected:
     {
         if (node->qualifiedId
                 && !node->qualifiedId->next
-                && node->qualifiedId->name->asString() == _name
+                && node->qualifiedId->name == _name
                 && checkQmlScope()) {
             _usages.append(node->qualifiedId->identifierToken);
         }
@@ -172,7 +171,7 @@ protected:
 
     virtual bool visit(AST::IdentifierExpression *node)
     {
-        if (!node->name || node->name->asString() != _name)
+        if (node->name.isEmpty() || node->name != _name)
             return false;
 
         const ObjectValue *scope;
@@ -203,7 +202,7 @@ protected:
 
     virtual bool visit(AST::FieldMemberExpression *node)
     {
-        if (!node->name || node->name->asString() != _name)
+        if (node->name != _name)
             return true;
 
         Evaluate evaluate(&_scopeChain);
@@ -224,7 +223,7 @@ protected:
 
     virtual bool visit(AST::FunctionExpression *node)
     {
-        if (node->name && node->name->asString() == _name) {
+        if (node->name == _name) {
             if (checkLookup())
                 _usages.append(node->identifierToken);
         }
@@ -237,7 +236,7 @@ protected:
 
     virtual bool visit(AST::VariableDeclaration *node)
     {
-        if (node->name && node->name->asString() == _name) {
+        if (node->name == _name) {
             if (checkLookup())
                 _usages.append(node->identifierToken);
         }
@@ -330,7 +329,7 @@ protected:
 
     virtual bool visit(AST::UiPublicMember *node)
     {
-        if (node->memberType && node->memberType->asString() == _name){
+        if (node->memberType == _name){
             const ObjectValue * tVal = _context->lookupType(_doc.data(), QStringList(_name));
             if (tVal == _typeValue)
                 _usages.append(node->typeToken);
@@ -376,7 +375,7 @@ protected:
 
     virtual bool visit(AST::IdentifierExpression *node)
     {
-        if (!node->name || node->name->asString() != _name)
+        if (node->name != _name)
             return false;
 
         const ObjectValue *scope;
@@ -388,7 +387,7 @@ protected:
 
     virtual bool visit(AST::FieldMemberExpression *node)
     {
-        if (!node->name || node->name->asString() != _name)
+        if (node->name != _name)
             return true;
         Evaluate evaluate(&_scopeChain);
         const Value *lhsValue = evaluate(node->base);
@@ -422,7 +421,7 @@ protected:
 
     virtual bool visit(UiImport *ast)
     {
-        if (ast && ast->importId && ast->importId->asString() == _name) {
+        if (ast && ast->importId == _name) {
             const Imports *imp = _context->imports(_doc.data());
             if (!imp)
                 return false;
@@ -437,7 +436,7 @@ private:
     bool checkTypeName(UiQualifiedId *id)
     {
         for (UiQualifiedId *att = id; att; att = att->next){
-            if (att->name && att->name->asString() == _name) {
+            if (att->name == _name) {
                 const ObjectValue *objectValue = _context->lookupType(_doc.data(), id, att->next);
                 if (_typeValue == objectValue){
                     _usages.append(att->identifierToken);
@@ -522,7 +521,7 @@ protected:
     virtual bool visit(IdentifierExpression *node)
     {
         if (containsOffset(node->identifierToken)) {
-            _name = node->name->asString();
+            _name = node->name.toString();
             if ((!_name.isEmpty()) && _name.at(0).isUpper()) {
                 // a possible type
                 _targetValue = _scopeChain->lookup(_name, &_scope);
@@ -537,7 +536,7 @@ protected:
     {
         if (containsOffset(node->identifierToken)) {
             setScope(node->base);
-            _name = node->name->asString();
+            _name = node->name.toString();
             if ((!_name.isEmpty()) && _name.at(0).isUpper()) {
                 // a possible type
                 Evaluate evaluate(_scopeChain);
@@ -592,8 +591,8 @@ protected:
     virtual bool visit(UiPublicMember *node)
     {
         if (containsOffset(node->typeToken)){
-            if (node->memberType){
-                _name = node->memberType->asString();
+            if (!node->memberType.isEmpty()) {
+                _name = node->memberType.toString();
                 _targetValue = _scopeChain->context()->lookupType(_doc.data(), QStringList(_name));
                 _scope = 0;
                 _typeKind = TypeKind;
@@ -601,7 +600,7 @@ protected:
             return false;
         } else if (containsOffset(node->identifierToken)) {
             _scope = _doc->bind()->findQmlObject(_objectNode);
-            _name = node->name->asString();
+            _name = node->name.toString();
             return false;
         }
         return true;
@@ -615,7 +614,7 @@ protected:
     virtual bool visit(FunctionExpression *node)
     {
         if (containsOffset(node->identifierToken)) {
-            _name = node->name->asString();
+            _name = node->name.toString();
             return false;
         }
         return true;
@@ -624,7 +623,7 @@ protected:
     virtual bool visit(VariableDeclaration *node)
     {
         if (containsOffset(node->identifierToken)) {
-            _name = node->name->asString();
+            _name = node->name.toString();
             return false;
         }
         return true;
@@ -643,9 +642,9 @@ private:
 
     bool checkBindingName(UiQualifiedId *id)
     {
-        if (id && id->name && !id->next && containsOffset(id->identifierToken)) {
+        if (id && !id->name.isEmpty() && !id->next && containsOffset(id->identifierToken)) {
             _scope = _doc->bind()->findQmlObject(_objectNode);
-            _name = id->name->asString();
+            _name = id->name.toString();
             return true;
         }
         return false;
@@ -654,10 +653,10 @@ private:
     bool checkTypeName(UiQualifiedId *id)
     {
         for (UiQualifiedId *att = id; att; att = att->next) {
-            if (att->name && containsOffset(att->identifierToken)) {
+            if (!att->name.isEmpty() && containsOffset(att->identifierToken)) {
                 _targetValue = _scopeChain->context()->lookupType(_doc.data(), id, att->next);
                 _scope = 0;
-                _name = att->name->asString();
+                _name = att->name.toString();
                 _typeKind = TypeKind;
                 return true;
             }
index b3c39f9..93f3fd8 100644 (file)
@@ -197,8 +197,8 @@ bool HoverHandler::matchColorItem(const ScopeChain &scopeChain,
         }
     } else if (const AST::UiPublicMember *publicMember =
                AST::cast<const AST::UiPublicMember *>(member)) {
-        if (publicMember->name && posIsInSource(pos, publicMember->statement)) {
-            value = scopeChain.lookup(publicMember->name->asString());
+        if (!publicMember->name.isEmpty() && posIsInSource(pos, publicMember->statement)) {
+            value = scopeChain.lookup(publicMember->name.toString());
             if (const Reference *ref = value->asReference())
                 value = scopeChain.context()->lookupReference(ref);
             if (value && value->asColorValue()) {
@@ -317,14 +317,14 @@ static const ObjectValue *isMember(const ScopeChain &scopeChain,
 {
     const ObjectValue *owningObject = 0;
     if (AST::IdentifierExpression *identExp = AST::cast<AST::IdentifierExpression *>(node)) {
-        if (!identExp->name)
+        if (identExp->name.isEmpty())
             return 0;
-        *name = identExp->name->asString();
+        *name = identExp->name.toString();
         scopeChain.lookup(*name, &owningObject);
     } else if (AST::FieldMemberExpression *fme = AST::cast<AST::FieldMemberExpression *>(node)) {
-        if (!fme->base || !fme->name)
+        if (!fme->base || fme->name.isEmpty())
             return 0;
-        *name = fme->name->asString();
+        *name = fme->name.toString();
         const Value *base = scopeChain.evaluate(fme->base);
         if (!base)
             return 0;
@@ -332,17 +332,17 @@ static const ObjectValue *isMember(const ScopeChain &scopeChain,
         if (owningObject)
             owningObject->lookupMember(*name, scopeChain.context(), &owningObject);
     } else if (AST::UiQualifiedId *qid = AST::cast<AST::UiQualifiedId *>(node)) {
-        if (!qid->name)
+        if (qid->name.isEmpty())
             return 0;
-        *name = qid->name->asString();
+        *name = qid->name.toString();
         const Value *value = scopeChain.lookup(*name, &owningObject);
         for (AST::UiQualifiedId *it = qid->next; it; it = it->next) {
             if (!value)
                 return 0;
             const ObjectValue *next = value->asObjectValue();
-            if (!next || !it->name)
+            if (!next || it->name.isEmpty())
                 return 0;
-            *name = it->name->asString();
+            *name = it->name.toString();
             value = next->lookupMember(*name, scopeChain.context(), &owningObject);
         }
     }
index f3928ee..cc81c57 100644 (file)
@@ -168,19 +168,19 @@ protected:
     {
         if (!m_inStateType)
             return false;
-        if (!ast->qualifiedId || ! ast->qualifiedId->name || ast->qualifiedId->next)
+        if (!ast->qualifiedId || ast->qualifiedId->name.isEmpty() || ast->qualifiedId->next)
             return false;
-        if (ast->qualifiedId->name->asString() != QLatin1String("name"))
+        if (ast->qualifiedId->name != QLatin1String("name"))
             return false;
 
         ExpressionStatement *expStmt = cast<ExpressionStatement *>(ast->statement);
         if (!expStmt)
             return false;
         StringLiteral *strLit = cast<StringLiteral *>(expStmt->expression);
-        if (!strLit || !strLit->value)
+        if (!strLit || strLit->value.isEmpty())
             return false;
 
-        m_stateNames += strLit->value->asString();
+        m_stateNames += strLit->value.toString();
 
         return false;
     }
@@ -211,12 +211,12 @@ protected:
         m_scopeBuilder.pop();
     }
 
-    void processName(NameId *name, SourceLocation location)
+    void processName(const QStringRef &name, SourceLocation location)
     {
-        if (!name)
+        if (name.isEmpty())
             return;
 
-        const QString nameStr = name->asString();
+        const QString &nameStr = name.toString();
         const ObjectValue *scope = 0;
         const Value *value = m_scopeChain.lookup(nameStr, &scope);
         if (!value || !scope)
@@ -299,10 +299,10 @@ protected:
 
     bool visit(StringLiteral *ast)
     {
-        if (!ast->value)
+        if (ast->value.isEmpty())
             return false;
 
-        const QString value = ast->value->asString();
+        const QString &value = ast->value.toString();
         if (m_stateNames.contains(value)) {
             addUse(ast->literalToken, SemanticHighlighter::LocalStateNameType);
         }
index cd19095..9a9b5f9 100644 (file)
@@ -271,7 +271,7 @@ private:
         AST::IdentifierExpression *lhsIdent = AST::cast<AST::IdentifierExpression *>(binExp->left);
         AST::ObjectLiteral *rhsObjLit = AST::cast<AST::ObjectLiteral *>(binExp->right);
 
-        if (lhsIdent && rhsObjLit && (lhsIdent->name->asString() == "testcase")
+        if (lhsIdent && rhsObjLit && (lhsIdent->name == "testcase")
             && (binExp->op == QSOperator::Assign)) {
             QModelIndex index = m_model->enterTestCase(rhsObjLit);
             m_nodeToIndex.insert(rhsObjLit, index);
@@ -553,8 +553,8 @@ QModelIndex QmlOutlineModel::enterPublicMember(AST::UiPublicMember *publicMember
 {
     QMap<int, QVariant> objectData;
 
-    if (publicMember->name)
-        objectData.insert(Qt::DisplayRole, publicMember->name->asString());
+    if (!publicMember->name.isEmpty())
+        objectData.insert(Qt::DisplayRole, publicMember->name.toString());
     objectData.insert(AnnotationRole, getAnnotation(publicMember->statement));
     objectData.insert(ItemTypeRole, NonElementBindingType);
 
@@ -572,7 +572,8 @@ QModelIndex QmlOutlineModel::enterFunctionDeclaration(AST::FunctionDeclaration *
 {
     QMap<int, QVariant> objectData;
 
-    objectData.insert(Qt::DisplayRole, functionDeclaration->name->asString());
+    if (!functionDeclaration->name.isEmpty())
+        objectData.insert(Qt::DisplayRole, functionDeclaration->name.toString());
     objectData.insert(ItemTypeRole, ElementBindingType);
 
     QmlOutlineItem *item = enterNode(objectData, functionDeclaration, 0, m_icons->functionDeclarationIcon());
@@ -606,7 +607,7 @@ QModelIndex QmlOutlineModel::enterTestCaseProperties(AST::PropertyNameAndValueLi
 {
     QMap<int, QVariant> objectData;
     if (AST::IdentifierPropertyName *propertyName = AST::cast<AST::IdentifierPropertyName *>(propertyNameAndValueList->name)) {
-        objectData.insert(Qt::DisplayRole, propertyName->id->asString());
+        objectData.insert(Qt::DisplayRole, propertyName->id.toString());
         objectData.insert(ItemTypeRole, ElementBindingType);
         QmlOutlineItem *item;
         if (propertyNameAndValueList->value->kind == AST::Node::Kind_FunctionExpression) {
@@ -895,8 +896,8 @@ QString QmlOutlineModel::asString(AST::UiQualifiedId *id)
 {
     QString text;
     for (; id; id = id->next) {
-        if (id->name)
-            text += id->name->asString();
+        if (!id->name.isEmpty())
+            text += id->name;
         else
             text += QLatin1Char('?');
 
index b9daf07..87b19b0 100644 (file)
@@ -75,7 +75,7 @@ static inline const ObjectValue * getPropertyChangesTarget(Node *node, const Sco
         for (UiObjectMemberList *members = initializer->members; members; members = members->next) {
             if (UiScriptBinding *scriptBinding = cast<UiScriptBinding *>(members->member)) {
                 if (scriptBinding->qualifiedId
-                        && scriptBinding->qualifiedId->name->asString() == QLatin1String("target")
+                        && scriptBinding->qualifiedId->name == QLatin1String("target")
                         && ! scriptBinding->qualifiedId->next) {
                     Evaluate evaluator(&scopeChain);
                     const Value *targetValue = evaluator(scriptBinding->statement);
@@ -184,12 +184,12 @@ void QuickToolBar::apply(TextEditor::BaseTextEditor *editor, Document::Ptr docum
         quint32 end = 0;
         UiObjectInitializer *initializer = 0;
         if (objectDefinition) {
-            name = objectDefinition->qualifiedTypeNameId->name->asString();
+            name = objectDefinition->qualifiedTypeNameId->name.toString();
             initializer = objectDefinition->initializer;
             offset = objectDefinition->firstSourceLocation().offset;
             end = objectDefinition->lastSourceLocation().end();
         } else if (objectBinding) {
-            name = objectBinding->qualifiedTypeNameId->name->asString();
+            name = objectBinding->qualifiedTypeNameId->name.toString();
             initializer = objectBinding->initializer;
             offset = objectBinding->firstSourceLocation().offset;
             end = objectBinding->lastSourceLocation().end();
@@ -274,10 +274,10 @@ bool QuickToolBar::isAvailable(TextEditor::BaseTextEditor *, Document::Ptr docum
     UiObjectDefinition *objectDefinition = cast<UiObjectDefinition*>(node);
     UiObjectBinding *objectBinding = cast<UiObjectBinding*>(node);
     if (objectDefinition) {
-        name = objectDefinition->qualifiedTypeNameId->name->asString();
+        name = objectDefinition->qualifiedTypeNameId->name.toString();
 
     } else if (objectBinding) {
-        name = objectBinding->qualifiedTypeNameId->name->asString();
+        name = objectBinding->qualifiedTypeNameId->name.toString();
     }
 
     QStringList prototypes;
index 77e2438..01e2c31 100644 (file)
@@ -498,9 +498,9 @@ protected:
         if (unsyncronizableChanges == QmlJSLiveTextPreview::NoUnsyncronizableChanges) {
             UiObjectDefinition *parentDefinition = cast<UiObjectDefinition *>(parent);
             if (parentDefinition && parentDefinition->qualifiedTypeNameId
-                       && parentDefinition->qualifiedTypeNameId->name)
+                       && !parentDefinition->qualifiedTypeNameId->name.isEmpty())
             {
-                unsyncronizableElementName = parentDefinition->qualifiedTypeNameId->name->asString();
+                unsyncronizableElementName = parentDefinition->qualifiedTypeNameId->name.toString();
                 unsyncronizableChanges = QmlJSLiveTextPreview::ElementChangeWarning;
                 unsyncronizableChangeLine = parentDefinition->firstSourceLocation().startLine;
                 unsyncronizableChangeColumn = parentDefinition->firstSourceLocation().startColumn;
index a7f84c9..1c741b5 100644 (file)
@@ -62,14 +62,14 @@ static QString findId(UiObjectInitializer *initializer)
         return QString();
     for (UiObjectMemberList *member = initializer->members; member; member = member->next) {
         if (UiScriptBinding *script = cast<UiScriptBinding *>(member->member)) {
-            if (!script->qualifiedId || !script->qualifiedId->name || script->qualifiedId->next)
+            if (!script->qualifiedId || script->qualifiedId->name.isEmpty() || script->qualifiedId->next)
                 continue;
-            if (script->qualifiedId->name->asString() != QLatin1String("id"))
+            if (script->qualifiedId->name != QLatin1String("id"))
                 continue;
             if (ExpressionStatement *expStmt = cast<ExpressionStatement *>(script->statement)) {
                 if (IdentifierExpression *identExp = cast<IdentifierExpression *>(expStmt->expression)) {
-                    if (identExp->name)
-                        return identExp->name->asString();
+                    if (!identExp->name.isEmpty())
+                        return identExp->name.toString();
                 }
             }
         }
@@ -132,19 +132,19 @@ protected:
 
     bool visit(FunctionExpression *ast)
     {
-        if (!ast->name)
+        if (ast->name.isEmpty())
             return true;
 
         LocatorData::Entry entry = basicEntry(ast->identifierToken);
 
         entry.type = LocatorData::Function;
-        entry.displayName = ast->name->asString();
+        entry.displayName = ast->name.toString();
         entry.displayName += QLatin1Char('(');
         for (FormalParameterList *it = ast->formals; it; it = it->next) {
             if (it != ast->formals)
                 entry.displayName += QLatin1String(", ");
-            if (it->name)
-                entry.displayName += it->name->asString();
+            if (!it->name.isEmpty())
+                entry.displayName += it->name.toString();
         }
         entry.displayName += QLatin1Char(')');
         entry.symbolName = entry.displayName;
index 1cff491..f57cfe7 100755 (executable)
@@ -91,7 +91,7 @@ public:
 private:
     bool visit(QmlJS::AST::IdentifierExpression *identifier)
     {
-        QString name = identifier->name->asString();
+        const QStringRef &name = identifier->name;
         m_foundTestCase = (name == QLatin1String("testcase"));
         if (!m_foundTestCase && (name == QLatin1String("prompt") || name == QLatin1String("manualTest")))
             m_testCode->setManualTest(identifier->identifierToken.offset);
@@ -120,7 +120,7 @@ private:
             if (properties->name->kind == QmlJS::AST::Node::Kind_IdentifierPropertyName) {
                 QmlJS::AST::IdentifierPropertyName *name =
                     static_cast<QmlJS::AST::IdentifierPropertyName*>(properties->name);
-                QString nameString = name->id->asString();
+                const QString &nameString = name->id.toString();
                 if (properties->value->kind == QmlJS::AST::Node::Kind_FunctionExpression) {
                     int startLine = name->propertyNameToken.startLine;
                     int start = name->propertyNameToken.offset;