forked from qt-creator/qt-creator
QmlDesigner: Support qualified property types in the qml document parser
Task-number: QDS-6191 Change-Id: Ia5672c0b15c70a24177b9db3e4060ade43b83769 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -118,17 +118,12 @@ void addImports(Storage::Imports &imports,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName,
|
Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName,
|
||||||
const QList<QmlDom::Import> &qmlImports,
|
const QualifiedImports &qualifiedImports)
|
||||||
SourceId sourceId,
|
|
||||||
Utils::SmallStringView directoryPath,
|
|
||||||
QmlDocumentParser::ProjectStorage &storage)
|
|
||||||
{
|
{
|
||||||
if (!rawtypeName.contains('.')) {
|
if (!rawtypeName.contains('.')) {
|
||||||
return Storage::ImportedType{Utils::SmallString{rawtypeName}};
|
return Storage::ImportedType{Utils::SmallString{rawtypeName}};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto qualifiedImports = filterQualifiedImports(qmlImports, sourceId, directoryPath, storage);
|
|
||||||
|
|
||||||
auto foundDot = std::find(rawtypeName.begin(), rawtypeName.end(), '.');
|
auto foundDot = std::find(rawtypeName.begin(), rawtypeName.end(), '.');
|
||||||
|
|
||||||
QStringView alias(rawtypeName.begin(), foundDot);
|
QStringView alias(rawtypeName.begin(), foundDot);
|
||||||
@@ -141,12 +136,14 @@ Storage::ImportedTypeName createImportedTypeName(const QStringView rawtypeName,
|
|||||||
foundImport->second};
|
foundImport->second};
|
||||||
}
|
}
|
||||||
|
|
||||||
void addPropertyDeclarations(Storage::Type &type, const QmlDom::QmlObject &rootObject)
|
void addPropertyDeclarations(Storage::Type &type,
|
||||||
|
const QmlDom::QmlObject &rootObject,
|
||||||
|
const QualifiedImports &qualifiedImports)
|
||||||
{
|
{
|
||||||
for (const QmlDom::PropertyDefinition &propertyDeclaration : rootObject.propertyDefs()) {
|
for (const QmlDom::PropertyDefinition &propertyDeclaration : rootObject.propertyDefs()) {
|
||||||
type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name},
|
type.propertyDeclarations.emplace_back(Utils::SmallString{propertyDeclaration.name},
|
||||||
Storage::ImportedType{
|
createImportedTypeName(propertyDeclaration.typeName,
|
||||||
Utils::SmallString{propertyDeclaration.typeName}},
|
qualifiedImports),
|
||||||
Storage::PropertyDeclarationTraits::None);
|
Storage::PropertyDeclarationTraits::None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -242,15 +239,13 @@ Storage::Type QmlDocumentParser::parse(const QString &sourceContent,
|
|||||||
const auto qmlImports = qmlFile->imports();
|
const auto qmlImports = qmlFile->imports();
|
||||||
auto directoryPath{m_pathCache.sourceContextPath(m_pathCache.sourceContextId(sourceId))};
|
auto directoryPath{m_pathCache.sourceContextPath(m_pathCache.sourceContextId(sourceId))};
|
||||||
|
|
||||||
type.prototype = createImportedTypeName(qmlObject.name(),
|
const auto qualifiedImports = filterQualifiedImports(qmlImports, sourceId, directoryPath, m_storage);
|
||||||
qmlImports,
|
|
||||||
sourceId,
|
type.prototype = createImportedTypeName(qmlObject.name(), qualifiedImports);
|
||||||
directoryPath,
|
|
||||||
m_storage);
|
|
||||||
|
|
||||||
addImports(imports, qmlFile->imports(), sourceId, directoryPath, m_storage);
|
addImports(imports, qmlFile->imports(), sourceId, directoryPath, m_storage);
|
||||||
|
|
||||||
addPropertyDeclarations(type, qmlObject);
|
addPropertyDeclarations(type, qmlObject, qualifiedImports);
|
||||||
addFunctionAndSignalDeclarations(type, qmlObject);
|
addFunctionAndSignalDeclarations(type, qmlObject);
|
||||||
addEnumeraton(type, component);
|
addEnumeraton(type, component);
|
||||||
|
|
||||||
|
@@ -160,7 +160,7 @@ TEST_F(QmlDocumentParser, QualifiedPrototype)
|
|||||||
|
|
||||||
TEST_F(QmlDocumentParser, Properties)
|
TEST_F(QmlDocumentParser, Properties)
|
||||||
{
|
{
|
||||||
auto type = parser.parse("Example{\n property int foo\n}", imports, qmlFileSourceId);
|
auto type = parser.parse(R"(Example{ property int foo })", imports, qmlFileSourceId);
|
||||||
|
|
||||||
ASSERT_THAT(type.propertyDeclarations,
|
ASSERT_THAT(type.propertyDeclarations,
|
||||||
UnorderedElementsAre(IsPropertyDeclaration("foo",
|
UnorderedElementsAre(IsPropertyDeclaration("foo",
|
||||||
@@ -168,12 +168,32 @@ TEST_F(QmlDocumentParser, Properties)
|
|||||||
Storage::PropertyDeclarationTraits::None)));
|
Storage::PropertyDeclarationTraits::None)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(QmlDocumentParser, QualifiedProperties)
|
||||||
|
{
|
||||||
|
auto exampleModuleId = storage.moduleId("Example");
|
||||||
|
|
||||||
|
auto type = parser.parse(R"(import Example 2.1 as Example
|
||||||
|
Item{ property Example.Foo foo})",
|
||||||
|
imports,
|
||||||
|
qmlFileSourceId);
|
||||||
|
|
||||||
|
ASSERT_THAT(type.propertyDeclarations,
|
||||||
|
UnorderedElementsAre(IsPropertyDeclaration(
|
||||||
|
"foo",
|
||||||
|
Storage::QualifiedImportedType("Foo",
|
||||||
|
Storage::Import{exampleModuleId,
|
||||||
|
Storage::Version{2, 1},
|
||||||
|
qmlFileSourceId}),
|
||||||
|
Storage::PropertyDeclarationTraits::None)));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(QmlDocumentParser, Imports)
|
TEST_F(QmlDocumentParser, Imports)
|
||||||
{
|
{
|
||||||
ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo");
|
ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo");
|
||||||
ModuleId qmlModuleId = storage.moduleId("QML");
|
ModuleId qmlModuleId = storage.moduleId("QML");
|
||||||
ModuleId qtQmlModuleId = storage.moduleId("QtQml");
|
ModuleId qtQmlModuleId = storage.moduleId("QtQml");
|
||||||
ModuleId qtQuickModuleId = storage.moduleId("QtQuick");
|
ModuleId qtQuickModuleId = storage.moduleId("QtQuick");
|
||||||
|
|
||||||
auto type = parser.parse(R"(import QtQuick
|
auto type = parser.parse(R"(import QtQuick
|
||||||
import "../foo"
|
import "../foo"
|
||||||
Example{})",
|
Example{})",
|
||||||
@@ -246,6 +266,7 @@ TEST_F(QmlDocumentParser, DISABLED_DuplicateImportsAreRemoved)
|
|||||||
ModuleId qmlModuleId = storage.moduleId("QML");
|
ModuleId qmlModuleId = storage.moduleId("QML");
|
||||||
ModuleId qtQmlModuleId = storage.moduleId("QtQml");
|
ModuleId qtQmlModuleId = storage.moduleId("QtQml");
|
||||||
ModuleId qtQuickModuleId = storage.moduleId("QtQuick");
|
ModuleId qtQuickModuleId = storage.moduleId("QtQuick");
|
||||||
|
|
||||||
auto type = parser.parse(R"(import QtQuick
|
auto type = parser.parse(R"(import QtQuick
|
||||||
import "../foo"
|
import "../foo"
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
Reference in New Issue
Block a user