diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp index 19408dbb091726348fec41b1343738d325b86efb..8abc6eac7d60d5dbabe390cd974ebc3cd5109550 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp @@ -10,6 +10,7 @@ class QmlProjectItemPrivate : public QObject { public: QString sourceDirectory; QStringList importPaths; + QStringList absoluteImportPaths; QList<QmlFileFilterItem*> qmlFileFilters() const; @@ -77,23 +78,34 @@ void QmlProjectItem::setSourceDirectory(const QString &directoryPath) } } + setImportPaths(d->importPaths); + emit sourceDirectoryChanged(); } QStringList QmlProjectItem::importPaths() const { Q_D(const QmlProjectItem); - return d->importPaths; + return d->absoluteImportPaths; } void QmlProjectItem::setImportPaths(const QStringList &importPaths) { Q_D(QmlProjectItem); - if (d->importPaths == importPaths) + if (d->importPaths != importPaths) + d->importPaths = importPaths; + + // convert to absolute paths + QStringList absoluteImportPaths; + const QDir sourceDir(sourceDirectory()); + foreach (const QString &importPath, importPaths) + absoluteImportPaths += QDir::cleanPath(sourceDir.absoluteFilePath(importPath)); + + if (d->absoluteImportPaths == absoluteImportPaths) return; - d->importPaths = importPaths; + d->absoluteImportPaths = absoluteImportPaths; emit importPathsChanged(); } diff --git a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp index 4edc8857c27cf8fd5635f05dfa6bbd71e6ad1f88..eafbc0385ba642b6ddcb629480723e0b2f0160dc 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp @@ -156,7 +156,7 @@ Core::GeneratedFiles QmlProjectApplicationWizard::generateFiles(const QWizard *w << " }" << endl //: Comment added to generated .qmlproject file << " /* " << tr("List of plugin directories passed to QML runtime", "qmlproject Template") << " */" << endl - << " // importPaths: [ \" ../exampleplugin \" ]" << endl + << " // importPaths: [ \"../exampleplugin\" ]" << endl << "}" << endl; } Core::GeneratedFile generatedCreatorFile(creatorFileName); diff --git a/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp b/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp index a8d1349ac7bac70de7f0144e899092fad774608f..39afe447062bca9cfd59728474a22611c2f2d6d7 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp @@ -172,7 +172,7 @@ Core::GeneratedFiles QmlProjectImportWizard::generateFiles(const QWizard *w, << " }" << endl //: Comment added to generated .qmlproject file << " /* " << tr("List of plugin directories passed to QML runtime", "qmlproject Template") << " */" << endl - << " // importPaths: [ \" ../exampleplugin \" ]" << endl + << " // importPaths: [ \"../exampleplugin\" ]" << endl << "}" << endl; } Core::GeneratedFile generatedCreatorFile(creatorFileName); diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index 769dddd60a4424fa987b3420a2e5925cb76dcec4..7d7c1efa7bb30a2d33a76c78de9fcb557a8665f5 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -1048,10 +1048,28 @@ void ProFileEvaluator::Private::visitProVariable( m_filevaluemap[currentProFile()][varName] = varVal; } } else { - // We are greedy for values. zipEmpty(&varVal); - valuesRef(varName) += varVal; - m_filevaluemap[currentProFile()][varName] += varVal; + if (!varVal.isEmpty()) { + // We are greedy for values. But avoid exponential growth. + ProStringList &v = valuesRef(varName); + if (v.isEmpty()) { + v = varVal; + } else { + ProStringList old = v; + v = varVal; + QSet<ProString> has; + has.reserve(v.size()); + foreach (const ProString &s, v) + has.insert(s); + v.reserve(v.size() + old.size()); + foreach (const ProString &s, old) + if (!has.contains(s)) + v << s; + } + // These values will not be used for further processing inside + // the evaluator. Duplicate elimination happens later. + m_filevaluemap[currentProFile()][varName] += varVal; + } } break; case TokAppendUnique: // *= @@ -3140,7 +3158,7 @@ ProFileEvaluator::TemplateType ProFileEvaluator::templateType() const { const ProStringList &templ = d->values(statics.strTEMPLATE); if (templ.count() >= 1) { - const QString &t = templ.last().toQString(); + const QString &t = templ.at(0).toQString(); if (!t.compare(QLatin1String("app"), Qt::CaseInsensitive)) return TT_Application; if (!t.compare(QLatin1String("lib"), Qt::CaseInsensitive))