diff --git a/src/libs/utils/textutils.h b/src/libs/utils/textutils.h index 8829604c977..cab97cf0771 100644 --- a/src/libs/utils/textutils.h +++ b/src/libs/utils/textutils.h @@ -29,7 +29,6 @@ #include "utils_global.h" #include -#include QT_FORWARD_DECLARE_CLASS(QTextDocument) QT_FORWARD_DECLARE_CLASS(QTextCursor) @@ -59,50 +58,5 @@ QTCREATOR_UTILS_EXPORT int utf8NthLineOffset(const QTextDocument *textDocument, const QByteArray &buffer, int line); -template -void moveToPrevChar(CharacterProvider &provider, QTextCursor &cursor) -{ - cursor.movePosition(QTextCursor::PreviousCharacter); - while (provider.characterAt(cursor.position()).isSpace()) - cursor.movePosition(QTextCursor::PreviousCharacter); -} - -template -void moveToPrevWord(CharacterProvider &provider, QTextCursor &cursor) -{ - cursor.movePosition(QTextCursor::PreviousWord); - while (provider.characterAt(cursor.position()) == ':') - cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor, 2); -} - -template -bool matchPreviousWord(CharacterProvider &provider, QTextCursor cursor, QString pattern) -{ - cursor.movePosition(QTextCursor::PreviousWord); - while (provider.characterAt(cursor.position()) == ':') - cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor, 2); - - int previousWordStart = cursor.position(); - cursor.movePosition(QTextCursor::NextWord); - moveToPrevChar(provider, cursor); - QString toMatch = provider.textAt(previousWordStart, cursor.position() - previousWordStart + 1); - - pattern = pattern.simplified(); - while (!pattern.isEmpty() && pattern.endsWith(toMatch)) { - pattern.chop(toMatch.length()); - if (pattern.endsWith(' ')) - pattern.chop(1); - if (!pattern.isEmpty()) { - cursor.movePosition(QTextCursor::StartOfWord); - cursor.movePosition(QTextCursor::PreviousWord); - previousWordStart = cursor.position(); - cursor.movePosition(QTextCursor::NextWord); - moveToPrevChar(provider, cursor); - toMatch = provider.textAt(previousWordStart, cursor.position() - previousWordStart + 1); - } - } - return pattern.isEmpty(); -} - } // Text } // Utils diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index 276527117cc..e88970bd6e1 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalitem.cpp @@ -198,9 +198,9 @@ void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulato QTextCursor cursor = manipulator.textCursorAt(basePosition); bool abandonParen = false; - if (::Utils::Text::matchPreviousWord(manipulator, cursor, "&")) { - ::Utils::Text::moveToPrevWord(manipulator, cursor); - ::Utils::Text::moveToPrevChar(manipulator, cursor); + if (Utils::Text::matchPreviousWord(manipulator, cursor, "&")) { + Utils::Text::moveToPreviousWord(manipulator, cursor); + Utils::Text::moveToPreviousChar(manipulator, cursor); const QChar prevChar = manipulator.characterAt(cursor.position()); cursor.setPosition(basePosition); abandonParen = QString("(;,{}").contains(prevChar); @@ -211,7 +211,7 @@ void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulato if (!abandonParen && ccr.completionKind == CodeCompletion::FunctionDefinitionCompletionKind) { const CodeCompletionChunk resultType = ccr.chunks.first(); if (resultType.kind == CodeCompletionChunk::ResultType) { - if (::Utils::Text::matchPreviousWord(manipulator, cursor, resultType.text.toString())) { + if (Utils::Text::matchPreviousWord(manipulator, cursor, resultType.text.toString())) { extraCharacters += methodDefinitionParameters(ccr.chunks); // To skip the next block. abandonParen = true; diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 5e2b6881c6d..db68f680bc6 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -98,9 +98,9 @@ static void addFunctionOverloadAssistProposalItem(QListtextEditorWidget(), - cursor, - resultType.text.toString())) { + if (Utils::Text::matchPreviousWord(*interface->textEditorWidget(), + cursor, + resultType.text.toString())) { // Function definition completion - do not merge completions together. addAssistProposalItem(items, codeCompletion, name); } else { diff --git a/src/plugins/clangcodemodel/clangutils.h b/src/plugins/clangcodemodel/clangutils.h index 956f1dee4aa..43866e6a9c7 100644 --- a/src/plugins/clangcodemodel/clangutils.h +++ b/src/plugins/clangcodemodel/clangutils.h @@ -29,6 +29,8 @@ #include +#include + QT_BEGIN_NAMESPACE class QTextBlock; QT_END_NAMESPACE @@ -66,5 +68,53 @@ QString diagnosticCategoryPrefixRemoved(const QString &text); void generateCompilationDB(::Utils::FileName projectDir, CppTools::ProjectInfo projectInfo); +namespace Text { + +template +void moveToPreviousChar(CharacterProvider &provider, QTextCursor &cursor) +{ + cursor.movePosition(QTextCursor::PreviousCharacter); + while (provider.characterAt(cursor.position()).isSpace()) + cursor.movePosition(QTextCursor::PreviousCharacter); +} + +template +void moveToPreviousWord(CharacterProvider &provider, QTextCursor &cursor) +{ + cursor.movePosition(QTextCursor::PreviousWord); + while (provider.characterAt(cursor.position()) == ':') + cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor, 2); +} + +template +bool matchPreviousWord(CharacterProvider &provider, QTextCursor cursor, QString pattern) +{ + cursor.movePosition(QTextCursor::PreviousWord); + while (provider.characterAt(cursor.position()) == ':') + cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor, 2); + + int previousWordStart = cursor.position(); + cursor.movePosition(QTextCursor::NextWord); + moveToPreviousChar(provider, cursor); + QString toMatch = provider.textAt(previousWordStart, cursor.position() - previousWordStart + 1); + + pattern = pattern.simplified(); + while (!pattern.isEmpty() && pattern.endsWith(toMatch)) { + pattern.chop(toMatch.length()); + if (pattern.endsWith(' ')) + pattern.chop(1); + if (!pattern.isEmpty()) { + cursor.movePosition(QTextCursor::StartOfWord); + cursor.movePosition(QTextCursor::PreviousWord); + previousWordStart = cursor.position(); + cursor.movePosition(QTextCursor::NextWord); + moveToPreviousChar(provider, cursor); + toMatch = provider.textAt(previousWordStart, cursor.position() - previousWordStart + 1); + } + } + return pattern.isEmpty(); +} + +} // namespace Text } // namespace Utils } // namespace Clang