Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmljslintercodegen.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
5
6#include <QtQmlCompiler/private/qqmljsimportvisitor_p.h>
7#include <QtQmlCompiler/private/qqmljsshadowcheck_p.h>
8#include <QtQmlCompiler/private/qqmljsstoragegeneralizer_p.h>
9#include <QtQmlCompiler/private/qqmljstypepropagator_p.h>
10#include <QtQmlCompiler/private/qqmljsfunctioninitializer_p.h>
11
12#include <QFileInfo>
13
15
16using namespace Qt::StringLiterals;
17
19 const QStringList &qmldirFiles, QQmlJSLogger *logger)
20 : QQmlJSAotCompiler(importer, fileName, qmldirFiles, logger)
21{
22}
23
25 const QmlIR::Document *document)
26{
27 Q_UNUSED(codegen);
28 m_document = document;
29 m_unitGenerator = &document->jsGenerator;
30}
31
32std::variant<QQmlJSAotFunction, QQmlJS::DiagnosticMessage>
34 const QmlIR::Binding &irBinding, QQmlJS::AST::Node *astNode)
35{
36 QQmlJSFunctionInitializer initializer(
38
39 QQmlJS::DiagnosticMessage initializationError;
40 const QString name = m_document->stringAt(irBinding.propertyNameIndex);
42 initializer.run(context, name, astNode, irBinding, &initializationError);
43 if (initializationError.isValid())
44 diagnose(initializationError.message, initializationError.type, initializationError.loc);
45
46 QQmlJS::DiagnosticMessage analyzeError;
47 if (!analyzeFunction(context, &function, &analyzeError)) {
48 // If it's a signal and the function just returns a closure, it's harmless.
49 // Otherwise promote the message to warning level.
50 return diagnose(u"Could not compile binding for %1: %2"_s.arg(name, analyzeError.message),
51 (function.isSignalHandler && analyzeError.type == QtDebugMsg)
54 analyzeError.loc);
55 }
56
57 return QQmlJSAotFunction {};
58}
59
60std::variant<QQmlJSAotFunction, QQmlJS::DiagnosticMessage>
62 const QString &name, QQmlJS::AST::Node *astNode)
63{
64 QQmlJS::DiagnosticMessage initializationError;
65 QQmlJSFunctionInitializer initializer(
68 initializer.run(context, name, astNode, &initializationError);
69 if (initializationError.isValid())
70 diagnose(initializationError.message, initializationError.type, initializationError.loc);
71
72 QQmlJS::DiagnosticMessage analyzeError;
73 if (!analyzeFunction(context, &function, &analyzeError)) {
74 return diagnose(u"Could not compile function %1: %2"_s.arg(name, analyzeError.message),
75 QtWarningMsg, analyzeError.loc);
76 }
77
78 return QQmlJSAotFunction {};
79}
80
81bool QQmlJSLinterCodegen::analyzeFunction(const QV4::Compiler::Context *context,
84{
86 {}, {}, m_passManager);
87 auto [basicBlocks, annotations] = propagator.run(function, error);
88 if (!error->isValid()) {
89 QQmlJSShadowCheck shadowCheck(m_unitGenerator, &m_typeResolver, m_logger, basicBlocks,
90 annotations);
91 shadowCheck.run(function, error);
92 }
93
94 if (!error->isValid()) {
96 basicBlocks, annotations);
97 generalizer.run(function, error);
98 }
99
100 if (error->isValid()) {
101 error->type = context->returnsClosure ? QtDebugMsg : QtWarningMsg;
102 return false;
103 }
104
105 return true;
106}
107
const QV4::Compiler::JSUnitGenerator * m_unitGenerator
QQmlJSLogger * m_logger
QQmlJSTypeResolver m_typeResolver
virtual QQmlJS::DiagnosticMessage diagnose(const QString &message, QtMsgType type, const QQmlJS::SourceLocation &location) const
const QmlIR::Document * m_document
const QmlIR::Object * m_currentScope
const QmlIR::Object * m_currentObject
QQmlJSCompilePass::Function run(const QV4::Compiler::Context *context, const QString &propertyName, QQmlJS::AST::Node *astNode, const QmlIR::Binding &irBinding, QQmlJS::DiagnosticMessage *error)
std::variant< QQmlJSAotFunction, QQmlJS::DiagnosticMessage > compileBinding(const QV4::Compiler::Context *context, const QmlIR::Binding &irBinding, QQmlJS::AST::Node *astNode) override
QQmlJSLinterCodegen(QQmlJSImporter *importer, const QString &fileName, const QStringList &qmldirFiles, QQmlJSLogger *logger)
std::variant< QQmlJSAotFunction, QQmlJS::DiagnosticMessage > compileFunction(const QV4::Compiler::Context *context, const QString &name, QQmlJS::AST::Node *astNode) override
void setDocument(const QmlIR::JSCodeGen *codegen, const QmlIR::Document *document) override
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
Combined button and popup list for selecting options.
static void * context
DBusConnection const char DBusError * error
@ QtWarningMsg
Definition qlogging.h:31
@ QtDebugMsg
Definition qlogging.h:30
GLuint name
#define Q_UNUSED(x)
BlocksAndAnnotations run(const Function *m_function, QQmlJS::DiagnosticMessage *error)
QString stringAt(int index) const
QV4::CompiledData::Location location