diff options
Diffstat (limited to 'tools/qmllint/findwarnings.cpp')
-rw-r--r-- | tools/qmllint/findwarnings.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/tools/qmllint/findwarnings.cpp b/tools/qmllint/findwarnings.cpp index c7f2a557f6..dd87293eb6 100644 --- a/tools/qmllint/findwarnings.cpp +++ b/tools/qmllint/findwarnings.cpp @@ -390,8 +390,13 @@ bool FindWarningVisitor::visit(QQmlJS::AST::UiScriptBinding *uisb) bool FindWarningVisitor::visit(QQmlJS::AST::IdentifierExpression *idexp) { + const QString name = idexp->name.toString(); + if (name.front().isUpper() && m_importTypeLocationMap.contains(name)) { + m_usedTypes.insert(name); + } + m_memberAccessChains[m_currentScope].append( - {{idexp->name.toString(), QString(), idexp->firstSourceLocation()}}); + {{name, QString(), idexp->firstSourceLocation()}}); m_fieldMemberBase = idexp; return true; } @@ -489,6 +494,25 @@ bool FindWarningVisitor::check() outstandingConnection.uiod->initializer->accept(this); } + auto unusedImports = m_importLocations; + for (const QString &type : m_usedTypes) { + for (const auto &importLocation : m_importTypeLocationMap.values(type)) + unusedImports.remove(importLocation); + + // If there are no more unused imports left we can abort early + if (unusedImports.isEmpty()) + break; + } + + for (const auto &import : unusedImports) { + m_colorOut.writePrefixedMessage( + QString::fromLatin1("Unused import at %1:%2:%3\n") + .arg(m_filePath) + .arg(import.startLine).arg(import.startColumn), + Info); + CheckIdentifiers::printContext(m_code, &m_colorOut, import); + } + if (!m_warnUnqualified) return m_errors.isEmpty(); @@ -617,6 +641,7 @@ void FindWarningVisitor::endVisit(QQmlJS::AST::FieldMemberExpression *fieldMembe { using namespace QQmlJS::AST; ExpressionNode *base = fieldMember->base; + while (auto *nested = cast<NestedExpression *>(base)) base = nested->expression; @@ -631,9 +656,17 @@ void FindWarningVisitor::endVisit(QQmlJS::AST::FieldMemberExpression *fieldMembe auto &chain = m_memberAccessChains[m_currentScope]; + Q_ASSERT(!chain.last().isEmpty()); + + const QString name = fieldMember->name.toString(); + if (m_importTypeLocationMap.contains(name)) { + if (auto it = m_rootScopeImports.find(name); it != m_rootScopeImports.end() && !*(it)) + m_usedTypes.insert(name); + } + chain.last().append(FieldMember { - fieldMember->name.toString(), type, fieldMember->identifierToken + name, type, fieldMember->identifierToken }); m_fieldMemberBase = fieldMember; } else { |