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 }