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

0001 /*
0002     SPDX-FileCopyrightText: 2011 Sven Brauch <svenbrauch@googlemail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "implementfunction.h"
0008 
0009 #include <language/codecompletion/codecompletionmodel.h>
0010 #include <language/duchain/duchainutils.h>
0011 #include <interfaces/icore.h>
0012 #include <interfaces/isession.h>
0013 #include <interfaces/idocumentcontroller.h>
0014 
0015 #include <KTextEditor/View>
0016 #include <KTextEditor/Document>
0017 #include <KTextEditor/Editor>
0018 
0019 #include <QIcon>
0020 
0021 using namespace KDevelop;
0022 using namespace KTextEditor;
0023 
0024 namespace Python {
0025 
0026 ImplementFunctionCompletionItem::ImplementFunctionCompletionItem(const QString& name, const QStringList& arguments, const QString& previousIndent)
0027     : m_arguments(arguments), m_name(name), m_previousIndent(previousIndent)
0028 {
0029     
0030 }
0031 
0032 void ImplementFunctionCompletionItem::execute(KTextEditor::View* view, const KTextEditor::Range& word)
0033 {
0034     auto document = view->document();
0035     const QString finalText = m_name + "(" + m_arguments.join(", ") + "):";
0036     document->replaceText(word, finalText);
0037     // 4 spaces is indentation for python. everyone does it like this. you must, too.
0038     // TODO use kate settings
0039     document->insertLine(word.start().line() + 1, m_previousIndent + "    ");
0040     if ( View* view = ICore::self()->documentController()->activeTextDocumentView() ) {
0041         view->setCursorPosition(Cursor(word.end().line() + 1, m_previousIndent.length() + 4));
0042     }
0043 }
0044 
0045 QVariant ImplementFunctionCompletionItem::data(const QModelIndex& index, int role, const KDevelop::CodeCompletionModel* model) const
0046 {
0047     switch ( role ) {
0048         case KDevelop::CodeCompletionModel::MatchQuality: {
0049             return QVariant(m_name.startsWith("__") ? 0 : 10);
0050         }
0051         case KDevelop::CodeCompletionModel::BestMatchesCount: {
0052             return QVariant(5);
0053         }
0054         case Qt::DisplayRole:
0055             switch ( index.column() ) {
0056                 case KDevelop::CodeCompletionModel::Name:
0057                     return m_name + "(" + m_arguments.join(", ") + ")";
0058                 case KDevelop::CodeCompletionModel::Postfix:
0059                     return "";
0060                 case KDevelop::CodeCompletionModel::Prefix:
0061                     return "Override method";
0062                 default:
0063                     return "";
0064             }
0065         case Qt::DecorationRole:
0066             if( index.column() == KDevelop::CodeCompletionModel::Icon ) {
0067                 KDevelop::CodeCompletionModel::CompletionProperties p(KDevelop::CodeCompletionModel::Function);
0068                 return DUChainUtils::iconForProperties(p);
0069             }
0070             // Fall through
0071         default: return CompletionTreeItem::data(index, role, model);
0072     }
0073 }
0074 
0075 } // namespace Python