diff options
author | Fawzi Mohamed <fawzi.mohamed@qt.io> | 2021-12-06 09:44:24 +0100 |
---|---|---|
committer | Fawzi Mohamed <fawzi.mohamed@qt.io> | 2022-04-22 10:43:38 +0000 |
commit | a3b1dfd34a4f3b5653beea4bb48f9731904f40ed (patch) | |
tree | 158be372c500e35086218b94f24191a3f5f3ae08 | |
parent | 22ec44b5f3a09dc4aeda553924d379989fbbb43c (diff) | |
download | qt-creator-a3b1dfd34a4f3b5653beea4bb48f9731904f40ed.tar.gz |
qmljs: correctly handle js string templates
In most cases we do want to visit the expressions in a function
template. Changing its accept0 would force those not wanting to visit
it to iterate on the templates (currently a linked list), so we add a
visit method explicitly visiting the expression in all the needed
places.
Fixes: QTCREATORBUG-21869
Change-Id: I47733544bfd32eec357810b97242608b8f7de572
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
19 files changed, 99 insertions, 0 deletions
diff --git a/src/libs/qmljs/jsoncheck.cpp b/src/libs/qmljs/jsoncheck.cpp index 966513c208..3261b8b715 100644 --- a/src/libs/qmljs/jsoncheck.cpp +++ b/src/libs/qmljs/jsoncheck.cpp @@ -84,6 +84,12 @@ void JsonCheck::postVisit(Node *) analysis()->m_ranking += previous.m_ranking; } +bool JsonCheck::visit(AST::TemplateLiteral *ast) +{ + Node::accept(ast->expression, this); + return true; +} + bool JsonCheck::visit(ObjectPattern *ast) { if (!proceedCheck(JsonValue::Object, ast->lbraceToken)) diff --git a/src/libs/qmljs/jsoncheck.h b/src/libs/qmljs/jsoncheck.h index 9885ad2353..5a697b485c 100644 --- a/src/libs/qmljs/jsoncheck.h +++ b/src/libs/qmljs/jsoncheck.h @@ -51,6 +51,7 @@ private: bool preVisit(AST::Node *) override; void postVisit(AST::Node *) override; + bool visit(AST::TemplateLiteral *ast) override; bool visit(AST::ObjectPattern *ast) override; bool visit(AST::ArrayPattern *ast) override; bool visit(AST::NullExpression *ast) override; diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp index 96b0ee2908..57b495af71 100644 --- a/src/libs/qmljs/qmljsbind.cpp +++ b/src/libs/qmljs/qmljsbind.cpp @@ -350,6 +350,12 @@ bool Bind::visit(UiInlineComponent *ast) return true; } +bool Bind::visit(AST::TemplateLiteral *ast) +{ + Node::accept(ast->expression, this); + return true; +} + bool Bind::visit(PatternElement *ast) { if (ast->bindingIdentifier.isEmpty() || !ast->isVariableDeclaration()) diff --git a/src/libs/qmljs/qmljsbind.h b/src/libs/qmljs/qmljsbind.h index d1a90a6cfa..e531b4de46 100644 --- a/src/libs/qmljs/qmljsbind.h +++ b/src/libs/qmljs/qmljsbind.h @@ -82,6 +82,7 @@ protected: bool visit(AST::UiInlineComponent *ast) override; // QML/JS + bool visit(AST::TemplateLiteral *ast) override; bool visit(AST::FunctionDeclaration *ast) override; bool visit(AST::FunctionExpression *ast) override; bool visit(AST::PatternElement *ast) override; diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 519706c326..a0ce17eac0 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -809,6 +809,12 @@ bool Check::visit(UiObjectInitializer *) return true; } +bool Check::visit(AST::TemplateLiteral *ast) +{ + Node::accept(ast->expression, this); + return true; +} + void Check::endVisit(UiObjectInitializer *uiObjectInitializer) { Q_UNUSED(uiObjectInitializer) diff --git a/src/libs/qmljs/qmljscheck.h b/src/libs/qmljs/qmljscheck.h index 10019a9794..77d88d38e4 100644 --- a/src/libs/qmljs/qmljscheck.h +++ b/src/libs/qmljs/qmljscheck.h @@ -77,6 +77,7 @@ protected: bool visit(AST::FunctionExpression *ast) override; bool visit(AST::UiObjectInitializer *) override; + bool visit(AST::TemplateLiteral *ast) override; bool visit(AST::BinaryExpression *ast) override; bool visit(AST::Block *ast) override; bool visit(AST::WithStatement *ast) override; diff --git a/src/libs/qmljs/qmljsevaluate.cpp b/src/libs/qmljs/qmljsevaluate.cpp index d2bb3c3460..e848d130b4 100644 --- a/src/libs/qmljs/qmljsevaluate.cpp +++ b/src/libs/qmljs/qmljsevaluate.cpp @@ -211,6 +211,12 @@ bool Evaluate::visit(AST::UiQualifiedId *ast) return false; } +bool Evaluate::visit(AST::TemplateLiteral *ast) +{ + _result = _valueOwner->stringValue(); + return false; +} + bool Evaluate::visit(AST::ThisExpression *) { return false; diff --git a/src/libs/qmljs/qmljsevaluate.h b/src/libs/qmljs/qmljsevaluate.h index 4cd37f56fe..a3c1cf13a5 100644 --- a/src/libs/qmljs/qmljsevaluate.h +++ b/src/libs/qmljs/qmljsevaluate.h @@ -75,6 +75,7 @@ protected: bool visit(AST::UiQualifiedId *ast) override; // QmlJS + bool visit(AST::TemplateLiteral *ast) override; bool visit(AST::ThisExpression *ast) override; bool visit(AST::IdentifierExpression *ast) override; bool visit(AST::NullExpression *ast) override; diff --git a/src/libs/qmljs/qmljsscopeastpath.cpp b/src/libs/qmljs/qmljsscopeastpath.cpp index 953f4761e8..6753219e56 100644 --- a/src/libs/qmljs/qmljsscopeastpath.cpp +++ b/src/libs/qmljs/qmljsscopeastpath.cpp @@ -61,6 +61,12 @@ bool ScopeAstPath::preVisit(Node *node) return true; } +bool ScopeAstPath::visit(AST::TemplateLiteral *node) +{ + Node::accept(node->expression, this); + return true; +} + bool ScopeAstPath::visit(UiPublicMember *node) { if (node && node->statement && node->statement->kind == node->Kind_Block diff --git a/src/libs/qmljs/qmljsscopeastpath.h b/src/libs/qmljs/qmljsscopeastpath.h index 61ffb5a0f6..8e7a6a4239 100644 --- a/src/libs/qmljs/qmljsscopeastpath.h +++ b/src/libs/qmljs/qmljsscopeastpath.h @@ -44,6 +44,7 @@ protected: using Visitor::visit; bool preVisit(AST::Node *node) override; + bool visit(AST::TemplateLiteral *node) override; bool visit(AST::UiPublicMember *node) override; bool visit(AST::UiScriptBinding *node) override; bool visit(AST::UiObjectDefinition *node) override; diff --git a/src/plugins/debugger/qml/qmlengineutils.cpp b/src/plugins/debugger/qml/qmlengineutils.cpp index f7e22d127a..5b5bef2a86 100644 --- a/src/plugins/debugger/qml/qmlengineutils.cpp +++ b/src/plugins/debugger/qml/qmlengineutils.cpp @@ -158,6 +158,11 @@ public: return true; } + bool visit(TemplateLiteral *ast) override + { + Node::accept(ast->expression, this); + return true; + } bool visit(VariableStatement *ast) override { test(ast); return true; } bool visit(VariableDeclarationList *ast) override { test(ast); return true; } bool visit(ExpressionStatement *ast) override { test(ast); return true; } diff --git a/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.cpp b/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.cpp index ddf328978f..8a1195ece4 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.cpp @@ -31,6 +31,14 @@ ConnectionVisitor::ConnectionVisitor() { } +bool ConnectionVisitor::visit(QmlJS::AST::TemplateLiteral *ast) +{ + m_expression.append( + qMakePair(QmlJS::AST::Node::Kind::Kind_StringLiteral, ast->value.toString())); + QmlJS::AST::Node::accept(ast->expression, this); + return true; +} + bool ConnectionVisitor::visit(QmlJS::AST::StringLiteral *ast) { m_expression.append(qMakePair(QmlJS::AST::Node::Kind::Kind_StringLiteral, diff --git a/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.h b/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.h index abcebcdb8e..0862ee5cca 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.h +++ b/src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.h @@ -37,6 +37,7 @@ class ConnectionVisitor : public QmlJS::AST::Visitor public: explicit ConnectionVisitor(); + bool visit(QmlJS::AST::TemplateLiteral *ast) override; bool visit(QmlJS::AST::StringLiteral *ast) override; bool visit(QmlJS::AST::NumericLiteral *ast) override; bool visit(QmlJS::AST::TrueLiteral *ast) override; diff --git a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp index 1838a3d4e9..d0a1bca4fd 100644 --- a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp +++ b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp @@ -148,6 +148,12 @@ protected: return true; } + bool visit(AST::TemplateLiteral *node) override + { + AST::Node::accept(node->expression, this); + return true; + } + bool visit(AST::IdentifierExpression *node) override { if (node->name != m_typeName) diff --git a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp index 7fe59053da..82e4c15ef4 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp @@ -99,6 +99,12 @@ bool FirstDefinitionFinder::visit(QmlJS::AST::UiObjectDefinition *ast) return true; } +bool FirstDefinitionFinder::visit(QmlJS::AST::TemplateLiteral *ast) +{ + QmlJS::AST::Node::accept(ast->expression, this); + return true; +} + void FirstDefinitionFinder::throwRecursionDepthError() { qWarning("Warning: Hit maximum recursion depth while visiting the AST in FirstDefinitionFinder"); diff --git a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h index 2a963ae2fb..26d0c419ca 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h +++ b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h @@ -42,6 +42,7 @@ protected: bool visit(QmlJS::AST::UiObjectBinding *ast) override; bool visit(QmlJS::AST::UiObjectDefinition *ast) override; + bool visit(QmlJS::AST::TemplateLiteral *ast) override; void throwRecursionDepthError() override; diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 770f79aa04..5a930b1d64 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -279,6 +279,13 @@ protected: --_depth; } + bool visit(AST::TemplateLiteral *ast) override + { + // avoid? finds function declarations in templates + AST::Node::accept(ast->expression, this); + return true; + } + bool visit(AST::FunctionExpression *) override { return false; @@ -398,6 +405,12 @@ protected: return true; } + bool visit(AST::TemplateLiteral *ast) override + { + AST::Node::accept(ast->expression, this); + return true; + } + bool visit(AST::FunctionDeclaration *ast) override { _ranges.append(createRange(ast)); diff --git a/src/plugins/qmljseditor/qmljsfindreferences.cpp b/src/plugins/qmljseditor/qmljsfindreferences.cpp index 5f7a9a33ea..7c02a5da29 100644 --- a/src/plugins/qmljseditor/qmljsfindreferences.cpp +++ b/src/plugins/qmljseditor/qmljsfindreferences.cpp @@ -118,6 +118,12 @@ protected: return false; } + bool visit(AST::TemplateLiteral *el) override + { + Node::accept(el->expression, this); + return true; + } + bool visit(AST::UiObjectBinding *node) override { if (node->qualifiedId @@ -398,6 +404,12 @@ protected: return true; } + bool visit(AST::TemplateLiteral *el) override + { + Node::accept(el->expression, this); + return true; + } + bool visit(AST::FunctionDeclaration *node) override { return visit(static_cast<FunctionExpression *>(node)); @@ -557,6 +569,12 @@ protected: return true; } + bool visit(AST::TemplateLiteral *el) override + { + Node::accept(el->expression, this); + return true; + } + bool visit(UiScriptBinding *node) override { return !checkBindingName(node->qualifiedId); diff --git a/src/plugins/qmljstools/qmljssemanticinfo.cpp b/src/plugins/qmljstools/qmljssemanticinfo.cpp index ef375b77b7..b136747e7a 100644 --- a/src/plugins/qmljstools/qmljssemanticinfo.cpp +++ b/src/plugins/qmljstools/qmljssemanticinfo.cpp @@ -127,6 +127,12 @@ protected: return handleLocationAst(ast); } + bool visit(AST::TemplateLiteral *ast) override + { + AST::Node::accept(ast->expression, this); + return true; + } + void throwRecursionDepthError() override { qWarning("Warning: Hit maximum recursion depth when visiting the AST in AstPath"); |