diff options
Diffstat (limited to 'tools/qmllint')
-rw-r--r-- | tools/qmllint/checkidentifiers.cpp | 9 | ||||
-rw-r--r-- | tools/qmllint/checkidentifiers.h | 12 | ||||
-rw-r--r-- | tools/qmllint/findwarnings.cpp | 16 | ||||
-rw-r--r-- | tools/qmllint/findwarnings.h | 2 |
4 files changed, 28 insertions, 11 deletions
diff --git a/tools/qmllint/checkidentifiers.cpp b/tools/qmllint/checkidentifiers.cpp index 6366cc72ca..c47a3beb36 100644 --- a/tools/qmllint/checkidentifiers.cpp +++ b/tools/qmllint/checkidentifiers.cpp @@ -107,7 +107,7 @@ static bool walkViaParentAndAttachedScopes(ScopeTree::ConstPtr rootType, return false; } -bool CheckIdentifiers::checkMemberAccess(const QVector<ScopeTree::FieldMember> &members, +bool CheckIdentifiers::checkMemberAccess(const QVector<FieldMember> &members, const ScopeTree::ConstPtr &outerScope, const MetaProperty *prop) const { @@ -122,7 +122,7 @@ bool CheckIdentifiers::checkMemberAccess(const QVector<ScopeTree::FieldMember> & } ScopeTree::ConstPtr scope = outerScope; - for (const ScopeTree::FieldMember &access : members) { + for (const FieldMember &access : members) { if (scope.isNull()) { writeWarning(m_colorOut); m_colorOut->write( @@ -289,6 +289,7 @@ bool CheckIdentifiers::checkMemberAccess(const QVector<ScopeTree::FieldMember> & bool CheckIdentifiers::operator()( const QHash<QString, ScopeTree::ConstPtr> &qmlIDs, const QHash<QQmlJS::SourceLocation, SignalHandler> &signalHandlers, + const MemberAccessChains &memberAccessChains, const ScopeTree::ConstPtr &root, const QString &rootId) const { bool noUnqualifiedIdentifier = true; @@ -299,8 +300,8 @@ bool CheckIdentifiers::operator()( while (!workQueue.empty()) { const ScopeTree::ConstPtr currentScope = workQueue.dequeue(); - const auto memberAccessChains = currentScope->memberAccessChains(); - for (auto memberAccessChain : memberAccessChains) { + const auto scopeMemberAccessChains = memberAccessChains[currentScope]; + for (auto memberAccessChain : scopeMemberAccessChains) { if (memberAccessChain.isEmpty()) continue; diff --git a/tools/qmllint/checkidentifiers.h b/tools/qmllint/checkidentifiers.h index 2056a80f80..f05a227be7 100644 --- a/tools/qmllint/checkidentifiers.h +++ b/tools/qmllint/checkidentifiers.h @@ -39,6 +39,15 @@ struct SignalHandler { bool isMultiline; }; +struct FieldMember +{ + QString m_name; + QString m_parentType; + QQmlJS::SourceLocation m_location; +}; + +using MemberAccessChains = QHash<ScopeTree::ConstPtr, QVector<QVector<FieldMember>>>; + class CheckIdentifiers { public: @@ -49,13 +58,14 @@ public: bool operator ()(const QHash<QString, ScopeTree::ConstPtr> &qmlIDs, const QHash<QQmlJS::SourceLocation, SignalHandler> &signalHandlers, + const MemberAccessChains &memberAccessChains, const ScopeTree::ConstPtr &root, const QString &rootId) const; static void printContext(const QString &code, ColorOutput *output, const QQmlJS::SourceLocation &location); private: - bool checkMemberAccess(const QVector<ScopeTree::FieldMember> &members, + bool checkMemberAccess(const QVector<FieldMember> &members, const ScopeTree::ConstPtr &outerScope, const MetaProperty *prop = nullptr) const; diff --git a/tools/qmllint/findwarnings.cpp b/tools/qmllint/findwarnings.cpp index 4ace09756f..e2a5834109 100644 --- a/tools/qmllint/findwarnings.cpp +++ b/tools/qmllint/findwarnings.cpp @@ -380,8 +380,8 @@ bool FindWarningVisitor::visit(QQmlJS::AST::UiPublicMember *uipm) bool FindWarningVisitor::visit(QQmlJS::AST::IdentifierExpression *idexp) { - auto name = idexp->name; - m_currentScope->addIdToAccessed(name.toString(), idexp->firstSourceLocation()); + m_memberAccessChains[m_currentScope].append( + {{idexp->name.toString(), QString(), idexp->firstSourceLocation()}}); m_fieldMemberBase = idexp; return true; } @@ -453,7 +453,7 @@ bool FindWarningVisitor::check() return true; CheckIdentifiers check(&m_colorOut, m_code, m_rootScopeImports, m_filePath); - return check(m_qmlid2scope, m_signalHandlers, m_rootScope, m_rootId); + return check(m_qmlid2scope, m_signalHandlers, m_memberAccessChains, m_rootScope, m_rootId); } bool FindWarningVisitor::visit(QQmlJS::AST::VariableDeclarationList *vdl) @@ -727,9 +727,13 @@ void FindWarningVisitor::endVisit(QQmlJS::AST::FieldMemberExpression *fieldMembe type = right->m_type->toString(); } } - m_currentScope->accessMember(fieldMember->name.toString(), - type, - fieldMember->identifierToken); + + + auto &chain = m_memberAccessChains[m_currentScope]; + Q_ASSERT(!chain.last().isEmpty()); + chain.last().append(FieldMember { + fieldMember->name.toString(), type, fieldMember->identifierToken + }); m_fieldMemberBase = fieldMember; } else { m_fieldMemberBase = nullptr; diff --git a/tools/qmllint/findwarnings.h b/tools/qmllint/findwarnings.h index e160e8751c..95d4055cbe 100644 --- a/tools/qmllint/findwarnings.h +++ b/tools/qmllint/findwarnings.h @@ -67,6 +67,8 @@ private: QHash<QQmlJS::SourceLocation, SignalHandler> m_signalHandlers; QQmlJS::SourceLocation m_pendingSingalHandler; + MemberAccessChains m_memberAccessChains; + ScopeTree::Ptr m_rootScope; ScopeTree::Ptr m_currentScope; QQmlJS::AST::ExpressionNode *m_fieldMemberBase = nullptr; |