diff options
author | Marco Benelli <marco.benelli@qt.io> | 2016-12-02 12:31:37 +0100 |
---|---|---|
committer | Marco Benelli <marco.benelli@qt.io> | 2016-12-07 10:50:07 +0000 |
commit | f78dd2be6402bc075cda592f36bedd2b8f7c39df (patch) | |
tree | d278590215c33e669996fbc7932ccb514fae717e | |
parent | 2497f5ea1dd0bc1e1bc37164f2e4c49401485d69 (diff) | |
download | qt-creator-f78dd2be6402bc075cda592f36bedd2b8f7c39df.tar.gz |
QmlJs: disambiguate help lookup
The help system used to be confused by types from QtControls2, since
they have often the same name and version as the ones in QtControls.
This patch resolve the issue by looking for a number in the module
name, and then using the url found as helpId.
Task-number: QTCREATORBUG-16851
Change-Id: I48196d90b0fea5edf50751900864a39075894866
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
-rw-r--r-- | src/plugins/qmljseditor/qmljshoverhandler.cpp | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp index c83caef54d..a767d6713b 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.cpp +++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp @@ -29,6 +29,7 @@ #include "qmljseditordocument.h" #include "qmlexpressionundercursor.h" +#include <coreplugin/icore.h> #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/helpmanager.h> @@ -49,6 +50,8 @@ #include <QDir> #include <QList> #include <QStringRef> +#include <QRegularExpression> +#include <QRegularExpressionMatch> using namespace Core; using namespace QmlJS; @@ -143,30 +146,57 @@ bool QmlJSHoverHandler::setQmlTypeHelp(const ScopeChain &scopeChain, const Docum const ObjectValue *value, const QStringList &qName) { QString moduleName = getModuleName(scopeChain, qmlDocument, value); + + QMap<QString, QUrl> urlMap; + QString helpId; do { QStringList helpIdPieces(qName); helpIdPieces.prepend(moduleName); helpIdPieces.prepend(QLatin1String("QML")); helpId = helpIdPieces.join(QLatin1Char('.')); - if (!HelpManager::linksForIdentifier(helpId).isEmpty()) + urlMap = HelpManager::linksForIdentifier(helpId); + if (!urlMap.isEmpty()) break; if (helpIdPieces.size() > 3) { QString lm = helpIdPieces.value(2); helpIdPieces.removeAt(2); helpId = helpIdPieces.join(QLatin1Char('.')); - if (!HelpManager::linksForIdentifier(helpId).isEmpty()) + urlMap = HelpManager::linksForIdentifier(helpId); + if (!urlMap.isEmpty()) break; helpIdPieces.replace(1, lm); - if (!HelpManager::linksForIdentifier(helpId).isEmpty()) + urlMap = HelpManager::linksForIdentifier(helpId); + if (!urlMap.isEmpty()) break; } helpIdPieces.removeAt(1); helpId = helpIdPieces.join(QLatin1Char('.')); - if (!HelpManager::linksForIdentifier(helpId).isEmpty()) + urlMap = HelpManager::linksForIdentifier(helpId); + if (!urlMap.isEmpty()) break; return false; } while (0); + + // Check if the module name contains a major version. + QRegularExpression version("^([^\\d]*)(\\d+)\\.*\\d*$"); + QRegularExpressionMatch m = version.match(moduleName); + if (m.hasMatch()) { + QMap<QString, QUrl> filteredUrlMap; + QStringRef maj = m.capturedRef(2); + for (auto x = urlMap.begin(); x != urlMap.end(); ++x) { + QString urlModuleName = x.value().path().split('/')[1]; + if (urlModuleName.contains(maj)) + filteredUrlMap.insert(x.key(), x.value()); + } + if (!filteredUrlMap.isEmpty()) { + // Use the url as helpId, to disambiguate different versions + helpId = filteredUrlMap.first().toString(); + const HelpItem helpItem(helpId, qName.join(QLatin1Char('.')), HelpItem::QmlComponent, filteredUrlMap); + setLastHelpItemIdentified(helpItem); + return true; + } + } setLastHelpItemIdentified(HelpItem(helpId, qName.join(QLatin1Char('.')), HelpItem::QmlComponent)); return true; } |