diff options
author | Marco Bubke <marco.bubke@qt.io> | 2022-04-19 16:44:28 +0200 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2022-04-21 09:30:52 +0000 |
commit | d4eb0aff56ca3b40a99f83f9df61c4b81d859eb9 (patch) | |
tree | a581f483369738074ca59c2fb310725210bdb232 | |
parent | 697fd3ac5caea3a79e2377abcaff1c332bc2c67e (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.cpp | 78 | ||||
-rw-r--r-- | tests/unit/unittest/qmltypesparser-test.cpp | 83 |
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 |