QmlJS: Autocomplete dot and colon for properties.

Reviewed-by: Roberto Raggi
This commit is contained in:
Christian Kamm
2010-06-07 17:33:44 +02:00
parent d0d61182cb
commit 3b8b6e89cc
6 changed files with 98 additions and 67 deletions

View File

@@ -622,6 +622,31 @@ void CodeCompletion::addCompletions(const QStringList &newCompletions,
}
}
void CodeCompletion::addCompletionsPropertyLhs(
const QHash<QString, const Interpreter::Value *> &newCompletions,
const QIcon &icon)
{
QHashIterator<QString, const Interpreter::Value *> it(newCompletions);
while (it.hasNext()) {
it.next();
TextEditor::CompletionItem item(this);
item.text = it.key();
if (const Interpreter::QmlObjectValue *qmlValue = dynamic_cast<const Interpreter::QmlObjectValue *>(it.value())) {
// to distinguish "anchors." from "gradient:" we check if the right hand side
// type is instantiatable or is the prototype of an instantiatable object
if (qmlValue->hasChildInPackage())
item.text.append(QLatin1String(": "));
else
item.text.append(QLatin1Char('.'));
} else {
item.text.append(QLatin1String(": "));
}
item.icon = icon;
m_completions.append(item);
}
}
int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
{
m_editor = editor;
@@ -665,6 +690,14 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
if (m_startPosition > 0)
completionOperator = editor->characterAt(m_startPosition - 1);
QTextCursor startPositionCursor(edit->document());
startPositionCursor.setPosition(m_startPosition);
CompletionContextFinder contextFinder(startPositionCursor);
const Interpreter::ObjectValue *qmlScopeType = 0;
if (contextFinder.isInQmlContext())
qmlScopeType = context.lookupType(document.data(), contextFinder.qmlObjectTypeName());
if (completionOperator.isSpace() || completionOperator.isNull() || isDelimiter(completionOperator) ||
(completionOperator == QLatin1Char('(') && m_startPosition != editor->position())) {
@@ -672,14 +705,6 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
bool doQmlKeywordCompletion = true;
bool doJsKeywordCompletion = true;
QTextCursor startPositionCursor(edit->document());
startPositionCursor.setPosition(m_startPosition);
CompletionContextFinder contextFinder(startPositionCursor);
const Interpreter::ObjectValue *qmlScopeType = 0;
if (contextFinder.isInQmlContext())
qmlScopeType = context.lookupType(document.data(), contextFinder.qmlObjectTypeName());
if (contextFinder.isInLhsOfBinding() && qmlScopeType) {
doGlobalCompletion = false;
doJsKeywordCompletion = false;
@@ -688,7 +713,7 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
enumerateProperties.setGlobalCompletion(true);
enumerateProperties.setEnumerateGeneratedSlots(true);
addCompletions(enumerateProperties(qmlScopeType), symbolIcon);
addCompletionsPropertyLhs(enumerateProperties(qmlScopeType), symbolIcon);
addCompletions(enumerateProperties(context.scopeChain().qmlTypes), symbolIcon);
if (ScopeBuilder::isPropertyChangesObject(&context, qmlScopeType)
@@ -776,7 +801,10 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
if (value && completionOperator == QLatin1Char('.')) { // member completion
EnumerateProperties enumerateProperties(&context);
addCompletions(enumerateProperties(value), symbolIcon);
if (contextFinder.isInLhsOfBinding() && qmlScopeType)
addCompletionsPropertyLhs(enumerateProperties(value), symbolIcon);
else
addCompletions(enumerateProperties(value), symbolIcon);
} else if (value && completionOperator == QLatin1Char('(') && m_startPosition == editor->position()) {
// function completion
if (const Interpreter::FunctionValue *f = value->asFunctionValue()) {

View File

@@ -84,6 +84,9 @@ private:
const QIcon &icon);
void addCompletions(const QStringList &newCompletions,
const QIcon &icon);
void addCompletionsPropertyLhs(
const QHash<QString, const QmlJS::Interpreter::Value *> &newCompletions,
const QIcon &icon);
ModelManagerInterface *m_modelManager;
TextEditor::ITextEditable *m_editor;