diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp index 826f44c469e1a8f5f1f39bfeca1df8846fbfe5b6..b5b447ad602c76f42273d283487f91fccbd055cb 100644 --- a/src/plugins/qt4projectmanager/profilereader.cpp +++ b/src/plugins/qt4projectmanager/profilereader.cpp @@ -35,7 +35,7 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; -ProFileReader::ProFileReader() : ProFileEvaluator(&m_option) +ProFileReader::ProFileReader(ProFileOption *option) : ProFileEvaluator(option) { } @@ -45,14 +45,6 @@ ProFileReader::~ProFileReader() delete pf; } -void ProFileReader::setQtVersion(const QtVersion *qtVersion) -{ - if (qtVersion) - m_option.properties = qtVersion->versionInfo(); - else - m_option.properties.clear(); -} - bool ProFileReader::readProFile(const QString &fileName) { //disable caching -> list of include files is not updated otherwise diff --git a/src/plugins/qt4projectmanager/profilereader.h b/src/plugins/qt4projectmanager/profilereader.h index 06c1d13598bdef9466541c9541afaa0361aca459..7e927d181b214acdb77dc9c5a1ea4174ab2a0162 100644 --- a/src/plugins/qt4projectmanager/profilereader.h +++ b/src/plugins/qt4projectmanager/profilereader.h @@ -31,7 +31,6 @@ #define PROFILEREADER_H #include "profileevaluator.h" -#include "qtversionmanager.h" #include <QtCore/QObject> #include <QtCore/QMap> @@ -44,10 +43,9 @@ class ProFileReader : public QObject, public ProFileEvaluator Q_OBJECT public: - ProFileReader(); + ProFileReader(ProFileOption *option); ~ProFileReader(); - void setQtVersion(const QtVersion *qtVersion); bool readProFile(const QString &fileName); QList<ProFile*> includeFiles() const; @@ -67,7 +65,6 @@ private: private: QMap<QString, ProFile *> m_includeFiles; QList<ProFile *> m_proFiles; - ProFileOption m_option; }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 5f121819d659863c607b158153314b1e6c856eab..39145af1628032e39074a4eb728e6ed5c9707403 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -571,8 +571,7 @@ void MaemoRunConfiguration::updateTarget() return; } - QtVersion *qtVersion = qt4bc->qtVersion(); - ProFileReader *reader = proFileNode->createProFileReader(); + ProFileReader *reader = qt4Project->createProFileReader(proFileNode); reader->setCumulative(false); // Find out what flags we pass on to qmake @@ -582,7 +581,7 @@ void MaemoRunConfiguration::updateTarget() reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments); if (!reader->readProFile(m_proFilePath)) { - delete reader; + qt4Project->destroyProFileReader(reader); Core::ICore::instance()->messageManager()->printToOutputPane(tr( "Could not parse %1. The Maemo run configuration %2 " "can not be started.").arg(m_proFilePath).arg(name())); @@ -620,7 +619,7 @@ void MaemoRunConfiguration::updateTarget() target = QFileInfo(m_proFilePath).baseName(); m_executable = QDir::cleanPath(baseDir + QLatin1Char('/') + target); - delete reader; + qt4Project->destroyProFileReader(reader); } emit targetInformationChanged(); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 9b97d702346921f3fea6c05d1bdf107e8a1c5a74..bcff5409a0b50e046c9e1c776ffe414b60b43cbe 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -288,8 +288,7 @@ void S60DeviceRunConfiguration::updateTarget() emit targetInformationChanged(); return; } - QtVersion *qtVersion = qt4bc->qtVersion(); - ProFileReader *reader = proFileNode->createProFileReader(); + ProFileReader *reader = qt4Project()->createProFileReader(proFileNode); reader->setCumulative(false); // Find out what flags we pass on to qmake @@ -299,7 +298,7 @@ void S60DeviceRunConfiguration::updateTarget() reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments); if (!reader->readProFile(m_proFilePath)) { - delete reader; + qt4Project()->destroyProFileReader(reader); Core::ICore::instance()->messageManager()->printToOutputPane(tr("Could not parse %1. The QtS60 Device run configuration %2 can not be started.").arg(m_proFilePath).arg(name())); return; } @@ -346,7 +345,7 @@ void S60DeviceRunConfiguration::updateTarget() else m_target = QLatin1String("urel"); m_baseFileName += QLatin1Char('_') + m_platform + QLatin1Char('_') + m_target; - delete reader; + qt4Project()->destroyProFileReader(reader); m_cachedTargetInformationValid = true; emit targetInformationChanged(); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp index 82bd78e2f29cf95020022024a1575401a47e4f47..dd565d164e205c71adedafdd0a2b7c2586753b5a 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp @@ -135,8 +135,7 @@ void S60EmulatorRunConfiguration::updateTarget() emit targetInformationChanged(); return; } - QtVersion *qtVersion = qt4bc->qtVersion(); - ProFileReader *reader = proFileNode->createProFileReader(); + ProFileReader *reader = qt4Project()->createProFileReader(proFileNode); reader->setCumulative(false); // Find out what flags we pass on to qmake @@ -146,11 +145,12 @@ void S60EmulatorRunConfiguration::updateTarget() reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments); if (!reader->readProFile(m_proFilePath)) { - delete reader; + qt4Project()->destroyProFileReader(reader); Core::ICore::instance()->messageManager()->printToOutputPane(tr("Could not parse %1. The Qt for Symbian emulator run configuration %2 can not be started.").arg(m_proFilePath).arg(name())); return; } + QtVersion *qtVersion = qt4bc->qtVersion(); QString baseDir = S60Manager::instance()->deviceForQtVersion(qtVersion).epocRoot; QString qmakeBuildConfig = "urel"; if (qt4bc->qmakeBuildConfiguration() & QtVersion::DebugBuild) @@ -165,7 +165,7 @@ void S60EmulatorRunConfiguration::updateTarget() QDir::cleanPath(baseDir + QLatin1Char('/') + target)); m_executable += QLatin1String(".exe"); - delete reader; + qt4Project()->destroyProFileReader(reader); m_cachedTargetInformationValid = true; emit targetInformationChanged(); } diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 4f5864b816a4f6ec24cfc3bab34f40bb9295d581..f4f228f6e11a0f7b15e0cc41a69c7c7c17855b9c 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -560,10 +560,10 @@ void Qt4PriFileNode::changeFiles(const FileType fileType, if (filePaths.isEmpty()) return; - ProFileReader *reader = m_qt4ProFileNode->createProFileReader(); + ProFileReader *reader = m_project->createProFileReader(m_qt4ProFileNode); if (!reader->readProFile(m_qt4ProFileNode->path())) { m_project->proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath)); - delete reader; + m_project->destroyProFileReader(reader); return; } @@ -576,7 +576,7 @@ void Qt4PriFileNode::changeFiles(const FileType fileType, // Check for modified editors if (!saveModifiedEditors(m_projectFilePath)) { - delete reader; + m_project->destroyProFileReader(reader); return; } @@ -661,7 +661,7 @@ void Qt4PriFileNode::changeFiles(const FileType fileType, // save file save(includeFile); - delete reader; + m_project->destroyProFileReader(reader); } void Qt4PriFileNode::save(ProFile *includeFile) @@ -805,10 +805,10 @@ void Qt4ProFileNode::scheduleUpdate() void Qt4ProFileNode::update() { - ProFileReader *reader = createProFileReader(); + ProFileReader *reader = m_project->createProFileReader(this); if (!reader->readProFile(m_projectFilePath)) { m_project->proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath)); - delete reader; + m_project->destroyProFileReader(reader); invalidate(); return; } @@ -952,7 +952,7 @@ void Qt4ProFileNode::update() if (Qt4NodesWatcher *qt4Watcher = qobject_cast<Qt4NodesWatcher*>(watcher)) emit qt4Watcher->proFileUpdated(this); - delete reader; + m_project->destroyProFileReader(reader); } namespace { @@ -1084,23 +1084,6 @@ QStringList Qt4ProFileNode::updateUiFiles() return toUpdate; } -ProFileReader *Qt4ProFileNode::createProFileReader() const -{ - ProFileReader *reader = new ProFileReader(); - connect(reader, SIGNAL(errorFound(QString)), - m_project, SLOT(proFileParseError(QString))); - - Qt4BuildConfiguration *qt4bc = m_project->activeQt4BuildConfiguration(); - - QtVersion *version = qt4bc->qtVersion(); - if (version->isValid()) - reader->setQtVersion(version); - - reader->setOutputDir(buildDir()); - - return reader; -} - Qt4ProFileNode *Qt4ProFileNode::createSubProFileNode(const QString &path) { Qt4ProFileNode *subProFileNode = new Qt4ProFileNode(m_project, path); diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index f9bce3cf5a15b855eb6968382018c8d4c520097e..7eb524966269a1a73489cdc6ff9c4736878cab90 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -198,9 +198,6 @@ public: Qt4ProFileNode *findProFileFor(const QString &string); - //internal - ProFileReader *createProFileReader() const; - public slots: void scheduleUpdate(); void update(); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 3c5475efdbd94b5641600c214c8b3062d167f433..1d9a753dbc86d2bee3d88b6ccf6f5633fde4568c 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -320,7 +320,8 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) : m_fileInfo(new Qt4ProjectFile(this, fileName, this)), m_isApplication(true), m_projectFiles(new Qt4ProjectFiles), - m_lastActiveQt4BuildConfiguration(0) + m_lastActiveQt4BuildConfiguration(0), + m_proFileOption(0) { m_manager->registerProject(this); @@ -855,6 +856,38 @@ void Qt4Project::proFileParseError(const QString &errorMessage) Core::ICore::instance()->messageManager()->printToOutputPane(errorMessage); } +ProFileReader *Qt4Project::createProFileReader(Qt4ProFileNode *qt4ProFileNode) +{ + if (!m_proFileOption) { + m_proFileOption = new ProFileOption; + m_proFileOptionRefCnt = 0; + + if (Qt4BuildConfiguration *qt4bc = activeQt4BuildConfiguration()) { + QtVersion *version = qt4bc->qtVersion(); + if (version->isValid()) + m_proFileOption->properties = version->versionInfo(); + } + } + ++m_proFileOptionRefCnt; + + ProFileReader *reader = new ProFileReader(m_proFileOption); + connect(reader, SIGNAL(errorFound(QString)), + this, SLOT(proFileParseError(QString))); + + reader->setOutputDir(qt4ProFileNode->buildDir()); + + return reader; +} + +void Qt4Project::destroyProFileReader(ProFileReader *reader) +{ + delete reader; + if (!--m_proFileOptionRefCnt) { + delete m_proFileOption; + m_proFileOption = 0; + } +} + Qt4ProFileNode *Qt4Project::rootProjectNode() const { return m_rootProjectNode; diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 7b9b2249c3f15762c51f18b8f85c4201365459ae..fec4d5670a1309f3d98c729853b9b3c4041ef0ec 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -59,7 +59,7 @@ namespace CppTools { } QT_BEGIN_NAMESPACE -class ProFile; +class ProFileOption; QT_END_NAMESPACE namespace Qt4ProjectManager { @@ -95,9 +95,6 @@ class Qt4ProjectFile : public Core::IFile { Q_OBJECT - // needed for createProFileReader - friend class Internal::Qt4RunConfiguration; - public: Qt4ProjectFile(Qt4Project *project, const QString &filePath, QObject *parent = 0); @@ -196,6 +193,9 @@ public: virtual QStringList includePaths(const QString &fileName) const; virtual QStringList frameworkPaths(const QString &fileName) const; + Internal::ProFileReader *createProFileReader(Internal::Qt4ProFileNode *qt4ProFileNode); + void destroyProFileReader(Internal::ProFileReader *reader); + signals: /// convenience signal, emitted if either the active buildconfiguration emits /// targetInformationChanged() or if the active build configuration changes @@ -262,6 +262,10 @@ private: friend class Qt4ProjectFile; friend class Internal::Qt4ProjectConfigWidget; + + // cached data during project rescan + ProFileOption *m_proFileOption; + int m_proFileOptionRefCnt; }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index 8422e015180e7e4ab2b6a32e5e22479c74e9e5a3..d5eb28df2ef89afb3b3e3a7443a2e9b70a98954d 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -572,7 +572,7 @@ void Qt4RunConfiguration::updateTarget() emit effectiveTargetInformationChanged(); return; } - ProFileReader *reader = proFileNode->createProFileReader(); + ProFileReader *reader = qt4Project()->createProFileReader(proFileNode); reader->setCumulative(false); // Find out what flags we pass on to qmake @@ -582,7 +582,7 @@ void Qt4RunConfiguration::updateTarget() reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments); if (!reader->readProFile(m_proFilePath)) { - delete reader; + qt4Project()->destroyProFileReader(reader); Core::ICore::instance()->messageManager()->printToOutputPane(tr("Could not parse %1. The Qt4 run configuration %2 can not be started.").arg(m_proFilePath).arg(name())); return; } @@ -636,7 +636,7 @@ void Qt4RunConfiguration::updateTarget() m_executable += QLatin1String(".exe"); #endif - delete reader; + qt4Project()->destroyProFileReader(reader); m_cachedTargetInformationValid = true; diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 2893b1fe1023b6af6831ec5390243eae6374cc05..db1888399f025050eebc8afeb17ebad5e7fbec51 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1205,8 +1205,9 @@ void QtVersion::updateToolChainAndMkspec() const // qDebug()<<"mkspec for "<<qmakeCommand()<<" is "<<m_mkspec<<m_mkspecFullPath; - ProFileReader *reader = new ProFileReader(); - reader->setQtVersion(this); + ProFileOption option; + option.properties = versionInfo(); + ProFileReader *reader = new ProFileReader(&option); reader->setCumulative(false); reader->setParsePreAndPostFiles(false); reader->readProFile(m_mkspecFullPath + "/qmake.conf");