From ed59dfeb706242d314aa21889ad0f5a7e028069f Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 26 Jan 2021 11:14:13 +0100 Subject: qmllint: Complain if member access check fails for namespaced types Before, we would prepend the namespace to the name, but then continue right away, never checking the new name. Change-Id: If90db7d33536fb4b549321c2d6b677040605b6f0 Reviewed-by: Fabian Kosmale --- tools/qmllint/checkidentifiers.cpp | 47 +++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 13 deletions(-) (limited to 'tools') diff --git a/tools/qmllint/checkidentifiers.cpp b/tools/qmllint/checkidentifiers.cpp index 0517f67ed5..32a47891d5 100644 --- a/tools/qmllint/checkidentifiers.cpp +++ b/tools/qmllint/checkidentifiers.cpp @@ -299,7 +299,7 @@ bool CheckIdentifiers::operator()( if (memberAccessChain.isEmpty()) continue; - const auto memberAccessBase = memberAccessChain.takeFirst(); + auto memberAccessBase = memberAccessChain.takeFirst(); const auto jsId = currentScope->findJSIdentifier(memberAccessBase.m_name); if (jsId.has_value() && jsId->kind != QQmlJSScope::JavaScriptIdentifier::Injected) continue; @@ -354,24 +354,45 @@ bool CheckIdentifiers::operator()( continue; } - const auto typeIt = m_types.find(memberAccessBase.m_name); - if (typeIt != m_types.end()) { - if (typeIt->isNull()) { - // This is a namespaced import. Check with the full name. - if (!memberAccessChain.isEmpty()) - memberAccessChain.front().m_name.prepend(memberAccessBase.m_name + u'.'); - } else if (!checkMemberAccess(memberAccessChain, *typeIt)) { - noUnqualifiedIdentifier = false; + const QString baseName = memberAccessBase.m_name; + auto typeIt = m_types.find(memberAccessBase.m_name); + bool baseIsPrefixed = false; + while (typeIt != m_types.end() && typeIt->isNull()) { + // This is a namespaced import. Check with the full name. + if (!memberAccessChain.isEmpty()) { + auto location = memberAccessBase.m_location; + memberAccessBase = memberAccessChain.takeFirst(); + memberAccessBase.m_name.prepend(baseName + u'.'); + location.length = memberAccessBase.m_location.offset - location.offset + + memberAccessBase.m_location.length; + memberAccessBase.m_location = location; + typeIt = m_types.find(memberAccessBase.m_name); + baseIsPrefixed = true; } + } + + if (typeIt != m_types.end() && !typeIt->isNull()) { + if (!checkMemberAccess(memberAccessChain, *typeIt)) + noUnqualifiedIdentifier = false; continue; } noUnqualifiedIdentifier = false; const auto location = memberAccessBase.m_location; - m_colorOut->writePrefixedMessage(QString::fromLatin1("unqualified access at %1:%2:%3\n") - .arg(m_fileName) - .arg(location.startLine).arg(location.startColumn), - Warning); + + if (baseIsPrefixed) { + m_colorOut->writePrefixedMessage( + QString::fromLatin1("type not found in namespace at %1:%2:%3\n") + .arg(m_fileName) + .arg(location.startLine).arg(location.startColumn), + Warning); + } else { + m_colorOut->writePrefixedMessage( + QString::fromLatin1("unqualified access at %1:%2:%3\n") + .arg(m_fileName) + .arg(location.startLine).arg(location.startColumn), + Warning); + } printContext(m_code, m_colorOut, location); -- cgit v1.2.3