File indexing completed on 2024-05-19 15:41:37

0001 /*
0002     SPDX-FileCopyrightText: 2013 Atanas Gospodinov <atanas.r.gospodinov@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "replacementvariable.h"
0008 
0009 #include <KTextEditor/View>
0010 #include <KTextEditor/Document>
0011 #include <KTextEditor/CodeCompletionModel>
0012 #include <language/duchain/ducontext.h>
0013 #include <language/codecompletion/codecompletionmodel.h>
0014 
0015 using namespace KDevelop;
0016 using namespace KTextEditor;
0017 
0018 namespace Python {
0019 
0020 ReplacementVariableItem::ReplacementVariableItem(const ReplacementVariable &variable, const QString &description, bool hasEditableFields, Range position)
0021     : m_variable(variable),
0022       m_description(description),
0023       m_hasEditableFields(hasEditableFields),
0024       m_position(position)
0025 {
0026 }
0027 
0028 void ReplacementVariableItem::execute(View* view, const Range &word)
0029 {
0030     auto document = view->document();
0031     if ( ! m_position.isValid() ) {
0032         m_position = word;
0033     }
0034 
0035     Cursor removeUntil = m_position.start();
0036     Range removeRange(m_position.start(), removeUntil);
0037     if ( document->text(m_position).lastIndexOf('{') != -1 ) {
0038         // remove the whole existing expression
0039         removeRange.setEnd({removeRange.end().line(), m_position.end().column()});
0040     }
0041     else {
0042         // remove nothing unless there is an opening { already, in that case remove that
0043         removeRange= {m_position.end(), m_position.end()};
0044 
0045         Range previousCharacter(word.start() - Cursor(0, 1), word.start());
0046         if ( document->text(previousCharacter) == "{" ) {
0047             removeRange.setStart(removeRange.start() - Cursor(0, 1));
0048         }
0049     }
0050 
0051     if ( m_hasEditableFields ) {
0052         document->removeText(removeRange);
0053         view->insertTemplate(removeRange.start(), m_variable.toString());
0054     }
0055     else {
0056         document->removeText(removeRange);
0057         document->insertText(removeRange.start(), m_variable.toString());
0058     }
0059 }
0060 
0061 QVariant ReplacementVariableItem::data(const QModelIndex &index, int role, const KDevelop::CodeCompletionModel *model) const
0062 {
0063     switch (role) {
0064     case KDevelop::CodeCompletionModel::IsExpandable:
0065         return QVariant(false);
0066     case Qt::DisplayRole:
0067         if (index.column() == KTextEditor::CodeCompletionModel::Name) {
0068             return QVariant(m_variable.toString());
0069         }
0070         else if ( index.column() == KTextEditor::CodeCompletionModel::Prefix ) {
0071             return QVariant(m_description);
0072         }
0073         else {
0074             return QVariant("");
0075         }
0076         break;
0077     case KTextEditor::CodeCompletionModel::ItemSelected:
0078         return QVariant("");
0079     case KTextEditor::CodeCompletionModel::InheritanceDepth:
0080         return QVariant(0);
0081     case KDevelop::CodeCompletionModel::BestMatchesCount:
0082         return 5;
0083     case KDevelop::CodeCompletionModel::MatchQuality:
0084         return 0;
0085     default:
0086         //pass
0087         break;
0088     }
0089 
0090     return CompletionTreeItem::data(index, role, model);
0091 }
0092 
0093 }