diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2011-01-06 10:01:45 +0100 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2011-01-06 15:02:06 +0100 |
commit | 283a3d32cda68b0dcf7642d9ddbfb60dd88d9ccb (patch) | |
tree | 0e6a9ea92cb6c7dfa60bbe8d662b55a1872cc5dd /src/plugins/cpptools/cppmodelmanager.cpp | |
parent | c7070526ec34d0bea66bde2ada0cb2e52d1613db (diff) | |
download | qt-creator-283a3d32cda68b0dcf7642d9ddbfb60dd88d9ccb.tar.gz |
Qml/C++: Fix performance problem with type extraction.
By moving the offending code into a background thread.
Reviewed-by: Erik Verbruggen
Diffstat (limited to 'src/plugins/cpptools/cppmodelmanager.cpp')
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 263e0c1a81..4860027f69 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -291,8 +291,7 @@ public: void operator()() { _doc->check(_mode); - // temporarily disabled because it's too expensive - //_doc->findExposedQmlTypes(); + _doc->findExposedQmlTypes(); _doc->releaseSource(); _doc->releaseTranslationUnit(); @@ -1548,32 +1547,34 @@ static void populate(LanguageUtils::FakeMetaObject::Ptr fmo, Class *klass, } } -QList<LanguageUtils::FakeMetaObject::ConstPtr> CppModelManager::exportedQmlObjects() const +QList<LanguageUtils::FakeMetaObject::ConstPtr> CppModelManager::exportedQmlObjects(const Document::Ptr &doc) const { using namespace LanguageUtils; QList<FakeMetaObject::ConstPtr> exportedObjects; QHash<Class *, FakeMetaObject::Ptr> classes; + const QList<CPlusPlus::Document::ExportedQmlType> exported = doc->exportedQmlTypes(); + if (exported.isEmpty()) + return exportedObjects; + + TypeOfExpression typeOf; const Snapshot currentSnapshot = snapshot(); - foreach (Document::Ptr doc, currentSnapshot) { - TypeOfExpression typeOf; - typeOf.init(doc, currentSnapshot); - foreach (const Document::ExportedQmlType &exportedType, doc->exportedQmlTypes()) { - FakeMetaObject::Ptr fmo(new FakeMetaObject); - fmo->addExport(exportedType.typeName, exportedType.packageName, - ComponentVersion(exportedType.majorVersion, exportedType.minorVersion)); - exportedObjects += fmo; - - Class *klass = lookupClass(exportedType.typeExpression, exportedType.scope, typeOf); - if (!klass) - continue; + typeOf.init(doc, currentSnapshot); + foreach (const Document::ExportedQmlType &exportedType, exported) { + FakeMetaObject::Ptr fmo(new FakeMetaObject); + fmo->addExport(exportedType.typeName, exportedType.packageName, + ComponentVersion(exportedType.majorVersion, exportedType.minorVersion)); + exportedObjects += fmo; + + Class *klass = lookupClass(exportedType.typeExpression, exportedType.scope, typeOf); + if (!klass) + continue; - // add the no-package export, so the cpp name can be used in properties - Overview overview; - fmo->addExport(overview(klass->name()), QString(), ComponentVersion()); + // add the no-package export, so the cpp name can be used in properties + Overview overview; + fmo->addExport(overview(klass->name()), QString(), ComponentVersion()); - populate(fmo, klass, &classes, typeOf); - } + populate(fmo, klass, &classes, typeOf); } return exportedObjects; |