File indexing completed on 2024-05-05 04:35:33
0001 /* 0002 SPDX-FileCopyrightText: 2010 Niko Sams <niko.sams@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "codemodelitem.h" 0008 0009 #include <ktexteditor/document.h> 0010 #include <ktexteditor/view.h> 0011 0012 #include <language/duchain/duchain.h> 0013 #include <language/duchain/duchainlock.h> 0014 #include <language/duchain/declaration.h> 0015 #include <language/duchain/duchainutils.h> 0016 #include <language/duchain/abstractfunctiondeclaration.h> 0017 0018 #include <language/codecompletion/codecompletionmodel.h> 0019 #include <language/codecompletion/codecompletionhelper.h> 0020 0021 #include <navigation/navigationwidget.h> 0022 0023 #include "completiondebug.h" 0024 0025 using namespace KDevelop; 0026 0027 namespace Php 0028 { 0029 0030 CodeModelCompletionItem::CodeModelCompletionItem(const ParsingEnvironmentFilePointer &env, const CompletionCodeModelItem &item) 0031 : CompletionTreeItem(), m_item(item), m_env(env) 0032 { 0033 } 0034 0035 QVariant CodeModelCompletionItem::data(const QModelIndex& index, int role, const KDevelop::CodeCompletionModel* model) const 0036 { 0037 0038 DUChainReadLocker lock(DUChain::lock(), 500); 0039 if (!lock.locked()) { 0040 qCDebug(COMPLETION) << "Failed to lock the du-chain in time"; 0041 return QVariant(); 0042 } 0043 0044 switch (role) { 0045 case Qt::DisplayRole: 0046 switch (index.column()) { 0047 case KDevelop::CodeCompletionModel::Name: 0048 return QVariant(m_item.prettyName.str()); 0049 case KDevelop::CodeCompletionModel::Prefix: 0050 return QStringLiteral("class"); 0051 } 0052 break; 0053 case Qt::DecorationRole: 0054 if( index.column() == CodeCompletionModel::Icon ) { 0055 CodeCompletionModel::CompletionProperties p = completionProperties(); 0056 lock.unlock(); 0057 return DUChainUtils::iconForProperties(p); 0058 } 0059 break; 0060 case CodeCompletionModel::IsExpandable: 0061 return QVariant(true); 0062 case CodeCompletionModel::ExpandingWidget: { 0063 if (!declaration()) return QVariant(); 0064 QWidget *nav = new NavigationWidget(declaration(), model->currentTopContext()); 0065 0066 QVariant v; 0067 v.setValue<QWidget*>(nav); 0068 return v; 0069 } 0070 } 0071 return QVariant(); 0072 } 0073 0074 CodeCompletionModel::CompletionProperties CodeModelCompletionItem::completionProperties() const 0075 { 0076 CodeCompletionModel::CompletionProperties ret = CodeCompletionModel::Class; 0077 return ret; 0078 } 0079 0080 void CodeModelCompletionItem::execute(KTextEditor::View* view, const KTextEditor::Range& word) 0081 { 0082 KTextEditor::Document *document = view->document(); 0083 document->replaceText(word, m_item.prettyName.str()); 0084 0085 if (declaration() && dynamic_cast<AbstractFunctionDeclaration*>(declaration().data())) { 0086 //Do some intelligent stuff for functions with the parens: 0087 KTextEditor::Cursor pos = word.start(); 0088 pos.setColumn(pos.column() + m_item.prettyName.length()); 0089 insertFunctionParenText(view, pos, declaration()); 0090 } 0091 } 0092 0093 DeclarationPointer CodeModelCompletionItem::declaration() const 0094 { 0095 if (!m_decl) { 0096 KDevelop::DUChainReadLocker lock(KDevelop::DUChain::lock()); 0097 QList<Declaration*> decls = m_env->topContext()->findDeclarations(m_item.id); 0098 if (decls.isEmpty()) return DeclarationPointer(); 0099 m_decl = decls.first(); 0100 } 0101 return m_decl; 0102 } 0103 0104 0105 } 0106