aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4codegen.cpp
diff options
context:
space:
mode:
authorSami Shalayel <sami.shalayel@qt.io>2025-03-31 16:27:06 +0200
committerSami Shalayel <sami.shalayel@qt.io>2025-04-24 14:45:48 +0200
commit9b2cff650a5452d38b45c6e40f8b7eea7a048d77 (patch)
treef25bd880637696198b91026becdb78592d226a5c /src/qml/compiler/qv4codegen.cpp
parent9a5e2a72a1b696dbd935c6dd656c1520dc14952a (diff)
qmllint: Implement WarnFunctionUsedBeforeDeclaration
Warn about functions used before their declaration. Its not technically an error like the "var used before declaration" because functions are "hoisted up" and therefore available even before their declaration, so create a new warning category for it instead of reusing the "var used before declaration" category. Disable the warning by default: Qt Creator used to have it as default, while other tools like eslint don't. For the same reason, don't warn about functions used before declaration during codegen, and add a method to warn about it in CodeGenWarningInterface. The code for "var used before declaration" can be reused by function declarations by adding a sourcelocation for function declarations in the "addLocalVar"-call, so make sure to differentiate between functions and vars by adding an extra member to Context::ResolvedName. Task-number: QTBUG-129307 Change-Id: I83a4f8cd00c120db23a0cec3365a00ed44de2836 Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4codegen.cpp')
-rw-r--r--src/qml/compiler/qv4codegen.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp
index b57a21eab6..af63c7edf7 100644
--- a/src/qml/compiler/qv4codegen.cpp
+++ b/src/qml/compiler/qv4codegen.cpp
@@ -51,6 +51,13 @@ void CodegenWarningInterface::reportVarUsedBeforeDeclaration(
<< declarationLocation.startLine << ":" << declarationLocation.startColumn << ".";
}
+void CodegenWarningInterface::reportFunctionUsedBeforeDeclaration(const QString &, const QString &,
+ QQmlJS::SourceLocation,
+ QQmlJS::SourceLocation)
+{
+ // we don't report this by default, only when using qmllint.
+}
+
static inline void setJumpOutLocation(QV4::Moth::BytecodeGenerator *bytecodeGenerator,
const Statement *body, const SourceLocation &fallback)
{
@@ -2680,8 +2687,13 @@ Codegen::Reference Codegen::referenceForName(const QString &name, bool isLhs, co
if (resolved.declarationLocation.isValid() && accessLocation.isValid()
&& resolved.declarationLocation.begin() > accessLocation.end()) {
Q_ASSERT(_interface);
- _interface->reportVarUsedBeforeDeclaration(
- name, url().toLocalFile(), resolved.declarationLocation, accessLocation);
+ if (resolved.memberType == Context::FunctionDefinition) {
+ _interface->reportFunctionUsedBeforeDeclaration(
+ name, url().toLocalFile(), resolved.declarationLocation, accessLocation);
+ } else {
+ _interface->reportVarUsedBeforeDeclaration(
+ name, url().toLocalFile(), resolved.declarationLocation, accessLocation);
+ }
if (resolved.type == Context::ResolvedName::Stack && resolved.requiresTDZCheck)
throwsReferenceError = true;
}