//Returns only the name, no template-parameters or scope QString cursorItemText() { KDevelop::DUChainReadLocker lock( DUChain::lock() ); Declaration* decl = cursorDeclaration(); if(!decl) return QString(); IDocument* doc = ICore::self()->documentController()->activeDocument(); if(!doc) return QString(); TopDUContext* context = DUChainUtils::standardContextForUrl( doc->url() ); if( !context ) { qCDebug(PLUGIN_QUICKOPEN) << "Got no standard context"; return QString(); } AbstractType::Ptr t = decl->abstractType(); IdentifiedType* idType = dynamic_cast<IdentifiedType*>(t.data()); if( idType && idType->declaration(context) ) decl = idType->declaration(context); if(!decl->qualifiedIdentifier().isEmpty()) return decl->qualifiedIdentifier().last().identifier().str(); return QString(); }
void ContextBuilder::addBaseType( KDevelop::BaseClassInstance base, BaseSpecifierAST *node ) { DUChainWriteLocker lock(DUChain::lock()); addImportedContexts(); //Make sure the template-contexts are imported first, before any parent-class contexts. Q_ASSERT(currentContext()->type() == DUContext::Class); AbstractType::Ptr baseClass = base.baseClass.abstractType(); IdentifiedType* idType = dynamic_cast<IdentifiedType*>(baseClass.unsafeData()); Declaration* idDecl = 0; if( idType && (idDecl = idType->declaration(currentContext()->topContext())) ) { DUContext* ctx = idDecl->logicalInternalContext(currentContext()->topContext()); if(ctx) { currentContext()->addImportedParentContext( ctx ); }else{ currentContext()->addIndirectImport( DUContext::Import(idType->declarationId()) ); QString text = i18n("Could not resolve base class, adding it indirectly: %1", (base.baseClass ? base.baseClass.abstractType()->toString() : QString())); lock.unlock(); createUserProblem(node, text); } } else if( !baseClass.cast<DelayedType>() ) { QString text = i18n("Invalid base class: %1", (base.baseClass ? base.baseClass.abstractType()->toString() : QString())); lock.unlock(); createUserProblem(node, text); } }
void DeclarationNavigationContext::htmlIdentifiedType(AbstractType::Ptr type, const IdentifiedType* idType) { // TODO this code is duplicate of variablelengthcontainer::toString, resolve that somehow if ( VariableLengthContainer::Ptr t = VariableLengthContainer::Ptr::dynamicCast(type) ) { makeLink(t->containerToString(), DeclarationPointer(idType->declaration(m_topContext.data())), NavigationAction::NavigateDeclaration ); modifyHtml() += i18n(" of "); if ( t->hasKeyType() ) { if ( AbstractType::Ptr key = t->keyType().abstractType() ) { IdentifiedType* identifiedKey = dynamic_cast<IdentifiedType*>(key.unsafeData()); if ( identifiedKey ) { makeLink(key->toString(), DeclarationPointer( identifiedKey->declaration(m_topContext.data())), NavigationAction::NavigateDeclaration ); } else { modifyHtml() += key->toString(); } modifyHtml() += " : "; } } if ( AbstractType::Ptr contents = t->contentType().abstractType() ) { IdentifiedType* identifiedContent = dynamic_cast<IdentifiedType*>(contents.unsafeData()); if ( identifiedContent ) { makeLink(contents->toString(), DeclarationPointer( identifiedContent->declaration(m_topContext.data())), NavigationAction::NavigateDeclaration ); } else { modifyHtml() += contents->toString(); } } else { modifyHtml() += i18n("unknown"); } } else { KDevelop::AbstractDeclarationNavigationContext::htmlIdentifiedType(type, idType); } }