Review Request 118795: Support versioned module imports and rationalize module dependencies

Denis Steckelmacher steckdenis at
Tue Jun 17 14:26:27 UTC 2014

> On June 17, 2014, 2:10 p.m., Aleix Pol Gonzalez wrote:
> > Maybe producing the patch with --find-copies-harder would help? or at least -M80.
> > 
> > Maybe we should think of ways to get these files installed too? Qt should be distributing them rather than having us distributing it with kdevelop. Moreover, if I understand correctly, we'll probably want to produce some for KF5, no?

Qt Creator also ships plugin.qmltypes files (but not all of them, maybe it relies on an installed qmlplugindump create the files on the fly, but it nevertheless has to know which modules exist in order to launch qmlplugindump on them). These files are fairly big and completely useless to normal QML operation, so I don't think that Qt will ship and install them.

- Denis

This is an automatically generated e-mail. To reply, visit:

On June 17, 2014, 1:28 p.m., Denis Steckelmacher wrote:
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> -----------------------------------------------------------
> (Updated June 17, 2014, 1:28 p.m.)
> Review request for KDevelop.
> Repository: kdev-qmljs
> Description
> -------
> This patch is huge (2.1 MB!), but the code changes are not that big. This patch comes from two problems that the QML/JS plugin had:
> * The version given in QML import statements was not used to find the correct module. An user importing QtQuick 2.0 was therefore able to see components that only appeared in QtQuick 2.1 or 2.2.
> * The dependencies of the modules were a bit broken. Builtins1.qml and Builtins2.qml were "built-in" types for QtQuick 2.0 and QtQuick 1.0 respectively (not the inversion :-) ), and several modules happily depended on both files. This yielded duplicate components (Item is declared in Builtins2.qml, Builtins1.qml and QtQuick.qml that was exactly the same file as Builtins1.qml) and slowed down the parsing of the modules.
> Now, the idea is to have one file per module and per version. There is therefore 5 files for QtQuick : QtQuick_1.0.qml, QtQuick_1.1.qml, QtQuick_2.0.qml, QtQuick_2.1.qml and QtQuick_2.2.qml. When the user imports a module X with a version Y, the file X_Y.qml is imported. In order to keep things simple, every file sharing the same major number (1 or 2) is exactly the same. DeclarationBuilder, when asked to parse a module file having a version X.Y, ensures that only the components having exactly the version X.Y are parsed. The others are skipped in a very fast fashion (visit() returns false and no declaration is opened). When a new Qt version comes out, updating QML/JS is as simple as running qmlplugindump and to overwrite QtQuick_2.*.qml with the output. The dump contains every declaration with the versions in which they appeared. No need to run a Python script or something like that to postprocess the dumps.
> The user is now able to import QtQuick 2.1, that imports QtQuick 2.0, and can see every component that exists in QtQuick 2.1 or 2.0. The components of QtQuick 2.2 are still hidden, though. Moreover, extra modules like QtQuick.Dialog, QtQuick.Controls, etc, depend on the exact QtQuick version they require. For instance, QtQuick.Dialog depends on QtQuick 2.0 while Qt.labs.shaders depends on QtQuick 1.0.
> The dependency tree of the modules is now really a tree. This avoids duplicate declarations (each declaration lives in exactly one module and one version), and greatly speeds up the parsing of module files. Filetest now takes 0.90 seconds on my computer, instead of 1.90 before this patch.
> I understand that this patch is fairly complex, so take your time reviewing it :-). I've several exams at the end of this week and not much time to push this stuff, so nothing requires your immediate attention.
> Diffs
> -----
>   codecompletion/tests/qmlcompletiontest.cpp cef0254 
>   duchain/declarationbuilder.h dc132d9 
>   duchain/declarationbuilder.cpp d0f8772 
>   duchain/parsesession.cpp 9ef32a0 
>   qmlplugins/Builtins1.qml 6677c03 
>   qmlplugins/Builtins2.qml 6672239 
>   qmlplugins/Qt.labs.folderlistmodel.qml ee1e58e 
>   qmlplugins/Qt.labs.folderlistmodel_1.0.qml PRE-CREATION 
>   qmlplugins/Qt.labs.gestures.qml 675eeb1 
>   qmlplugins/Qt.labs.gestures_1.0.qml PRE-CREATION 
>   qmlplugins/Qt.labs.particles.qml 9150529 
>   qmlplugins/Qt.labs.particles_1.0.qml PRE-CREATION 
>   qmlplugins/Qt.labs.settings.qml e3cc0f7 
>   qmlplugins/Qt.labs.settings_1.0.qml PRE-CREATION 
>   qmlplugins/Qt.labs.shaders.qml d357277 
>   qmlplugins/Qt.labs.shaders_1.0.qml PRE-CREATION 
>   qmlplugins/QtAudioEngine.qml 1416717 
>   qmlplugins/QtAudioEngine_1.0.qml PRE-CREATION 
>   qmlplugins/QtBluetooth.qml 9cef5cb 
>   qmlplugins/QtBluetooth_5.0.qml PRE-CREATION 
>   qmlplugins/QtBluetooth_5.2.qml PRE-CREATION 
>   qmlplugins/QtMultimedia.qml 0dbf3b7 
>   qmlplugins/QtMultimedia_5.0.qml PRE-CREATION 
>   qmlplugins/QtNfc.qml e49a811 
>   qmlplugins/QtNfc_5.0.qml PRE-CREATION 
>   qmlplugins/QtNfc_5.2.qml PRE-CREATION 
>   qmlplugins/QtPositioning.qml 30b203f 
>   qmlplugins/QtPositioning_5.0.qml PRE-CREATION 
>   qmlplugins/QtPositioning_5.2.qml PRE-CREATION 
>   qmlplugins/QtQuick.Controls.qml 6045273 
>   qmlplugins/QtQuick.Controls_1.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.Controls_1.1.qml PRE-CREATION 
>   qmlplugins/QtQuick.Dialogs.qml 5541c5c 
>   qmlplugins/QtQuick.Dialogs_1.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.Dialogs_1.1.qml PRE-CREATION 
>   qmlplugins/QtQuick.Layouts.qml 2263401 
>   qmlplugins/QtQuick.Layouts_1.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.LocalStorage.qml cbf8a4d 
>   qmlplugins/QtQuick.LocalStorage_2.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.Particles.qml 711c7a2 
>   qmlplugins/QtQuick.Particles_2.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.PrivateWidgets.qml 9947c2b 
>   qmlplugins/QtQuick.PrivateWidgets_1.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.PrivateWidgets_1.1.qml PRE-CREATION 
>   qmlplugins/QtQuick.Window.qml 302e27c 
>   qmlplugins/QtQuick.Window_2.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.Window_2.1.qml PRE-CREATION 
>   qmlplugins/QtQuick.XmlListModel.qml 7e24088 
>   qmlplugins/QtQuick.XmlListModel_2.0.qml PRE-CREATION 
>   qmlplugins/QtQuick.qml e00676d 
>   qmlplugins/QtQuick_1.0.qml PRE-CREATION 
>   qmlplugins/QtQuick_1.1.qml PRE-CREATION 
>   qmlplugins/QtQuick_2.0.qml PRE-CREATION 
>   qmlplugins/QtQuick_2.1.qml PRE-CREATION 
>   qmlplugins/QtQuick_2.2.qml PRE-CREATION 
>   qmlplugins/QtSensors.qml ada6d52 
>   qmlplugins/QtSensors_5.0.qml PRE-CREATION 
>   qmlplugins/QtSensors_5.1.qml PRE-CREATION 
>   qmlplugins/QtTest.qml 3a0e449 
>   qmlplugins/QtTest_1.0.qml PRE-CREATION 
>   qmlplugins/ 7723c94 
>   tests/files/test.qml 86e55d1 
> Diff:
> Testing
> -------
> Two new tests are added: one ensures that the OpacityAnimator declaration exists in QtQuick 2.2, and the other ensures that OpacityAnimator doesn't exist in QtQuick 2.0 (this declaration has been introduced in QtQuick 2.2). All the other tests still pass.
> Thanks,
> Denis Steckelmacher

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the KDevelop-devel mailing list