summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Benelli <marco.benelli@qt.io>2016-12-02 12:31:37 +0100
committerMarco Benelli <marco.benelli@qt.io>2016-12-07 10:50:07 +0000
commitf78dd2be6402bc075cda592f36bedd2b8f7c39df (patch)
treed278590215c33e669996fbc7932ccb514fae717e
parent2497f5ea1dd0bc1e1bc37164f2e4c49401485d69 (diff)
downloadqt-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.cpp38
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;
}