forked from qt-creator/qt-creator
Allow the user to add instantiating components
This feature is needed to enable code-completion in a dynamically loaded qml file e.g. let's say that Main.qml is our application entry point and in it will load *dynamically* another qml file: MyView.qml. At runtime MyView.qml will see all Main.qml ids and properties. The problem is that QtCreator doesn't know that MyView.qml will be loaded dynamically by Main.qml and it can't offer code-completion of Main.qml ids and properties. This patch allows the user to inform QtCreator that MyView.qml will be loaded by Main.qml using a simple annotation in MyView.qml: // @scope Main.qml It also works recursively e.g. if MyView.qml loads dynamically another qml file (MyView1.qml) and in MyView1.qml we can add "// @socpe MyView.qml" annotation. This way QtCreator will offer code-completion of MyView.qml and Main.qml ids and properties when coding on MyView1.qml. Change-Id: If50aee81cae40c8b95dbb4c0653e5a91f7a4cff4 Reviewed-by: Fawzi Mohamed <fawzi.mohamed@theqtcompany.com>
This commit is contained in:
@@ -286,6 +286,36 @@ void ScopeChain::update() const
|
|||||||
m_all += m_jsScopes;
|
m_all += m_jsScopes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void addInstantiatingComponents(ContextPtr context, QmlComponentChain *chain)
|
||||||
|
{
|
||||||
|
const QRegExp importCommentPattern(QLatin1String("@scope\\s+(.*)"));
|
||||||
|
foreach (const AST::SourceLocation &commentLoc, chain->document()->engine()->comments()) {
|
||||||
|
const QString &comment = chain->document()->source().mid(commentLoc.begin(), commentLoc.length);
|
||||||
|
|
||||||
|
// find all @scope annotations
|
||||||
|
QStringList additionalScopes;
|
||||||
|
int lastOffset = -1;
|
||||||
|
forever {
|
||||||
|
lastOffset = importCommentPattern.indexIn(comment, lastOffset + 1);
|
||||||
|
if (lastOffset == -1)
|
||||||
|
break;
|
||||||
|
additionalScopes << QFileInfo(chain->document()->path() + QLatin1Char('/') + importCommentPattern.cap(1).trimmed()).absoluteFilePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (const QmlComponentChain *c, chain->instantiatingComponents())
|
||||||
|
additionalScopes.removeAll(c->document()->fileName());
|
||||||
|
|
||||||
|
foreach (const QString &scope, additionalScopes) {
|
||||||
|
Document::Ptr doc = context->snapshot().document(scope);
|
||||||
|
if (doc) {
|
||||||
|
QmlComponentChain *ch = new QmlComponentChain(doc);
|
||||||
|
chain->addInstantiatingComponent(ch);
|
||||||
|
addInstantiatingComponents(context, ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ScopeChain::initializeRootScope()
|
void ScopeChain::initializeRootScope()
|
||||||
{
|
{
|
||||||
ValueOwner *valueOwner = m_context->valueOwner();
|
ValueOwner *valueOwner = m_context->valueOwner();
|
||||||
@@ -329,7 +359,7 @@ void ScopeChain::initializeRootScope()
|
|||||||
if (bind->rootObjectValue())
|
if (bind->rootObjectValue())
|
||||||
m_jsScopes += bind->rootObjectValue();
|
m_jsScopes += bind->rootObjectValue();
|
||||||
}
|
}
|
||||||
|
addInstantiatingComponents(m_context, chain);
|
||||||
m_modified = true;
|
m_modified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user