void SimpleRefactoring::doContextMenu(KDevelop::ContextMenuExtension& extension, KDevelop::Context* context) { if(DeclarationContext* declContext = dynamic_cast<DeclarationContext*>(context)){ //Actions on declarations qRegisterMetaType<KDevelop::IndexedDeclaration>("KDevelop::IndexedDeclaration"); DUChainReadLocker lock(DUChain::lock()); Declaration* declaration = declContext->declaration().data(); if(declaration) { QFileInfo finfo(declaration->topContext()->url().str()); if (finfo.isWritable()) { QAction* action = new QAction(i18n("Rename %1", declaration->qualifiedIdentifier().toString()), this); action->setData(QVariant::fromValue(IndexedDeclaration(declaration))); action->setIcon(KIcon("edit-rename")); connect(action, SIGNAL(triggered(bool)), this, SLOT(executeRenameAction())); extension.addAction(ContextMenuExtension::RefactorGroup, action); if(declContext->use().isEmpty() && declaration->isFunctionDeclaration() && declaration->internalContext() && declaration->internalContext()->type() == DUContext::Other && !dynamic_cast<Cpp::TemplateDeclaration*>(declaration)) { AbstractFunctionDeclaration* funDecl = dynamic_cast<AbstractFunctionDeclaration*>(declaration); if(funDecl && !funDecl->isInline() && !dynamic_cast<FunctionDefinition*>(funDecl)) { //Is a candidate for moving into source QAction* action = new QAction(i18n("Create separate definition for %1", declaration->qualifiedIdentifier().toString()), this); action->setData(QVariant::fromValue(IndexedDeclaration(declaration))); // action->setIcon(KIcon("arrow-right")); connect(action, SIGNAL(triggered(bool)), this, SLOT(executeMoveIntoSourceAction())); extension.addAction(ContextMenuExtension::RefactorGroup, action); } }
bool DUChainItemData::execute( QString& /*filterText*/ ) { DUChainReadLocker lock;; Declaration* decl = m_item.m_item.data(); if(!decl) { return false; } if(m_openDefinition && FunctionDefinition::definition(decl)) { decl = FunctionDefinition::definition(decl); } QUrl url = decl->url().toUrl(); KTextEditor::Cursor cursor = decl->rangeInCurrentRevision().start(); DUContext* internal = decl->internalContext(); if(internal && (internal->type() == DUContext::Other || internal->type() == DUContext::Class)) { //Move into the body if(internal->range().end.line > internal->range().start.line) { cursor = KTextEditor::Cursor(internal->range().start.line+1, 0); //Move into the body } } lock.unlock(); ICore::self()->documentController()->openDocument( url, cursor ); return true; }
Declaration * DUChainTestBase::getBuiltinDeclaration(const QString &name, TopDUContext *top, DUContext *ctx) { QStringList list = name.split("#"); DUContext *context = (ctx) ? ctx : top->childContexts().first(); AbstractType::Ptr type = getBuiltinsType(list.first(), context); StructureType::Ptr sType = StructureType::Ptr::dynamicCast(type); Declaration *d = sType->declaration(top); QualifiedIdentifier id(list.first() + "::" + list.last()); QList<Declaration *> decls = d->internalContext()->findDeclarations(id); return (decls.isEmpty()) ? nullptr : decls.last(); }