summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFawzi Mohamed <fawzi.mohamed@qt.io>2021-12-06 09:44:24 +0100
committerFawzi Mohamed <fawzi.mohamed@qt.io>2022-04-22 10:43:38 +0000
commita3b1dfd34a4f3b5653beea4bb48f9731904f40ed (patch)
tree158be372c500e35086218b94f24191a3f5f3ae08
parent22ec44b5f3a09dc4aeda553924d379989fbbb43c (diff)
downloadqt-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>
-rw-r--r--src/libs/qmljs/jsoncheck.cpp6
-rw-r--r--src/libs/qmljs/jsoncheck.h1
-rw-r--r--src/libs/qmljs/qmljsbind.cpp6
-rw-r--r--src/libs/qmljs/qmljsbind.h1
-rw-r--r--src/libs/qmljs/qmljscheck.cpp6
-rw-r--r--src/libs/qmljs/qmljscheck.h1
-rw-r--r--src/libs/qmljs/qmljsevaluate.cpp6
-rw-r--r--src/libs/qmljs/qmljsevaluate.h1
-rw-r--r--src/libs/qmljs/qmljsscopeastpath.cpp6
-rw-r--r--src/libs/qmljs/qmljsscopeastpath.h1
-rw-r--r--src/plugins/debugger/qml/qmlengineutils.cpp5
-rw-r--r--src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.cpp8
-rw-r--r--src/plugins/qmldesigner/components/bindingeditor/connectionvisitor.h1
-rw-r--r--src/plugins/qmldesigner/components/componentcore/findimplementation.cpp6
-rw-r--r--src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp6
-rw-r--r--src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h1
-rw-r--r--src/plugins/qmljseditor/qmljseditordocument.cpp13
-rw-r--r--src/plugins/qmljseditor/qmljsfindreferences.cpp18
-rw-r--r--src/plugins/qmljstools/qmljssemanticinfo.cpp6
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");