diff --git a/documentation/manpage/manpageplugin.h b/documentation/manpage/manpageplugin.h --- a/documentation/manpage/manpageplugin.h +++ b/documentation/manpage/manpageplugin.h @@ -53,6 +53,8 @@ void addHistory(const KDevelop::IDocumentation::Ptr& doc ) const override; private: + KDevelop::IDocumentation::Ptr documentationForIdentifier(const QString& identifier) const; + ManPageModel *m_model; }; diff --git a/documentation/manpage/manpageplugin.cpp b/documentation/manpage/manpageplugin.cpp --- a/documentation/manpage/manpageplugin.cpp +++ b/documentation/manpage/manpageplugin.cpp @@ -81,37 +81,63 @@ Q_ASSERT(dec); Q_ASSERT(dec->topContext()); Q_ASSERT(dec->topContext()->parsingEnvironmentFile()); - static const IndexedString cppLanguage("C++"); - if (dec->topContext()->parsingEnvironmentFile()->language() != cppLanguage) { + + static const IndexedString cppLanguage("C++"); // TODO remove because of new clang parser? + static const IndexedString clangLanguage("Clang"); + if (dec->topContext()->parsingEnvironmentFile()->language() != cppLanguage && + dec->topContext()->parsingEnvironmentFile()->language() != clangLanguage) { return {}; } - + // Don't show man-page documentation for files that are part of our project - if(core()->projectController()->findProjectForUrl(dec->topContext()->url().toUrl())) + if (core()->projectController()->findProjectForUrl(dec->topContext()->url().toUrl())) return {}; // Don't show man-page documentation for files that are not in /usr/include, because then we // most probably will be confusing the global function-name with a local one - if(!dec->topContext()->url().str().startsWith("/usr/")) + if (!dec->topContext()->url().str().startsWith("/usr/")) return {}; - + ///@todo Do more verification to make sure that we're showing the correct documentation for the declaration - QString identifier = dec->identifier().toString(); - if(m_model->containsIdentifier(identifier)){ + QString identifier; + IDocumentation::Ptr result; + + // First, try to find help for qualified identifier like 'std::vector' + { + DUChainReadLocker lock; + identifier = dec->qualifiedIdentifier().toString(nullptr); + } + + result = documentationForIdentifier(identifier); + if (result.data()) + return result; + + // Second, try to find help for simple identifier like 'sin' + { DUChainReadLocker lock; - QualifiedIdentifier qid = dec->qualifiedIdentifier(); - if(qid.count() == 1){ - if(m_model->identifierInSection(identifier, "3")){ - return IDocumentation::Ptr(new ManPageDocumentation(identifier, QUrl("man:(3)/"+identifier))); - } else if(m_model->identifierInSection(identifier, "2")){ - return IDocumentation::Ptr(new ManPageDocumentation(identifier, QUrl("man:(2)/"+identifier))); - } else { - return IDocumentation::Ptr(new ManPageDocumentation(identifier, QUrl("man:"+identifier))); - } - } + identifier = dec->identifier().toString(nullptr); } - return {}; + + result = documentationForIdentifier(identifier); + if (result.data()) + return result; + + return {}; +} + +KDevelop::IDocumentation::Ptr ManPagePlugin::documentationForIdentifier(const QString& identifier) const +{ + if (!m_model->containsIdentifier(identifier)) + return KDevelop::IDocumentation::Ptr(nullptr); + + if (m_model->identifierInSection(identifier, "3")) + return IDocumentation::Ptr(new ManPageDocumentation(identifier, QUrl("man:(3)/" + identifier))); + + if (m_model->identifierInSection(identifier, "2")) + return IDocumentation::Ptr(new ManPageDocumentation(identifier, QUrl("man:(2)/" + identifier))); + + return IDocumentation::Ptr(new ManPageDocumentation(identifier, QUrl("man:/" + identifier))); } QAbstractListModel* ManPagePlugin::indexModel() const diff --git a/documentation/qthelp/qthelpproviderabstract.cpp b/documentation/qthelp/qthelpproviderabstract.cpp --- a/documentation/qthelp/qthelpproviderabstract.cpp +++ b/documentation/qthelp/qthelpproviderabstract.cpp @@ -55,25 +55,19 @@ IDocumentation::Ptr QtHelpProviderAbstract::documentationForDeclaration(Declaration* dec) const { QtHelpDocumentation::s_provider = const_cast(this); - if(dec) { + if (dec) { static const IndexedString qmlJs("QML/JS"); - bool isQML; - QStringList idParts; + QString id; { DUChainReadLocker lock; - isQML = dec->topContext()->parsingEnvironmentFile()->language() == qmlJs; - idParts = dec->qualifiedIdentifier().toStringList(); - } - - QString id; - if(isQML && !idParts.isEmpty()) { - id = QLatin1String("QML."); + id = dec->qualifiedIdentifier().toString(nullptr); + if (dec->topContext()->parsingEnvironmentFile()->language() == qmlJs && !id.isEmpty()) + id = QLatin1String("QML.") + id; } - if(!idParts.isEmpty()) { - id += idParts.join(QLatin1String("::")); - QMap links=m_engine.linksForIdentifier(id); + if (!id.isEmpty()) { + QMap links = m_engine.linksForIdentifier(id); if(!links.isEmpty()) return IDocumentation::Ptr(new QtHelpDocumentation(id, links));