diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp index 9333867b1ee3285f6006b16856a0fc5dbb95f282..703a94212dab04865b7e2bd0779fa7e568653174 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.cpp +++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp @@ -69,6 +69,15 @@ using namespace QmlJS; namespace { +enum CompletionRelevance { + EnumValueRelevance = -5, + SnippetRelevance = -10, + PropertyRelevance = -15, + SymbolRelevance = -20, + KeywordRelevance = -25, + TypeRelevance = -30 +}; + // Temporary workaround until we have proper icons for QML completion items QIcon iconForColor(const QColor &color) { @@ -599,7 +608,7 @@ static bool isLiteral(AST::Node *ast) } void CodeCompletion::addCompletions(const QHash<QString, const Interpreter::Value *> &newCompletions, - const QIcon &icon) + const QIcon &icon, int relevance) { QHashIterator<QString, const Interpreter::Value *> it(newCompletions); while (it.hasNext()) { @@ -608,24 +617,26 @@ void CodeCompletion::addCompletions(const QHash<QString, const Interpreter::Valu TextEditor::CompletionItem item(this); item.text = it.key(); item.icon = icon; + item.relevance = relevance; m_completions.append(item); } } void CodeCompletion::addCompletions(const QStringList &newCompletions, - const QIcon &icon) + const QIcon &icon, int relevance) { foreach (const QString &text, newCompletions) { TextEditor::CompletionItem item(this); item.text = text; item.icon = icon; + item.relevance = relevance; m_completions.append(item); } } void CodeCompletion::addCompletionsPropertyLhs( const QHash<QString, const Interpreter::Value *> &newCompletions, - const QIcon &icon) + const QIcon &icon, int relevance) { QHashIterator<QString, const Interpreter::Value *> it(newCompletions); while (it.hasNext()) { @@ -644,6 +655,7 @@ void CodeCompletion::addCompletionsPropertyLhs( item.text.append(QLatin1String(": ")); } item.icon = icon; + item.relevance = relevance; m_completions.append(item); } } @@ -720,14 +732,15 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) TextEditor::CompletionItem idPropertyCompletion(this); idPropertyCompletion.text = QLatin1String("id: "); idPropertyCompletion.icon = symbolIcon; + idPropertyCompletion.relevance = PropertyRelevance; m_completions.append(idPropertyCompletion); - addCompletionsPropertyLhs(enumerateProperties(qmlScopeType), symbolIcon); - addCompletions(enumerateProperties(context.scopeChain().qmlTypes), symbolIcon); + addCompletionsPropertyLhs(enumerateProperties(qmlScopeType), symbolIcon, PropertyRelevance); + addCompletions(enumerateProperties(context.scopeChain().qmlTypes), symbolIcon, TypeRelevance); if (ScopeBuilder::isPropertyChangesObject(&context, qmlScopeType) && context.scopeChain().qmlScopeObjects.size() == 2) { - addCompletions(enumerateProperties(context.scopeChain().qmlScopeObjects.first()), symbolIcon); + addCompletions(enumerateProperties(context.scopeChain().qmlScopeObjects.first()), symbolIcon, SymbolRelevance); } } @@ -753,6 +766,7 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) item.text = key; item.data = QString("\"%1\"").arg(key); item.icon = symbolIcon; + item.relevance = EnumValueRelevance; m_completions.append(item); } } @@ -763,12 +777,12 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) // It's a global completion. EnumerateProperties enumerateProperties(&context); enumerateProperties.setGlobalCompletion(true); - addCompletions(enumerateProperties(), symbolIcon); + addCompletions(enumerateProperties(), symbolIcon, SymbolRelevance); } if (doJsKeywordCompletion) { // add js keywords - addCompletions(Scanner::keywords(), keywordIcon); + addCompletions(Scanner::keywords(), keywordIcon, KeywordRelevance); } // add qml extra words @@ -787,9 +801,9 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) << QLatin1String("function"); } - addCompletions(qmlWords, keywordIcon); + addCompletions(qmlWords, keywordIcon, KeywordRelevance); if (!doJsKeywordCompletion) - addCompletions(qmlWordsAlsoInJs, keywordIcon); + addCompletions(qmlWordsAlsoInJs, keywordIcon, KeywordRelevance); } } @@ -811,9 +825,9 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) if (value && completionOperator == QLatin1Char('.')) { // member completion EnumerateProperties enumerateProperties(&context); if (contextFinder.isInLhsOfBinding() && qmlScopeType && expressionUnderCursor.text().at(0).isLower()) - addCompletionsPropertyLhs(enumerateProperties(value), symbolIcon); + addCompletionsPropertyLhs(enumerateProperties(value), symbolIcon, PropertyRelevance); else - addCompletions(enumerateProperties(value), symbolIcon); + addCompletions(enumerateProperties(value), symbolIcon, SymbolRelevance); } else if (value && completionOperator == QLatin1Char('(') && m_startPosition == editor->position()) { // function completion if (const Interpreter::FunctionValue *f = value->asFunctionValue()) { @@ -984,6 +998,7 @@ void CodeCompletion::updateSnippets() item.details = infotip; item.icon = icon; + item.relevance = SnippetRelevance; m_snippets.append(item); break; } @@ -1015,7 +1030,9 @@ void CodeCompletion::updateSnippets() static bool qmlCompletionItemLessThan(const TextEditor::CompletionItem &l, const TextEditor::CompletionItem &r) { - if (l.text.isEmpty()) + if (l.relevance != r.relevance) + return l.relevance > r.relevance; + else if (l.text.isEmpty()) return true; else if (r.text.isEmpty()) return false; diff --git a/src/plugins/qmljseditor/qmljscodecompletion.h b/src/plugins/qmljseditor/qmljscodecompletion.h index 3b2ae62992a15f9048d98dfaf6df2aaf16d837c1..96de6f588e02304d7fd1cc5948b39c89463e40c8 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.h +++ b/src/plugins/qmljseditor/qmljscodecompletion.h @@ -81,12 +81,12 @@ private: bool isDelimiter(const QChar &ch) const; void addCompletions(const QHash<QString, const QmlJS::Interpreter::Value *> &newCompletions, - const QIcon &icon); + const QIcon &icon, int relevance); void addCompletions(const QStringList &newCompletions, - const QIcon &icon); + const QIcon &icon, int relevance); void addCompletionsPropertyLhs( const QHash<QString, const QmlJS::Interpreter::Value *> &newCompletions, - const QIcon &icon); + const QIcon &icon, int relevance); ModelManagerInterface *m_modelManager; TextEditor::ITextEditable *m_editor;