QmlProjectManager: removing declarative dependency

We can parse the .qmlproject files without using the declarative module.

Change-Id: I78a910c9ec9477f5c6fbcdca23f62ab841ca4368
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
Thomas Hartmann
2013-07-11 17:37:02 +02:00
parent 18c739c82d
commit e7f81afc4f
9 changed files with 118 additions and 63 deletions

View File

@@ -36,8 +36,6 @@
#include <QSet> #include <QSet>
#include <QTimer> #include <QTimer>
#include <qdeclarative.h>
QT_FORWARD_DECLARE_CLASS(QDir) QT_FORWARD_DECLARE_CLASS(QDir)
namespace Utils { namespace Utils {
@@ -181,10 +179,4 @@ public:
} // namespace QmlProjectManager } // namespace QmlProjectManager
QML_DECLARE_TYPE(QmlProjectManager::QmlFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::JsFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::ImageFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::CssFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::OtherFileFilterItem)
#endif // FILEFILTERITEMS_HPROJECTITEM_H #endif // FILEFILTERITEMS_HPROJECTITEM_H

View File

@@ -30,26 +30,102 @@
#include "qmlprojectfileformat.h" #include "qmlprojectfileformat.h"
#include "qmlprojectitem.h" #include "qmlprojectitem.h"
#include "filefilteritems.h" #include "filefilteritems.h"
#include <qmljs/qmljssimplereader.h>
#include <qdeclarative.h> enum {
debug = false
};
namespace {
void setupFileFilterItem(QmlProjectManager::FileFilterBaseItem *fileFilterItem, const QmlJS::SimpleReaderNode::Ptr &node)
{
const QVariant directoryProperty = node->property(QLatin1String("directory"));
if (directoryProperty.isValid())
fileFilterItem->setDirectory(directoryProperty.toString());
const QVariant recursiveProperty = node->property(QLatin1String("recursive"));
if (recursiveProperty.isValid())
fileFilterItem->setRecursive(recursiveProperty.toBool());
const QVariant pathsProperty = node->property(QLatin1String("paths"));
if (pathsProperty.isValid())
fileFilterItem->setPathsProperty(pathsProperty.toStringList());
if (debug)
qDebug() << "directory:" << directoryProperty << "recursive" << recursiveProperty << "paths" << pathsProperty;
}
} //namespace
namespace QmlProjectManager { namespace QmlProjectManager {
void QmlProjectFileFormat::registerDeclarativeTypes() QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const QString &fileName, QString *errorMessage)
{ {
qmlRegisterType<QmlProjectManager::QmlProjectContentItem>(); QmlJS::SimpleReader simpleQmlJSReader;
qmlRegisterType<QmlProjectManager::QmlProjectItem>("QmlProject",1,0,"Project");
qmlRegisterType<QmlProjectManager::QmlProjectItem>("QmlProject",1,1,"Project");
qmlRegisterType<QmlProjectManager::QmlFileFilterItem>("QmlProject",1,0,"QmlFiles"); const QmlJS::SimpleReaderNode::Ptr rootNode = simpleQmlJSReader.readFile(fileName);
qmlRegisterType<QmlProjectManager::QmlFileFilterItem>("QmlProject",1,1,"QmlFiles");
qmlRegisterType<QmlProjectManager::JsFileFilterItem>("QmlProject",1,0,"JavaScriptFiles"); if (!simpleQmlJSReader.errors().isEmpty() || !rootNode->isValid()) {
qmlRegisterType<QmlProjectManager::JsFileFilterItem>("QmlProject",1,1,"JavaScriptFiles"); qWarning() << "unable to parse:" << fileName;
qmlRegisterType<QmlProjectManager::ImageFileFilterItem>("QmlProject",1,0,"ImageFiles"); qWarning() << simpleQmlJSReader.errors();
qmlRegisterType<QmlProjectManager::ImageFileFilterItem>("QmlProject",1,1,"ImageFiles"); if (errorMessage)
qmlRegisterType<QmlProjectManager::CssFileFilterItem>("QmlProject",1,0,"CssFiles"); *errorMessage = simpleQmlJSReader.errors().join(QLatin1String(", "));
qmlRegisterType<QmlProjectManager::CssFileFilterItem>("QmlProject",1,1,"CssFiles"); return 0;
qmlRegisterType<QmlProjectManager::OtherFileFilterItem>("QmlProject",1,1,"Files"); }
if (rootNode->name() == QLatin1String("Project")) {
QmlProjectItem *projectItem = new QmlProjectItem();
const QVariant mainFileProperty = rootNode->property(QLatin1String("mainFile"));
if (mainFileProperty.isValid())
projectItem->setMainFile(mainFileProperty.toString());
const QVariant importPathsProperty = rootNode->property(QLatin1String("importPaths"));
if (importPathsProperty.isValid())
projectItem->setImportPaths(importPathsProperty.toStringList());
if (debug) {
qDebug() << "importPath:" << importPathsProperty << "mainFile:" << mainFileProperty;
}
foreach (const QmlJS::SimpleReaderNode::Ptr &childNode, rootNode->children()) {
if (childNode->name() == QLatin1String("QmlFiles")) {
if (debug)
qDebug() << "QmlFiles";
QmlFileFilterItem *qmlFileFilterItem = new QmlFileFilterItem(projectItem);
setupFileFilterItem(qmlFileFilterItem, childNode);
projectItem->appendContent(qmlFileFilterItem);
} else if (childNode->name() == QLatin1String("JavaScriptFiles")) {
if (debug)
qDebug() << "JavaScriptFiles";
JsFileFilterItem *jsFileFilterItem = new JsFileFilterItem(projectItem);
setupFileFilterItem(jsFileFilterItem, childNode);
projectItem->appendContent(jsFileFilterItem);
} else if (childNode->name() == QLatin1String("ImageFiles")) {
if (debug)
qDebug() << "ImageFiles";
ImageFileFilterItem *imageFileFilterItem = new ImageFileFilterItem(projectItem);
setupFileFilterItem(imageFileFilterItem, childNode);
projectItem->appendContent(imageFileFilterItem);
} else if (childNode->name() == QLatin1String("CssFiles")) {
if (debug)
qDebug() << "CssFiles";
CssFileFilterItem *cssFileFilterItem = new CssFileFilterItem(projectItem);
setupFileFilterItem(cssFileFilterItem, childNode);
projectItem->appendContent(cssFileFilterItem);
} else {
qWarning() << "Unkwown type:" << childNode->name();
}
}
return projectItem;
}
if (errorMessage)
*errorMessage = tr("Invalid root element: %1").arg(rootNode->name());
return 0;
} }
} // namespace QmlProjectManager } // namespace QmlProjectManager

View File

@@ -32,9 +32,14 @@
namespace QmlProjectManager { namespace QmlProjectManager {
class QmlProjectFileFormat { class QmlProjectItem;
class QmlProjectFileFormat
{
Q_DECLARE_TR_FUNCTIONS(QmlProjectManager::QmlProjectFileFormat);
public: public:
static void registerDeclarativeTypes(); static QmlProjectItem *parseProjectFile(const QString &fileName, QString *errorMessage = 0);
}; };
} // namespace QmlProjectManager } // namespace QmlProjectManager

View File

@@ -77,12 +77,6 @@ QmlProjectItem::~QmlProjectItem()
delete d_ptr; delete d_ptr;
} }
QDeclarativeListProperty<QmlProjectContentItem> QmlProjectItem::content()
{
Q_D(QmlProjectItem);
return QDeclarativeListProperty<QmlProjectContentItem>(this, d->content);
}
QString QmlProjectItem::sourceDirectory() const QString QmlProjectItem::sourceDirectory() const
{ {
Q_D(const QmlProjectItem); Q_D(const QmlProjectItem);
@@ -194,6 +188,12 @@ void QmlProjectItem::setMainFile(const QString &mainFilePath)
emit mainFileChanged(); emit mainFileChanged();
} }
void QmlProjectItem::appendContent(QmlProjectContentItem *contentItem)
{
Q_D(QmlProjectItem);
d->content.append(contentItem);
}
} // namespace QmlProjectManager } // namespace QmlProjectManager
#include "qmlprojectitem.moc" #include "qmlprojectitem.moc"

View File

@@ -33,7 +33,6 @@
#include <QObject> #include <QObject>
#include <QSet> #include <QSet>
#include <QStringList> #include <QStringList>
#include <qdeclarative.h>
namespace QmlProjectManager { namespace QmlProjectManager {
@@ -52,19 +51,14 @@ class QmlProjectItem : public QObject
Q_OBJECT Q_OBJECT
Q_DECLARE_PRIVATE(QmlProjectItem) Q_DECLARE_PRIVATE(QmlProjectItem)
Q_PROPERTY(QDeclarativeListProperty<QmlProjectManager::QmlProjectContentItem> content READ content DESIGNABLE false)
Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged) Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged)
Q_PROPERTY(QStringList importPaths READ importPaths WRITE setImportPaths NOTIFY importPathsChanged) Q_PROPERTY(QStringList importPaths READ importPaths WRITE setImportPaths NOTIFY importPathsChanged)
Q_PROPERTY(QString mainFile READ mainFile WRITE setMainFile NOTIFY mainFileChanged) Q_PROPERTY(QString mainFile READ mainFile WRITE setMainFile NOTIFY mainFileChanged)
Q_CLASSINFO("DefaultProperty", "content")
public: public:
QmlProjectItem(QObject *parent = 0); QmlProjectItem(QObject *parent = 0);
~QmlProjectItem(); ~QmlProjectItem();
QDeclarativeListProperty<QmlProjectContentItem> content();
QString sourceDirectory() const; QString sourceDirectory() const;
void setSourceDirectory(const QString &directoryPath); void setSourceDirectory(const QString &directoryPath);
@@ -77,6 +71,7 @@ public:
QString mainFile() const; QString mainFile() const;
void setMainFile(const QString &mainFilePath); void setMainFile(const QString &mainFilePath);
void appendContent(QmlProjectContentItem* contentItem);
signals: signals:
void qmlFilesChanged(const QSet<QString> &, const QSet<QString> &); void qmlFilesChanged(const QSet<QString> &, const QSet<QString> &);
@@ -90,8 +85,4 @@ protected:
} // namespace QmlProjectManager } // namespace QmlProjectManager
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectItem)
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectContentItem)
Q_DECLARE_METATYPE(QList<QmlProjectManager::QmlProjectContentItem *>)
#endif // QMLPROJECTITEM_H #endif // QMLPROJECTITEM_H

View File

@@ -29,6 +29,7 @@
#include "qmlproject.h" #include "qmlproject.h"
#include "qmlprojectfile.h" #include "qmlprojectfile.h"
#include "fileformat/qmlprojectfileformat.h"
#include "fileformat/qmlprojectitem.h" #include "fileformat/qmlprojectitem.h"
#include "qmlprojectrunconfiguration.h" #include "qmlprojectrunconfiguration.h"
#include "qmlprojectconstants.h" #include "qmlprojectconstants.h"
@@ -46,13 +47,14 @@
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtsupportconstants.h>
#include <QDeclarativeComponent>
#include <QDebug> #include <QDebug>
namespace QmlProjectManager { namespace QmlProjectManager {
namespace Internal { namespace Internal {
class QmlProjectKitMatcher : public ProjectExplorer::KitMatcher class QmlProjectKitMatcher : public ProjectExplorer::KitMatcher
{ {
public: public:
@@ -182,22 +184,16 @@ void QmlProject::parseProject(RefreshOptions options)
if (options & ProjectFile) if (options & ProjectFile)
delete m_projectItem.data(); delete m_projectItem.data();
if (!m_projectItem) { if (!m_projectItem) {
Utils::FileReader reader; QString errorMessage;
if (reader.fetch(m_fileName)) { m_projectItem = QmlProjectFileFormat::parseProjectFile(m_fileName, &errorMessage);
QDeclarativeComponent *component = new QDeclarativeComponent(&m_engine, this); if (m_projectItem) {
component->setData(reader.data(), QUrl::fromLocalFile(m_fileName)); connect(m_projectItem.data(), SIGNAL(qmlFilesChanged(QSet<QString>,QSet<QString>)),
if (component->isReady() this, SLOT(refreshFiles(QSet<QString>,QSet<QString>)));
&& qobject_cast<QmlProjectItem*>(component->create())) {
m_projectItem = qobject_cast<QmlProjectItem*>(component->create()); } else {
connect(m_projectItem.data(), SIGNAL(qmlFilesChanged(QSet<QString>,QSet<QString>)), messageManager->printToOutputPane(tr("Error while loading project file %1.").arg(m_fileName), Core::MessageManager::NoModeSwitch);
this, SLOT(refreshFiles(QSet<QString>,QSet<QString>))); messageManager->printToOutputPane(errorMessage, Core::MessageManager::NoModeSwitch);
} else { }
messageManager->printToOutputPane(tr("Error while loading project file %1.").arg(m_fileName), Core::MessageManager::NoModeSwitch);
messageManager->printToOutputPane(component->errorString(), Core::MessageManager::NoModeSwitch);
}
} else {
messageManager->printToOutputPane(tr("QML project: %1").arg(reader.errorString()), Core::MessageManager::NoModeSwitch);
}
} }
if (m_projectItem) { if (m_projectItem) {
m_projectItem.data()->setSourceDirectory(projectDir().path()); m_projectItem.data()->setSourceDirectory(projectDir().path());

View File

@@ -34,7 +34,6 @@
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <QDeclarativeEngine>
#include <QPointer> #include <QPointer>
namespace ProjectExplorer { class RunConfiguration; } namespace ProjectExplorer { class RunConfiguration; }
@@ -119,8 +118,6 @@ private:
// plain format // plain format
QStringList m_files; QStringList m_files;
// qml based, new format
QDeclarativeEngine m_engine;
QPointer<QmlProjectItem> m_projectItem; QPointer<QmlProjectItem> m_projectItem;
Internal::QmlProjectNode *m_rootNode; Internal::QmlProjectNode *m_rootNode;

View File

@@ -1,4 +1,4 @@
QT += network declarative QT += network
include(../../qtcreatorplugin.pri) include(../../qtcreatorplugin.pri)
include(fileformat/fileformat.pri) include(fileformat/fileformat.pri)

View File

@@ -76,8 +76,6 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
Internal::QmlApplicationWizard::createInstances(this); Internal::QmlApplicationWizard::createInstances(this);
QmlProjectFileFormat::registerDeclarativeTypes();
Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance(); Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance();
iconProvider->registerIconOverlayForSuffix(QIcon(QLatin1String(":/qmlproject/images/qmlproject.png")), iconProvider->registerIconOverlayForSuffix(QIcon(QLatin1String(":/qmlproject/images/qmlproject.png")),
QLatin1String("qmlproject")); QLatin1String("qmlproject"));