diff options
author | Olivier De Cannière <[email protected]> | 2024-04-19 10:34:05 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <[email protected]> | 2024-04-23 13:21:39 +0000 |
commit | 5cf5d29260af5eb4c17d9f08a653c3692f38e7ef (patch) | |
tree | a2bb5f360b295d7dad78624a5f6040d166a8a69d | |
parent | f1e3b4f2ad7f7ca4e74ee701ee2ad43e09b28952 (diff) |
qv4codegen: Store the location of binary expressions
This location is then used later, for example, to improve the accuracy
of warnings.
OLD
Warning: Main.qml:22:30: function without return type annotation returns
double of double [compiler]
function type() { return 1 + 1 }
^^^^^^
NEW
Warning: Main.qml:22:30: function without return type annotation returns
double of double [compiler]
function type() { return 1 + 1 }
^^^^^
The location stored is the combined locations of the left operand, the
operator, and the right operator. We should investigate if this is the
right approach. Created QTBUG-124548.
Task-number: QTBUG-124548
Task-number: QTBUG-124220
Change-Id: Icac335d53349c05d0e9ee6e436bc6ab08ad970d2
Reviewed-by: Fabian Kosmale <[email protected]>
Reviewed-by: Ulf Hermann <[email protected]>
(cherry picked from commit 04eca69846a531ec26c8bb9be20dddd75fb111fe)
Reviewed-by: Qt Cherry-pick Bot <[email protected]>
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 11 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen_p.h | 3 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 574a955b58..149f9033b7 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -1511,7 +1511,7 @@ bool Codegen::visit(BinaryExpression *ast) if (hasError()) return false; - binopHelper(baseOp(ast->op), tempLeft, right).loadInAccumulator(); + binopHelper(ast, baseOp(ast->op), tempLeft, right).loadInAccumulator(); setExprResult(left.storeRetainAccumulator()); break; @@ -1524,7 +1524,7 @@ bool Codegen::visit(BinaryExpression *ast) Reference right = expression(ast->right); if (hasError()) return false; - setExprResult(binopHelper(static_cast<QSOperator::Op>(ast->op), right, left)); + setExprResult(binopHelper(ast, static_cast<QSOperator::Op>(ast->op), right, left)); break; } Q_FALLTHROUGH(); @@ -1559,7 +1559,7 @@ bool Codegen::visit(BinaryExpression *ast) if (hasError()) return false; - setExprResult(binopHelper(static_cast<QSOperator::Op>(ast->op), left, right)); + setExprResult(binopHelper(ast, static_cast<QSOperator::Op>(ast->op), left, right)); break; } @@ -1568,8 +1568,11 @@ bool Codegen::visit(BinaryExpression *ast) return false; } -Codegen::Reference Codegen::binopHelper(QSOperator::Op oper, Reference &left, Reference &right) +Codegen::Reference Codegen::binopHelper(BinaryExpression *ast, QSOperator::Op oper, Reference &left, + Reference &right) { + auto loc = combine(ast->left->firstSourceLocation(), ast->right->lastSourceLocation()); + bytecodeGenerator->setLocation(loc); switch (oper) { case QSOperator::Add: { left = left.storeOnStack(); diff --git a/src/qml/compiler/qv4codegen_p.h b/src/qml/compiler/qv4codegen_p.h index 30c6077e3e..ce4b4ec3b8 100644 --- a/src/qml/compiler/qv4codegen_p.h +++ b/src/qml/compiler/qv4codegen_p.h @@ -711,7 +711,8 @@ public: QQmlJS::DiagnosticMessage error() const; QUrl url() const; - Reference binopHelper(QSOperator::Op oper, Reference &left, Reference &right); + Reference binopHelper(QQmlJS::AST::BinaryExpression *ast, QSOperator::Op oper, Reference &left, + Reference &right); Reference jumpBinop(QSOperator::Op oper, Reference &left, Reference &right); struct Arguments { int argc; int argv; bool hasSpread; }; Arguments pushArgs(QQmlJS::AST::ArgumentList *args); |