Clang: Provide all overloads for function definition completion

When we complete a function definition with the parameter list
it is important to have multiple entries to select.

Change-Id: I25e94b58cfe4831387d66eecdec74712addb7ec5
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-07-31 11:44:07 +02:00
parent b1f156ab35
commit 0f96f735f0
5 changed files with 153 additions and 83 deletions

View File

@@ -64,14 +64,51 @@ namespace Internal {
using ClangBackEnd::CodeCompletion;
using TextEditor::AssistProposalItemInterface;
namespace {
static void addAssistProposalItem(QList<AssistProposalItemInterface *> &items,
const CodeCompletion &codeCompletion,
const QString &name)
{
ClangAssistProposalItem *item = new ClangAssistProposalItem;
items.push_back(item);
QList<AssistProposalItemInterface *> toAssistProposalItems(const CodeCompletions &completions)
item->setText(name);
item->setOrder(int(codeCompletion.priority));
item->appendCodeCompletion(codeCompletion);
}
static void addFunctionOverloadAssistProposalItem(QList<AssistProposalItemInterface *> &items,
const ClangCompletionAssistInterface *interface,
const CodeCompletion &codeCompletion,
const QString &name)
{
ClangBackEnd::CodeCompletionChunk resultType = codeCompletion.chunks.first();
QTC_ASSERT(resultType.kind == ClangBackEnd::CodeCompletionChunk::ResultType,
return;);
auto *item = static_cast<ClangAssistProposalItem *>(items.last());
item->setHasOverloadsWithParameters(true);
QTextCursor cursor = interface->textEditorWidget()->textCursor();
cursor.setPosition(interface->position());
cursor.movePosition(QTextCursor::StartOfWord);
if (::Utils::Text::matchPreviousWord(*interface->textEditorWidget(),
cursor,
resultType.text.toString())) {
addAssistProposalItem(items, codeCompletion, name);
} else {
item->appendCodeCompletion(codeCompletion);
}
}
static QList<AssistProposalItemInterface *> toAssistProposalItems(
const CodeCompletions &completions,
const ClangCompletionAssistInterface *interface)
{
bool signalCompletion = false; // TODO
bool slotCompletion = false; // TODO
QHash<QString, ClangAssistProposalItem *> items;
QList<AssistProposalItemInterface *> items;
items.reserve(completions.size());
for (const CodeCompletion &codeCompletion : completions) {
if (codeCompletion.text.isEmpty()) // TODO: Make isValid()?
continue;
@@ -80,35 +117,19 @@ QList<AssistProposalItemInterface *> toAssistProposalItems(const CodeCompletions
if (slotCompletion && codeCompletion.completionKind != CodeCompletion::SlotCompletionKind)
continue;
QString name;
if (codeCompletion.completionKind == CodeCompletion::KeywordCompletionKind)
name = CompletionChunksToTextConverter::convertToName(codeCompletion.chunks);
const QString name = codeCompletion.completionKind == CodeCompletion::KeywordCompletionKind
? CompletionChunksToTextConverter::convertToName(codeCompletion.chunks)
: codeCompletion.text.toString();
if (!items.empty() && items.last()->text() == name && codeCompletion.hasParameters)
addFunctionOverloadAssistProposalItem(items, interface, codeCompletion, name);
else
name = codeCompletion.text.toString();
ClangAssistProposalItem *item = items.value(name, 0);
if (item) {
if (codeCompletion.hasParameters)
item->setHasOverloadsWithParameters(true);
} else {
item = new ClangAssistProposalItem;
items.insert(name, item);
item->setText(name);
item->setOrder(int(codeCompletion.priority));
item->setCodeCompletion(codeCompletion);
}
addAssistProposalItem(items, codeCompletion, name);
}
QList<AssistProposalItemInterface *> results;
results.reserve(items.size());
std::copy(items.cbegin(), items.cend(), std::back_inserter(results));
return results;
return items;
}
} // Anonymous
using namespace CPlusPlus;
using namespace TextEditor;
@@ -147,7 +168,7 @@ void ClangCompletionAssistProcessor::handleAvailableCompletions(
QTC_CHECK(m_completions.isEmpty());
if (m_sentRequestType == NormalCompletion) {
m_completions = toAssistProposalItems(completions);
m_completions = toAssistProposalItems(completions, m_interface.data());
if (m_addSnippets && !m_completions.isEmpty())
addSnippets();