5#ifndef QQMLJSCOMPILER_P_H
6#define QQMLJSCOMPILER_P_H
18#include <qtqmlcompilerexports.h>
20#include <QtCore/qstring.h>
21#include <QtCore/qlist.h>
22#include <QtCore/qloggingcategory.h>
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>
40using LookupSignatures = QQmlPrivate::AOTLookupValidation::LookupSignatures;
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);
58 std::optional<QString> skipReason;
67 ValidateBasicBlocks = 0x1,
69 NoAOTValidation = 0x4,
71 Q_DECLARE_FLAGS(Flags, Flag)
73 QQmlJSAotCompiler(QQmlJSImporter *importer,
const QString &resourcePath,
74 const QStringList &qmldirFiles, QQmlJSLogger *logger);
76 virtual ~QQmlJSAotCompiler() =
default;
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);
86 virtual QQmlJSAotFunction globalCode()
const;
88 LookupSignatures lookupSignatures()
const {
return m_lookupSignatures; }
90 bool isLintCompiler()
const {
return m_flags & IsLintCompiler; }
91 bool noAotValidation()
const {
return m_flags & NoAOTValidation; }
96 std::optional<QList<QQmlJS::DiagnosticMessage>> finalizeBindingOrFunction();
98 virtual QQmlJS::DiagnosticMessage diagnose(
99 const QString &message, QtMsgType type,
const QQmlJS::SourceLocation &location)
const;
101 QQmlJSTypeResolver m_typeResolver;
103 const QString m_resourcePath;
104 const QStringList m_qmldirFiles;
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;
111 QQmlJSImporter *m_importer =
nullptr;
112 QQmlJSLogger *m_logger =
nullptr;
114 LookupSignatures m_lookupSignatures;
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);
124Q_DECLARE_OPERATORS_FOR_FLAGS(QQmlJSAotCompiler::Flags);
126using QQmlJSAotFunctionMap = QMap<
int, QQmlJSAotFunction>;
128 =
std::function<
bool(
const QV4::CompiledData::SaveableUnitPointer &,
129 const QQmlJSAotFunctionMap &,
const LookupSignatures &, QString *)>;
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);
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);
const QmlIR::Function * function() const
const QmlIR::Binding * binding() const
friend bool operator<(const BindingOrFunction &lhs, const BindingOrFunction &rhs)
BindingOrFunction(const QmlIR::Binding &b)
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)