Files
RedBear-OS/local/recipes/qt/qtdeclarative/source/tools/qmltc/qmltcvisitor.h
T
vasilito f31522130f fix: comprehensive boot warnings and exceptions — fixable silenced, unfixable diagnosed
Build system (5 gaps hardened):
- COOKBOOK_OFFLINE defaults to true (fork-mode)
- normalize_patch handles diff -ruN format
- New 'repo validate-patches' command (25/25 relibc patches)
- 14 patched Qt/Wayland/display recipes added to protected list
- relibc archive regenerated with current patch chain

Boot fixes (fixable):
- Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset)
- D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped)
- redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped)
- daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch)
- udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async)
- relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs
- greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait)
- greeter-ui: built and linked (header guard unification, sem_compat stubs removed)
- mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps
- greeter config: removed stale keymapd dependency from display/greeter services
- prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified

Unfixable (diagnosed, upstream):
- i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort
- kded6/greeter-ui: page fault 0x8 — Qt library null deref
- Thread panics fd != -1 — Rust std library on Redox
- DHCP timeout / eth0 MAC — QEMU user-mode networking
- hwrngd/thermald — no hardware RNG/thermal in VM
- live preload allocation — BIOS memory fragmentation, continues on demand
2026-05-05 20:20:37 +01:00

197 lines
7.1 KiB
C++

// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#ifndef QMLTCVISITOR_H
#define QMLTCVISITOR_H
#include <QtCore/qstring.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qlist.h>
#include <QtQml/private/qqmlirbuilder_p.h>
#include <private/qqmljsimportvisitor_p.h>
#include <private/qqmljslogger_p.h>
QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals;
class QmltcVisitor : public QQmlJSImportVisitor
{
void findCppIncludes();
void postVisitResolve(const QHash<QQmlJSScope::ConstPtr, QList<QQmlJSMetaPropertyBinding>>
&qmlIrOrderedBindings);
void setupAliases();
void checkNamesAndTypes(const QQmlJSScope::ConstPtr &type);
QString filePath(const QQmlJSScope::ConstPtr &scope) const;
QString sourceDirectoryPath(const QString &path) const;
using InlineComponentOrDocumentRootName = QQmlJSScope::InlineComponentOrDocumentRootName;
public:
QmltcVisitor(const QQmlJSScope::Ptr &target, QQmlJSImporter *importer, QQmlJSLogger *logger,
const QString &implicitImportDirectory,
const QStringList &qmldirFiles = QStringList());
bool visit(QQmlJS::AST::UiObjectDefinition *) override;
void endVisit(QQmlJS::AST::UiObjectDefinition *) override;
bool visit(QQmlJS::AST::UiObjectBinding *) override;
void endVisit(QQmlJS::AST::UiObjectBinding *) override;
bool visit(QQmlJS::AST::UiScriptBinding *) override;
bool visit(QQmlJS::AST::UiPublicMember *) override;
bool visit(QQmlJS::AST::UiInlineComponent *) override;
void endVisit(QQmlJS::AST::UiProgram *) override;
QList<QQmlJSScope::ConstPtr>
qmlTypesWithQmlBases(const InlineComponentOrDocumentRootName &inlinedComponentName) const
{
return m_qmlTypesWithQmlBases.value(inlinedComponentName);
}
QSet<QString> cppIncludeFiles() const { return m_cppIncludes; }
qsizetype creationIndex(const QQmlJSScope::ConstPtr &type) const
{
Q_ASSERT(type->scopeType() == QQmlSA::ScopeType::QMLScope);
return m_creationIndices.value(type, -1);
}
qsizetype typeCount(const InlineComponentOrDocumentRootName &inlineComponent) const
{
return m_inlineComponentTypeCount.value(inlineComponent);
}
qsizetype qmlComponentIndex(const QQmlJSScope::ConstPtr &type) const
{
Q_ASSERT(type->scopeType() == QQmlSA::ScopeType::QMLScope);
return m_syntheticTypeIndices.value(type, -1);
}
qsizetype qmlIrObjectIndex(const QQmlJSScope::ConstPtr &type) const
{
Q_ASSERT(type->scopeType() == QQmlSA::ScopeType::QMLScope);
Q_ASSERT(m_qmlIrObjectIndices.contains(type));
return m_qmlIrObjectIndices.value(type, -1);
}
/*! \internal
Returns a runtime index counterpart of `id: foo` for \a type. Returns -1
if \a type does not have an id.
*/
int runtimeId(const QQmlJSScope::ConstPtr &type) const
{
// NB: this function is expected to be called for "pure" types
Q_ASSERT(!m_typesWithId.contains(type) || m_typesWithId[type] != -1);
return m_typesWithId.value(type, -1);
}
/*! \internal
Returns all encountered QML types.
*/
QList<QQmlJSScope::ConstPtr> allQmlTypes() const { return qmlTypes(); }
/*! \internal
Returns QML types which return \c false in
\c{isComponentRootElement()}. The QHash key are the enclosing inline component
or the root document name when not beloning to any inline component.
Called "pure", because these are the ones
that are not wrapped into QQmlComponent. Pure QML types can be created
through direct constructor invocation.
*/
QList<QQmlJSScope::ConstPtr>
pureQmlTypes(const InlineComponentOrDocumentRootName &inlineComponent) const
{
return m_pureQmlTypes[inlineComponent];
}
/*!
* \internal
* Returns a list of the inline components. This list ends with the document root.
*/
QList<InlineComponentOrDocumentRootName> inlineComponentNames() const
{
return m_inlineComponentNames;
}
QQmlJSScope::ConstPtr
inlineComponent(const InlineComponentOrDocumentRootName &inlineComponentName) const
{
return m_inlineComponents.value(inlineComponentName);
}
/*! \internal
Returns \c true when \a type has deferred bindings. Returns \c false
otherwise.
*/
bool hasDeferredBindings(const QQmlJSScope::ConstPtr &type) const
{
return m_typesWithDeferredBindings.contains(type);
}
enum Mode { Import, Compile };
void setMode(Mode mode) { m_mode = mode; }
bool checkCustomParser(const QQmlJSScope::ConstPtr &scope) override;
bool hasSeenCustomParsers() const { return m_seenCustomParsers; }
protected:
QStringList m_qmlTypeNames; // names of QML types arranged as a stack
QHash<QString, int> m_qmlTypeNameCounts;
/*!
* \internal
* QML types with composite/QML base types, mapped from inline component name to types
*/
QHash<InlineComponentOrDocumentRootName, QList<QQmlJSScope::ConstPtr>> m_qmlTypesWithQmlBases;
QSet<QString> m_cppIncludes; // all C++ includes found from QQmlJSScope hierarchy
QHash<InlineComponentOrDocumentRootName, QList<QQmlJSScope::ConstPtr>>
m_pureQmlTypes; // the ones not under QQmlComponent
/*!
* \internal
* List of the names of the inline components, useful when iterating over QHash that
* uses those names as keys. Ends with the the document root.
*/
QList<InlineComponentOrDocumentRootName> m_inlineComponentNames;
/*!
* \internal
* Map inline component names to the corresponding type, and the document root
* name to all types not belonging to any inline component.
*/
QHash<InlineComponentOrDocumentRootName, QQmlJSScope::Ptr> m_inlineComponents;
/*!
* \internal
* Map types to their creation indices. Childrens are stored at their creation index in
* a QObject* array either in the document root or in the inline component they belong to.
* Therefore two types in the same file might have the same creation index, if they belong
* to different inline components.
*/
QHash<QQmlJSScope::ConstPtr, qsizetype> m_creationIndices;
/*!
* \internal
* Counts the types (pure qml types and explicit/implicit components) per inline component.
* Needed to set the size of the QObject* array in the document root or the inline component
* they belong to.
*/
QHash<InlineComponentOrDocumentRootName, qsizetype> m_inlineComponentTypeCount;
QHash<QQmlJSScope::ConstPtr, qsizetype> m_syntheticTypeIndices;
QHash<QQmlJSScope::ConstPtr, qsizetype> m_qmlIrObjectIndices;
QSet<QQmlJSScope::ConstPtr> m_typesWithDeferredBindings;
// prefer allQmlTypes or pureQmlTypes. this function is misleading in qmltc
QList<QQmlJSScope::ConstPtr> qmlTypes() const { return QQmlJSImportVisitor::qmlTypes(); }
QHash<QQmlJSScope::ConstPtr, int> m_typesWithId;
Mode m_mode = Mode::Import;
bool m_seenCustomParsers = false;
};
QT_END_NAMESPACE
#endif // QMLTCVISITOR_H