diff --git a/plugins/clang/codecompletion/context.cpp b/plugins/clang/codecompletion/context.cpp --- a/plugins/clang/codecompletion/context.cpp +++ b/plugins/clang/codecompletion/context.cpp @@ -55,6 +55,7 @@ #include "../duchain/navigationwidget.h" #include "../clangsettings/clangsettingsmanager.h" +#include #include #include @@ -105,6 +106,12 @@ CCP_Unlikely = 80 }; +QStringRef trimLeft(const QStringRef string) { + const int position = std::find_if_not(string.begin(), string.end(), + [](QChar c){ return c.isSpace(); }) - string.begin(); + return string.mid(position); +} + /** * Common base class for Clang code completion items. */ @@ -338,7 +345,16 @@ void execute(KTextEditor::View* view, const KTextEditor::Range& word) override { - view->document()->replaceText(word, m_replacement); + KTextEditor::Document* const document = view->document(); + + // try and replace leading typed text that match the proposed implementation + const QStringRef leading = trimLeft(document->line(word.end().line()).leftRef(word.end().column())); + if (!leading.isEmpty() && (m_display.startsWith(leading) || m_replacement.startsWith(leading))) { + const KTextEditor::Cursor newStart = {word.end().line(), word.end().column() - leading.size()}; + document->replaceText({newStart, word.end()}, m_replacement); + } else { + document->replaceText(word, m_replacement); + } } };