diff --git a/duchain/navigation/declarationnavigationcontext.h b/duchain/navigation/declarationnavigationcontext.h --- a/duchain/navigation/declarationnavigationcontext.h +++ b/duchain/navigation/declarationnavigationcontext.h @@ -37,11 +37,14 @@ DeclarationNavigationContext(KDevelop::DeclarationPointer decl, KDevelop::TopDUContextPointer topContext, KDevelop::AbstractNavigationContext* previousContext = 0); QString m_fullyQualifiedModuleIdentifier; - + protected: void htmlIdentifiedType(KDevelop::AbstractType::Ptr type, const KDevelop::IdentifiedType* idType) override; void eventuallyMakeTypeLinks(AbstractType::Ptr type) override; QString getLink(const QString& name, DeclarationPointer declaration, NavigationAction::Type actionType); + +private: + QString typeLinkOrString(const AbstractType::Ptr type); }; } diff --git a/duchain/navigation/declarationnavigationcontext.cpp b/duchain/navigation/declarationnavigationcontext.cpp --- a/duchain/navigation/declarationnavigationcontext.cpp +++ b/duchain/navigation/declarationnavigationcontext.cpp @@ -31,6 +31,7 @@ #include #include "helpers.h" +#include namespace Python { @@ -47,44 +48,47 @@ return createLink(name, targetId, action); }; +QString DeclarationNavigationContext::typeLinkOrString(const AbstractType::Ptr type) { + if ( type ) { + if ( auto idType = dynamic_cast(type.data()) ) { + return getLink(type->toString(), + DeclarationPointer(idType->declaration(m_topContext.data())), + NavigationAction::NavigateDeclaration); + } + return type->toString().toHtmlEscaped(); + } + return i18nc("refers to an unknown type in programming", "unknown"); +} + void DeclarationNavigationContext::htmlIdentifiedType(AbstractType::Ptr type, const IdentifiedType* idType) { // TODO this code is duplicate of variablelengthcontainer::toString, resolve that somehow - if ( auto t = ListType::Ptr::dynamicCast(type) ) { - auto map = MapType::Ptr::dynamicCast(t); - const QString containerType = getLink(t->containerToString(), DeclarationPointer(idType->declaration(m_topContext.data())), NavigationAction::NavigateDeclaration ); + if ( auto listType = type.cast() ) { QString contentType; - if ( map ) { - if ( auto key = map->keyType().abstractType() ) { - IdentifiedType* identifiedKey = dynamic_cast(key.data()); - if ( identifiedKey ) { - contentType.append(getLink(key->toString(), DeclarationPointer( - identifiedKey->declaration(m_topContext.data())), - NavigationAction::NavigateDeclaration - )); - } - else { - contentType.append(key->toString()); - } - contentType.append(" : "); - } + const QString containerType = getLink(listType->containerToString(), + DeclarationPointer(idType->declaration(m_topContext.data())), + NavigationAction::NavigateDeclaration ); + if ( auto map = listType.cast() ) { + contentType.append(typeLinkOrString(map->keyType().abstractType())); + contentType.append(" : "); } - if ( AbstractType::Ptr contents = t->contentType().abstractType() ) { - IdentifiedType* identifiedContent = dynamic_cast(contents.data()); - if ( identifiedContent ) { - contentType.append(getLink(contents->toString(), DeclarationPointer( - identifiedContent->declaration(m_topContext.data())), - NavigationAction::NavigateDeclaration - )); - } - else { - contentType.append(contents->toString()); + contentType.append(typeLinkOrString(listType->contentType().abstractType())); + modifyHtml() += i18nc("as in list of int, set of string", "%1 of %2", containerType, contentType); + } + else if (auto indexedContainer = type.cast()) { + const QString containerType = getLink(indexedContainer->containerToString(), + DeclarationPointer(idType->declaration(m_topContext.data())), + NavigationAction::NavigateDeclaration ); + QStringList typesArray; + for ( int i = 0; i < indexedContainer->typesCount(); i++ ) { + if ( i >= 5 ) { + // Don't print more than five types explicitly + typesArray << "..."; + break; } + typesArray << typeLinkOrString(indexedContainer->typeAt(i).abstractType()); } - else { - contentType.append(i18nc("refers to an unknown type in programming", "unknown")); - } - modifyHtml() += i18nc("as in list of int, set of string", "%1 of %2", containerType, contentType); + modifyHtml() += i18n("%1 of ( %2 )", containerType, typesArray.join(", ")); } else { KDevelop::AbstractDeclarationNavigationContext::htmlIdentifiedType(type, idType); diff --git a/duchain/types/indexedcontainer.cpp b/duchain/types/indexedcontainer.cpp --- a/duchain/types/indexedcontainer.cpp +++ b/duchain/types/indexedcontainer.cpp @@ -80,7 +80,7 @@ QString prefix = KDevelop::StructureType::toString(); QStringList typesArray; for ( int i = 0; i < typesCount(); i++ ) { - if ( i > 5 ) { + if ( i >= 5 ) { // Don't print more than five types explicitly typesArray << "..."; break;