summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2018-01-10 09:36:56 +0100
committerThomas Hartmann <thomas.hartmann@qt.io>2018-01-23 17:03:02 +0000
commitf00b805da17bc7a25237c0bbde713f0d2deed7d7 (patch)
treea478e1251506f92e365cea3fb3752ec4dbc2b55c
parenta40f11e071d78eca267edb75f8808025fcd26a9c (diff)
downloadqt-creator-f00b805da17bc7a25237c0bbde713f0d2deed7d7.tar.gz
QmlDesigner: Add features to .metainfo file
Allows black listing and white listing of imports. The .metainfo files of QML and QmlDesigner plugins currently define the contents of the item library. This patch also allows to blacklist imports in the import manager and to define important imports that can e. g. be added using a tag list. Change-Id: I358cf7abe6dc68d54f33488ae7d164fc10e5ea94 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h9
-rw-r--r--src/plugins/qmldesigner/designercore/include/metainforeader.h2
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp26
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp21
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp35
5 files changed, 84 insertions, 9 deletions
diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h
index 6233b31578..8b74335209 100644
--- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h
+++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h
@@ -106,6 +106,12 @@ public:
bool containsEntry(const ItemLibraryEntry &entry);
void clearEntries();
+ QStringList blacklistImports() const;
+ QStringList showTagsForImports() const;
+
+ void addBlacklistImports(const QStringList &list);
+ void addShowTagsForImports(const QStringList &list);
+
signals:
void entriesChanged();
@@ -116,6 +122,9 @@ private: // functions
private: // variables
QHash<QString, ItemLibraryEntry> m_nameToEntryHash;
QPointer<ItemLibraryInfo> m_baseInfo;
+
+ QStringList m_blacklistImports;
+ QStringList m_showTagsForImports;
};
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/include/metainforeader.h b/src/plugins/qmldesigner/designercore/include/metainforeader.h
index de8e220698..375d161885 100644
--- a/src/plugins/qmldesigner/designercore/include/metainforeader.h
+++ b/src/plugins/qmldesigner/designercore/include/metainforeader.h
@@ -66,6 +66,7 @@ private:
ParsingDocument,
ParsingMetaInfo,
ParsingType,
+ ParsingImports,
ParsingItemLibrary,
ParsingHints,
ParsingProperty,
@@ -81,6 +82,7 @@ private:
ParserSate readQmlSourceElement(const QString &name);
void readTypeProperty(const QString &name, const QVariant &value);
+ void readImportsProperty(const QString &name, const QVariant &value);
void readItemLibraryEntryProperty(const QString &name, const QVariant &value);
void readPropertyProperty(const QString &name, const QVariant &value);
void readQmlSourceProperty(const QString &name, const QVariant &value);
diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
index d18f252c88..30fe3b4cc2 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
@@ -337,6 +337,32 @@ void ItemLibraryInfo::clearEntries()
emit entriesChanged();
}
+QStringList ItemLibraryInfo::blacklistImports() const
+{
+ auto list = m_blacklistImports;
+ if (m_baseInfo)
+ list.append(m_baseInfo->m_blacklistImports);
+ return list;
+}
+
+QStringList ItemLibraryInfo::showTagsForImports() const
+{
+ auto list = m_showTagsForImports;
+ if (m_baseInfo)
+ list.append(m_baseInfo->m_showTagsForImports);
+ return list;
+}
+
+void ItemLibraryInfo::addBlacklistImports(const QStringList &list)
+{
+ m_blacklistImports.append(list);
+}
+
+void ItemLibraryInfo::addShowTagsForImports(const QStringList &list)
+{
+ m_showTagsForImports.append(list);
+}
+
void ItemLibraryInfo::setBaseInfo(ItemLibraryInfo *baseInfo)
{
m_baseInfo = baseInfo;
diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp
index 1caff4817e..9df2a85c7d 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp
@@ -40,6 +40,7 @@ enum {
const QString rootElementName = QStringLiteral("MetaInfo");
const QString typeElementName = QStringLiteral("Type");
+const QString importsElementName = QStringLiteral("Imports");
const QString ItemLibraryEntryElementName = QStringLiteral("ItemLibraryEntry");
const QString HintsElementName = QStringLiteral("Hints");
const QString QmlSourceElementName = QStringLiteral("QmlSource");
@@ -106,6 +107,7 @@ void MetaInfoReader::elementEnd()
switch (parserState()) {
case ParsingMetaInfo: setParserState(Finished); break;
case ParsingType: setParserState(ParsingMetaInfo); break;
+ case ParsingImports: setParserState(ParsingMetaInfo); break;
case ParsingItemLibrary: keepCurrentItemLibraryEntry(); setParserState((ParsingType)); break;
case ParsingHints: setParserState(ParsingType); break;
case ParsingProperty: insertProperty(); setParserState(ParsingItemLibrary); break;
@@ -123,6 +125,7 @@ void MetaInfoReader::propertyDefinition(const QString &name, const QVariant &val
{
switch (parserState()) {
case ParsingType: readTypeProperty(name, value); break;
+ case ParsingImports: readImportsProperty(name, value); break;
case ParsingItemLibrary: readItemLibraryEntryProperty(name, value); break;
case ParsingProperty: readPropertyProperty(name, value); break;
case ParsingQmlSource: readQmlSourceProperty(name, value); break;
@@ -156,6 +159,8 @@ MetaInfoReader::ParserSate MetaInfoReader::readMetaInfoRootElement(const QString
m_currentIcon.clear();
m_currentHints.clear();
return ParsingType;
+ } else if (name == importsElementName) {
+ return ParsingImports;
} else {
addErrorInvalidType(name);
return Error;
@@ -207,6 +212,20 @@ MetaInfoReader::ParserSate MetaInfoReader::readQmlSourceElement(const QString &n
return Error;
}
+void MetaInfoReader::readImportsProperty(const QString &name, const QVariant &value)
+{
+ const auto values = value.toStringList();
+
+ if (name == "blacklistImports" && !values.isEmpty()) {
+ m_metaInfo.itemLibraryInfo()->addBlacklistImports(values);
+ } else if (name == "showTagsForImports" && !values.isEmpty()) {
+ m_metaInfo.itemLibraryInfo()->addShowTagsForImports(values);
+ } else {
+ addError(tr("Unknown property for Imports %1").arg(name), currentSourceLocation());
+ setParserState(Error);
+ }
+}
+
void MetaInfoReader::readTypeProperty(const QString &name, const QVariant &value)
{
if (name == QLatin1String("name")) {
@@ -242,7 +261,7 @@ void MetaInfoReader::readItemLibraryEntryProperty(const QString &name, const QVa
void MetaInfoReader::readPropertyProperty(const QString &name, const QVariant &value)
{
if (name == QStringLiteral("name")) {
- m_currentPropertyName = value.toByteArray();
+ m_currentPropertyName = value.toByteArray();
} else if (name == QStringLiteral("type")) {
m_currentPropertyType = value.toString();
} else if (name == QStringLiteral("value")) {
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index f94cd99fb7..3f4e60fb32 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -29,16 +29,18 @@
#include "modelnodepositionstorage.h"
#include "abstractproperty.h"
#include "bindingproperty.h"
+#include "enumeration.h"
#include "filemanager/firstdefinitionfinder.h"
#include "filemanager/objectlengthcalculator.h"
#include "filemanager/qmlrefactoring.h"
+#include "itemlibraryinfo.h"
+#include "metainfo.h"
+#include "nodemetainfo.h"
#include "nodeproperty.h"
+#include "signalhandlerproperty.h"
#include "propertyparser.h"
#include "rewriterview.h"
#include "variantproperty.h"
-#include "signalhandlerproperty.h"
-#include "nodemetainfo.h"
-#include "enumeration.h"
#include <qmljs/qmljsevaluate.h>
#include <qmljs/qmljslink.h>
@@ -790,7 +792,20 @@ static bool isLatestImportVersion(const ImportKey &importKey, const QHash<QStrin
&& filteredPossibleImportKeys.value(importKey.path()).minorVersion < importKey.minorVersion);
}
-static bool isBlacklistImport(const ImportKey &importKey)
+static bool filterByMetaInfo(const ImportKey &importKey, Model *model)
+{
+ if (model) {
+ for (const QString &filter : model->metaInfo().itemLibraryInfo()->blacklistImports()) {
+ if (importKey.libraryQualifiedPath().contains(filter))
+ return true;
+ }
+
+ }
+
+ return false;
+}
+
+static bool isBlacklistImport(const ImportKey &importKey, Model *model)
{
const QString &importPathFirst = importKey.splitPath.constFirst();
const QString &importPathLast = importKey.splitPath.constLast();
@@ -799,6 +814,7 @@ static bool isBlacklistImport(const ImportKey &importKey)
|| importPathFirst == QStringLiteral("QtQml")
|| (importPathFirst == QStringLiteral("QtQuick") && importPathLast == QStringLiteral("PrivateWidgets"))
|| importPathLast == QStringLiteral("Private")
+ || importPathLast == QStringLiteral("private")
|| importKey.libraryQualifiedPath() == QStringLiteral("QtQuick.Particles") //Unsupported
|| importKey.libraryQualifiedPath() == QStringLiteral("QtQuick.Dialogs") //Unsupported
|| importKey.libraryQualifiedPath() == QStringLiteral("QtQuick.Controls.Styles") //Unsupported
@@ -813,14 +829,16 @@ static bool isBlacklistImport(const ImportKey &importKey)
|| importKey.libraryQualifiedPath() == QStringLiteral("QtBluetooth")
|| importKey.libraryQualifiedPath() == QStringLiteral("Enginio")
- || (importKey.splitPath.count() == 1 && importPathFirst == QStringLiteral("QtQuick")); // Don't show Quick X.X imports
+ // Don't show Quick X.X imports
+ || (importKey.splitPath.count() == 1 && importPathFirst == QStringLiteral("QtQuick"))
+ || filterByMetaInfo(importKey, model);
}
-static QHash<QString, ImportKey> filterPossibleImportKeys(const QSet<ImportKey> &possibleImportKeys)
+static QHash<QString, ImportKey> filterPossibleImportKeys(const QSet<ImportKey> &possibleImportKeys, Model *model)
{
QHash<QString, ImportKey> filteredPossibleImportKeys;
foreach (const ImportKey &importKey, possibleImportKeys) {
- if (isLatestImportVersion(importKey, filteredPossibleImportKeys) && !isBlacklistImport(importKey))
+ if (isLatestImportVersion(importKey, filteredPossibleImportKeys) && !isBlacklistImport(importKey, model))
filteredPossibleImportKeys.insert(importKey.path(), importKey);
}
@@ -868,7 +886,8 @@ static QList<QmlDesigner::Import> generatePossibleLibraryImports(const QHash<QSt
void TextToModelMerger::setupPossibleImports(const QmlJS::Snapshot &snapshot, const QmlJS::ViewerContext &viewContext)
{
- QHash<QString, ImportKey> filteredPossibleImportKeys = filterPossibleImportKeys(snapshot.importDependencies()->libraryImports(viewContext));
+ QHash<QString, ImportKey> filteredPossibleImportKeys =
+ filterPossibleImportKeys(snapshot.importDependencies()->libraryImports(viewContext), m_rewriterView->model());
removeUsedImports(filteredPossibleImportKeys, m_scopeChain->context()->imports(m_document.data())->all());