diff options
Diffstat (limited to 'src/plugins/copilot/copilotsuggestion.cpp')
-rw-r--r-- | src/plugins/copilot/copilotsuggestion.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/plugins/copilot/copilotsuggestion.cpp b/src/plugins/copilot/copilotsuggestion.cpp new file mode 100644 index 00000000000..28da286f1f7 --- /dev/null +++ b/src/plugins/copilot/copilotsuggestion.cpp @@ -0,0 +1,79 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "copilotsuggestion.h" + +#include <texteditor/texteditor.h> + +#include <utils/stringutils.h> + +using namespace Utils; +using namespace TextEditor; +using namespace LanguageServerProtocol; + +namespace Copilot::Internal { + +CopilotSuggestion::CopilotSuggestion(const QList<Completion> &completions, + QTextDocument *origin, + int currentCompletion) + : m_completions(completions) + , m_currentCompletion(currentCompletion) +{ + const Completion completion = completions.value(currentCompletion); + const Position start = completion.range().start(); + const Position end = completion.range().end(); + QString text = start.toTextCursor(origin).block().text(); + int length = text.length() - start.character(); + if (start.line() == end.line()) + length = end.character() - start.character(); + text.replace(start.character(), length, completion.text()); + document()->setPlainText(text); + m_start = completion.position().toTextCursor(origin); + m_start.setKeepPositionOnInsert(true); + setCurrentPosition(m_start.position()); +} + +bool CopilotSuggestion::apply() +{ + reset(); + const Completion completion = m_completions.value(m_currentCompletion); + QTextCursor cursor = completion.range().toSelection(m_start.document()); + cursor.insertText(completion.text()); + return true; +} + +bool CopilotSuggestion::applyWord(TextEditorWidget *widget) +{ + const Completion completion = m_completions.value(m_currentCompletion); + const QTextCursor cursor = completion.range().toSelection(m_start.document()); + QTextCursor currentCursor = widget->textCursor(); + const QString text = completion.text(); + const int startPos = currentCursor.positionInBlock() - cursor.positionInBlock() + + (cursor.selectionEnd() - cursor.selectionStart()); + const int next = endOfNextWord(text, startPos); + + if (next == -1) + return apply(); + + // TODO: Allow adding more than one line + QString subText = text.mid(startPos, next - startPos); + subText = subText.left(subText.indexOf('\n')); + if (subText.isEmpty()) + return false; + + currentCursor.insertText(subText); + return false; +} + +void CopilotSuggestion::reset() +{ + m_start.removeSelectedText(); +} + +int CopilotSuggestion::position() +{ + return m_start.position(); +} + +} // namespace Copilot::Internal + |