aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2022-04-19 16:44:28 +0200
committerMarco Bubke <marco.bubke@qt.io>2022-04-21 09:30:52 +0000
commitd4eb0aff56ca3b40a99f83f9df61c4b81d859eb9 (patch)
treea581f483369738074ca59c2fb310725210bdb232
parent697fd3ac5caea3a79e2377abcaff1c332bc2c67e (diff)
QmlDesigner: Support enumeration aliases in qmltypes
Task-number: QDS-6768 Change-Id: I93de3c336cf1dacd0789526945929d10011a9132 Reviewed-by: Henning Gründl <henning.gruendl@qt.io>
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp78
-rw-r--r--tests/unit/unittest/qmltypesparser-test.cpp83
2 files changed, 146 insertions, 15 deletions
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp
index 9d8e41d981..99c64c7a6f 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp
+++ b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp
@@ -140,18 +140,32 @@ Storage::ExportedTypes createExports(const QList<QQmlJSScope::Export> &qmlExport
return exportedTypes;
}
-Storage::ExportedTypes createCppEnumerationExports(Utils::SmallStringView interanalName,
+Utils::SmallString createCppEnumerationExport(Utils::SmallStringView typeName,
+ Utils::SmallStringView enumerationName)
+{
+ Utils::SmallString cppExportedTypeName{typeName};
+ cppExportedTypeName += "::";
+ cppExportedTypeName += enumerationName;
+
+ return cppExportedTypeName;
+}
+
+Storage::ExportedTypes createCppEnumerationExports(Utils::SmallStringView typeName,
ModuleId cppModuleId,
- Utils::SmallStringView enumeration)
+ Utils::SmallStringView enumerationName,
+ Utils::SmallStringView enumerationAlias)
{
Storage::ExportedTypes exportedTypes;
- exportedTypes.reserve(1);
- Utils::SmallString cppExportedTypeName{interanalName};
- cppExportedTypeName += "::";
- cppExportedTypeName += enumeration;
+ if (!enumerationAlias.empty()) {
+ exportedTypes.reserve(2);
+ exportedTypes.emplace_back(cppModuleId,
+ createCppEnumerationExport(typeName, enumerationAlias));
+ } else {
+ exportedTypes.reserve(1);
+ }
- exportedTypes.emplace_back(cppModuleId, cppExportedTypeName);
+ exportedTypes.emplace_back(cppModuleId, createCppEnumerationExport(typeName, enumerationName));
return exportedTypes;
}
@@ -317,6 +331,38 @@ Storage::EnumerationDeclarations createEnumeration(const QHash<QString, QQmlJSMe
return enumerationDeclarations;
}
+void addEnumerationType(EnumerationTypes &enumerationTypes,
+ Storage::Types &types,
+ Utils::SmallStringView typeName,
+ Utils::SmallStringView enumerationName,
+ SourceId sourceId,
+ ModuleId cppModuleId,
+ Utils::SmallStringView enumerationAlias)
+{
+ auto fullTypeName = Utils::SmallString::join({typeName, "::", enumerationName});
+ types.emplace_back(fullTypeName,
+ Storage::ImportedType{Utils::SmallString{}},
+ Storage::TypeAccessSemantics::Value | Storage::TypeAccessSemantics::IsEnum,
+ sourceId,
+ createCppEnumerationExports(typeName,
+ cppModuleId,
+ enumerationName,
+ enumerationAlias));
+ enumerationTypes.emplace_back(enumerationName, std::move(fullTypeName));
+}
+
+QSet<QString> createEnumerationAliases(const QHash<QString, QQmlJSMetaEnum> &qmlEnumerations)
+{
+ QSet<QString> aliases;
+
+ for (const QQmlJSMetaEnum &qmlEnumeration : qmlEnumerations) {
+ if (auto &&alias = qmlEnumeration.alias(); !alias.isEmpty())
+ aliases.insert(alias);
+ }
+
+ return aliases;
+}
+
EnumerationTypes addEnumerationTypes(Storage::Types &types,
Utils::SmallStringView typeName,
SourceId sourceId,
@@ -326,15 +372,21 @@ EnumerationTypes addEnumerationTypes(Storage::Types &types,
EnumerationTypes enumerationTypes;
enumerationTypes.reserve(Utils::usize(qmlEnumerations));
+ QSet<QString> aliases = createEnumerationAliases(qmlEnumerations);
+
for (const QQmlJSMetaEnum &qmlEnumeration : qmlEnumerations) {
+ if (aliases.contains(qmlEnumeration.name()))
+ continue;
+
Utils::SmallString enumerationName{qmlEnumeration.name()};
- auto fullTypeName = Utils::SmallString::join({typeName, "::", enumerationName});
- types.emplace_back(fullTypeName,
- Storage::ImportedType{Utils::SmallString{}},
- Storage::TypeAccessSemantics::Value | Storage::TypeAccessSemantics::IsEnum,
+ Utils::SmallString enumerationAlias{qmlEnumeration.alias()};
+ addEnumerationType(enumerationTypes,
+ types,
+ typeName,
+ enumerationName,
sourceId,
- createCppEnumerationExports(typeName, cppModuleId, enumerationName));
- enumerationTypes.emplace_back(enumerationName, std::move(fullTypeName));
+ cppModuleId,
+ enumerationAlias);
}
return enumerationTypes;
diff --git a/tests/unit/unittest/qmltypesparser-test.cpp b/tests/unit/unittest/qmltypesparser-test.cpp
index cfb608e5ce..1595591b40 100644
--- a/tests/unit/unittest/qmltypesparser-test.cpp
+++ b/tests/unit/unittest/qmltypesparser-test.cpp
@@ -481,8 +481,6 @@ TEST_F(QmlTypesParser, Enumerations)
TEST_F(QmlTypesParser, EnumerationIsExportedAsType)
{
- ModuleId qmlModuleId = storage.moduleId("QML");
- ModuleId qtQmlModuleId = storage.moduleId("QtQml");
QString source{R"(import QtQuick.tooling 1.2
Module{
Component { name: "QObject"
@@ -526,6 +524,87 @@ TEST_F(QmlTypesParser, EnumerationIsExportedAsType)
_));
}
+TEST_F(QmlTypesParser, EnumerationIsExportedAsTypeWithAlias)
+{
+ QString source{R"(import QtQuick.tooling 1.2
+ Module{
+ Component { name: "QObject"
+ Enum {
+ name: "NamedColorSpaces"
+ alias: "NamedColorSpace"
+ values: [
+ "Unknown",
+ "SRgb",
+ "AdobeRgb",
+ "DisplayP3",
+ ]
+ }
+ exports: ["QML/QtObject 1.0", "QtQml/QtObject 2.1"]
+ }})"};
+
+ parser.parse(source, imports, types, projectData);
+
+ ASSERT_THAT(types,
+ UnorderedElementsAre(
+ AllOf(IsType("QObject::NamedColorSpaces",
+ Storage::ImportedType{},
+ Storage::TypeAccessSemantics::Value | Storage::TypeAccessSemantics::IsEnum,
+ qmltypesFileSourceId),
+ Field(&Storage::Type::exportedTypes,
+ UnorderedElementsAre(IsExportedType(qtQmlNativeModuleId,
+ "QObject::NamedColorSpace",
+ Storage::Version{}),
+ IsExportedType(qtQmlNativeModuleId,
+ "QObject::NamedColorSpaces",
+ Storage::Version{})))),
+ _));
+}
+
+TEST_F(QmlTypesParser, EnumerationIsExportedAsTypeWithAliasToo)
+{
+ QString source{R"(import QtQuick.tooling 1.2
+ Module{
+ Component { name: "QObject"
+ Enum {
+ name: "NamedColorSpaces"
+ alias: "NamedColorSpace"
+ values: [
+ "Unknown",
+ "SRgb",
+ "AdobeRgb",
+ "DisplayP3",
+ ]
+ }
+ Enum {
+ name: "NamedColorSpace"
+ values: [
+ "Unknown",
+ "SRgb",
+ "AdobeRgb",
+ "DisplayP3",
+ ]
+ }
+ exports: ["QML/QtObject 1.0", "QtQml/QtObject 2.1"]
+ }})"};
+
+ parser.parse(source, imports, types, projectData);
+
+ ASSERT_THAT(types,
+ UnorderedElementsAre(
+ AllOf(IsType("QObject::NamedColorSpaces",
+ Storage::ImportedType{},
+ Storage::TypeAccessSemantics::Value | Storage::TypeAccessSemantics::IsEnum,
+ qmltypesFileSourceId),
+ Field(&Storage::Type::exportedTypes,
+ UnorderedElementsAre(IsExportedType(qtQmlNativeModuleId,
+ "QObject::NamedColorSpace",
+ Storage::Version{}),
+ IsExportedType(qtQmlNativeModuleId,
+ "QObject::NamedColorSpaces",
+ Storage::Version{})))),
+ _));
+}
+
TEST_F(QmlTypesParser, EnumerationIsReferencedByQualifiedName)
{
QString source{R"(import QtQuick.tooling 1.2