Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmljscompiler_p.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant
4
5#ifndef QQMLJSCOMPILER_P_H
6#define QQMLJSCOMPILER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17
18#include <qtqmlcompilerexports.h>
19
20#include <QtCore/qstring.h>
21#include <QtCore/qlist.h>
22#include <QtCore/qloggingcategory.h>
23
24#include <private/qqmlirbuilder_p.h>
25#include <private/qqmljscompilepass_p.h>
26#include <private/qqmljscompilerstats_p.h>
27#include <private/qqmljsdiagnosticmessage_p.h>
28#include <private/qqmljsimporter_p.h>
29#include <private/qqmljslogger_p.h>
30#include <private/qqmljslookupsignatures_p.h>
31#include <private/qqmljstyperesolver_p.h>
32#include <private/qv4compileddata_p.h>
33
34#include <functional>
35
37
39
40using LookupSignatures = QQmlPrivate::AOTLookupValidation::LookupSignatures;
41
42struct Q_QMLCOMPILER_EXPORT QQmlJSCompileError
43{
44 QString message;
45 void print();
46 QQmlJSCompileError augment(const QString &contextErrorMessage) const;
47 void appendDiagnostics(const QString &inputFileName,
48 const QList<QQmlJS::DiagnosticMessage> &diagnostics);
49 void appendDiagnostic(const QString &inputFileName,
50 const QQmlJS::DiagnosticMessage &diagnostic);
51};
52
53struct Q_QMLCOMPILER_EXPORT QQmlJSAotFunction
54{
55 QStringList includes;
56 QString code;
57 QString signature;
58 std::optional<QString> skipReason;
59 int numArguments = 0;
60};
61
62class Q_QMLCOMPILER_EXPORT QQmlJSAotCompiler
63{
64public:
65 enum Flag {
66 NoFlags = 0x0,
67 ValidateBasicBlocks = 0x1,
68 IsLintCompiler = 0x2, // When we're linting and not compiling
69 NoAOTValidation = 0x4,
70 };
71 Q_DECLARE_FLAGS(Flags, Flag)
72
73 QQmlJSAotCompiler(QQmlJSImporter *importer, const QString &resourcePath,
74 const QStringList &qmldirFiles, QQmlJSLogger *logger);
75
76 virtual ~QQmlJSAotCompiler() = default;
77
78 virtual void setDocument(const QmlIR::JSCodeGen *codegen, const QmlIR::Document *document);
79 virtual void setScope(const QmlIR::Object *object, const QmlIR::Object *scope);
80 virtual std::variant<QQmlJSAotFunction, QList<QQmlJS::DiagnosticMessage>> compileBinding(
81 const QV4::Compiler::Context *context, const QmlIR::Binding &irBinding,
82 QQmlJS::AST::Node *astNode);
83 virtual std::variant<QQmlJSAotFunction, QList<QQmlJS::DiagnosticMessage>> compileFunction(
84 const QV4::Compiler::Context *context, const QString &name, QQmlJS::AST::Node *astNode);
85
86 virtual QQmlJSAotFunction globalCode() const;
87
88 LookupSignatures lookupSignatures() const { return m_lookupSignatures; }
89
90 bool isLintCompiler() const { return m_flags & IsLintCompiler; }
91 bool noAotValidation() const { return m_flags & NoAOTValidation; }
92
93 Flags m_flags;
94
95protected:
96 std::optional<QList<QQmlJS::DiagnosticMessage>> finalizeBindingOrFunction();
97
98 virtual QQmlJS::DiagnosticMessage diagnose(
99 const QString &message, QtMsgType type, const QQmlJS::SourceLocation &location) const;
100
101 QQmlJSTypeResolver m_typeResolver;
102
103 const QString m_resourcePath;
104 const QStringList m_qmldirFiles;
105
106 const QmlIR::Document *m_document = nullptr;
107 const QmlIR::Object *m_currentObject = nullptr;
108 const QmlIR::Object *m_currentScope = nullptr;
109 const QV4::Compiler::JSUnitGenerator *m_unitGenerator = nullptr;
110
111 QQmlJSImporter *m_importer = nullptr;
112 QQmlJSLogger *m_logger = nullptr;
113
114 LookupSignatures m_lookupSignatures;
115
116private:
117 QQmlJSAotFunction doCompile(
118 const QV4::Compiler::Context *context, const QQmlJSCompilePass::Function *function);
119 QQmlJSAotFunction doCompileAndRecordAotStats(
120 const QV4::Compiler::Context *context, const QQmlJSCompilePass::Function *function,
121 const QString &name, QQmlJS::SourceLocation location);
122};
123
124Q_DECLARE_OPERATORS_FOR_FLAGS(QQmlJSAotCompiler::Flags);
125
126using QQmlJSAotFunctionMap = QMap<int, QQmlJSAotFunction>;
128 = std::function<bool(const QV4::CompiledData::SaveableUnitPointer &,
129 const QQmlJSAotFunctionMap &, const LookupSignatures &, QString *)>;
130
131bool Q_QMLCOMPILER_EXPORT qCompileQmlFile(const QString &inputFileName,
132 const QQmlJSSaveFunction &saveFunction,
133 QQmlJSAotCompiler *aotCompiler, QQmlJSCompileError *error,
134 bool storeSourceLocation = false,
135 QV4::Compiler::CodegenWarningInterface *wInterface =
136 QV4::Compiler::defaultCodegenWarningInterface(),
137 const QString *fileContents = nullptr);
138bool Q_QMLCOMPILER_EXPORT qCompileQmlFile(QmlIR::Document &irDocument, const QString &inputFileName,
139 const QQmlJSSaveFunction &saveFunction,
140 QQmlJSAotCompiler *aotCompiler, QQmlJSCompileError *error,
141 bool storeSourceLocation = false,
142 QV4::Compiler::CodegenWarningInterface *wInterface =
143 QV4::Compiler::defaultCodegenWarningInterface(),
144 const QString *fileContents = nullptr);
145bool Q_QMLCOMPILER_EXPORT qCompileJSFile(const QString &inputFileName, const QString &inputFileUrl,
146 const QQmlJSSaveFunction &saveFunction,
147 QQmlJSCompileError *error);
148
149bool Q_QMLCOMPILER_EXPORT qSaveQmlJSUnitAsCpp(const QString &inputFileName,
150 const QString &outputFileName,
151 const QV4::CompiledData::SaveableUnitPointer &unit,
152 const QQmlJSAotFunctionMap &aotFunctions,
153 const LookupSignatures &lookupSignatures,
154 bool noAotValidation, QString *errorString);
155
156QT_END_NAMESPACE
157
158#endif // QQMLJSCOMPILER_P_H
const QmlIR::Function * function() const
const QmlIR::Binding * binding() const
friend bool operator<(const BindingOrFunction &lhs, const BindingOrFunction &rhs)
BindingOrFunction(const QmlIR::Binding &b)
quint32 index() const
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")
static const char * funcHeaderCode
static QString lookupToString(const QQmlPrivate::AOTLookupValidation::Lookup &lookup)
static QString wrapString(const QString &s)
static QString signatureToString(const QQmlPrivate::AOTLookupValidation::Signature &signature)
static bool generateAotValidationCode(const WriteStr &writeStr, const LookupSignatures &lookupSignatures, bool noAotValidation)
static bool checkArgumentsObjectUseInSignalHandlers(const QmlIR::Document &doc, QQmlJSCompileError *error)
bool qCompileQmlFile(QmlIR::Document &irDocument, const QString &inputFileName, const QQmlJSSaveFunction &saveFunction, QQmlJSAotCompiler *aotCompiler, QQmlJSCompileError *error, bool storeSourceLocation, QV4::Compiler::CodegenWarningInterface *wInterface, const QString *fileContents)
static void annotateListElements(QmlIR::Document *document)
bool qCompileQmlFile(const QString &inputFileName, const QQmlJSSaveFunction &saveFunction, QQmlJSAotCompiler *aotCompiler, QQmlJSCompileError *error, bool storeSourceLocation, QV4::Compiler::CodegenWarningInterface *wInterface, const QString *fileContents)
static QString diagnosticErrorMessage(const QString &fileName, const QQmlJS::DiagnosticMessage &m)
static QString typeToString(const QQmlPrivate::AOTLookupValidation::Type &type)
bool qCompileJSFile(const QString &inputFileName, const QString &inputFileUrl, const QQmlJSSaveFunction &saveFunction, QQmlJSCompileError *error)
static const int FileScopeCodeIndex
static const char * skippedValidationCode
std::function< bool(const QV4::CompiledData::SaveableUnitPointer &, const QQmlJSAotFunctionMap &, const LookupSignatures &, QString *)> QQmlJSSaveFunction
QT_BEGIN_NAMESPACE QT_DECLARE_EXPORTED_QT_LOGGING_CATEGORY(lcAotCompiler, Q_QMLCOMPILER_EXPORT)