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