forked from qt-creator/qt-creator
QmlJsEditor: help - extend lookup rules for help
This patch prefers QML.moduleName1.2.Type as index for help. The old rule is also supported for backwards compatibility. Change-Id: I484399ac54f6ccb09938ef63e1e5b6845e5e8da5 Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
This commit is contained in:
@@ -52,6 +52,7 @@
|
|||||||
#include <texteditor/tooltip/tooltip.h>
|
#include <texteditor/tooltip/tooltip.h>
|
||||||
#include <texteditor/tooltip/tipcontents.h>
|
#include <texteditor/tooltip/tipcontents.h>
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
|
||||||
using namespace Core;
|
using namespace Core;
|
||||||
@@ -148,7 +149,7 @@ void HoverHandler::identifyMatch(TextEditor::ITextEditor *editor, int pos)
|
|||||||
|
|
||||||
handleOrdinaryMatch(scopeChain, node);
|
handleOrdinaryMatch(scopeChain, node);
|
||||||
|
|
||||||
TextEditor::HelpItem helpItem = qmlHelpItem(scopeChain, node);
|
TextEditor::HelpItem helpItem = qmlHelpItem(scopeChain, qmlDocument, node);
|
||||||
if (!helpItem.helpId().isEmpty())
|
if (!helpItem.helpId().isEmpty())
|
||||||
setLastHelpItemIdentified(helpItem);
|
setLastHelpItemIdentified(helpItem);
|
||||||
}
|
}
|
||||||
@@ -350,16 +351,61 @@ static const ObjectValue *isMember(const ScopeChain &scopeChain,
|
|||||||
return owningObject;
|
return owningObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline QString getModuleName(const ScopeChain &scopeChain, const Document::Ptr &qmlDocument, const ObjectValue *value)
|
||||||
|
{
|
||||||
|
if (!value)
|
||||||
|
return QString();
|
||||||
|
|
||||||
|
const CppComponentValue *qmlValue = value_cast<CppComponentValue>(value);
|
||||||
|
if (qmlValue) {
|
||||||
|
const QString moduleName = qmlValue->moduleName();
|
||||||
|
const Imports *imports = scopeChain.context()->imports(qmlDocument.data());
|
||||||
|
const ImportInfo importInfo = imports->info(qmlValue->className(), scopeChain.context().data());
|
||||||
|
if (importInfo.isValid() && importInfo.type() == ImportInfo::LibraryImport) {
|
||||||
|
const int majorVersion = importInfo.version().majorVersion();
|
||||||
|
const int minorVersion = importInfo.version().minorVersion();
|
||||||
|
return moduleName + QString::number(majorVersion) + QLatin1Char('.') + QString::number(minorVersion) ;
|
||||||
|
}
|
||||||
|
return QString();
|
||||||
|
} else {
|
||||||
|
QString typeName = value->className();
|
||||||
|
|
||||||
|
const Imports *imports = scopeChain.context()->imports(qmlDocument.data());
|
||||||
|
const ImportInfo importInfo = imports->info(typeName, scopeChain.context().data());
|
||||||
|
if (importInfo.isValid() && importInfo.type() == ImportInfo::LibraryImport) {
|
||||||
|
const QString moduleName = importInfo.name();
|
||||||
|
const int majorVersion = importInfo.version().majorVersion();
|
||||||
|
const int minorVersion = importInfo.version().minorVersion();
|
||||||
|
return moduleName + QString::number(majorVersion) + QLatin1Char('.') + QString::number(minorVersion) ;
|
||||||
|
} else if (importInfo.isValid() && importInfo.type() == ImportInfo::DirectoryImport) {
|
||||||
|
const QString path = importInfo.path();
|
||||||
|
const QDir dir(qmlDocument->path());
|
||||||
|
QString relativeDir = dir.relativeFilePath(path);
|
||||||
|
const QString name = relativeDir.replace(QLatin1Char('/'), QLatin1Char('.'));
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
TextEditor::HelpItem HoverHandler::qmlHelpItem(const ScopeChain &scopeChain,
|
TextEditor::HelpItem HoverHandler::qmlHelpItem(const ScopeChain &scopeChain,
|
||||||
|
const Document::Ptr &qmlDocument,
|
||||||
AST::Node *node) const
|
AST::Node *node) const
|
||||||
{
|
{
|
||||||
QString name;
|
QString name;
|
||||||
|
QString moduleName;
|
||||||
if (const ObjectValue *scope = isMember(scopeChain, node, &name)) {
|
if (const ObjectValue *scope = isMember(scopeChain, node, &name)) {
|
||||||
// maybe it's a type?
|
// maybe it's a type?
|
||||||
if (!name.isEmpty() && name.at(0).isUpper()) {
|
if (!name.isEmpty() && name.at(0).isUpper()) {
|
||||||
const QString maybeHelpId(QLatin1String("QML.") + name);
|
AST::UiQualifiedId *qualifiedId = AST::cast<AST::UiQualifiedId *>(node);
|
||||||
if (!Core::HelpManager::instance()->linksForIdentifier(maybeHelpId).isEmpty())
|
const ObjectValue *value = scopeChain.context()->lookupType(qmlDocument.data(), qualifiedId);
|
||||||
return TextEditor::HelpItem(maybeHelpId, name, TextEditor::HelpItem::QmlComponent);
|
moduleName = getModuleName(scopeChain, qmlDocument, value);
|
||||||
|
const QString maybeHelpId1(QLatin1String("QML.") + moduleName + QLatin1Char('.') + name);
|
||||||
|
if (!Core::HelpManager::instance()->linksForIdentifier(maybeHelpId1).isEmpty())
|
||||||
|
return TextEditor::HelpItem(maybeHelpId1, name, TextEditor::HelpItem::QmlComponent);
|
||||||
|
const QString maybeHelpId2(QLatin1String("QML.") + name);
|
||||||
|
if (!Core::HelpManager::instance()->linksForIdentifier(maybeHelpId2).isEmpty())
|
||||||
|
return TextEditor::HelpItem(maybeHelpId2, name, TextEditor::HelpItem::QmlComponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// otherwise, it's probably a property
|
// otherwise, it's probably a property
|
||||||
@@ -371,9 +417,16 @@ TextEditor::HelpItem HoverHandler::qmlHelpItem(const ScopeChain &scopeChain,
|
|||||||
|
|
||||||
const QString className = cur->className();
|
const QString className = cur->className();
|
||||||
if (!className.isEmpty()) {
|
if (!className.isEmpty()) {
|
||||||
const QString maybeHelpId(className + QLatin1String("::") + name);
|
moduleName = getModuleName(scopeChain, qmlDocument, cur);
|
||||||
if (!Core::HelpManager::instance()->linksForIdentifier(maybeHelpId).isEmpty())
|
const QString maybeHelpId1(QLatin1String("QML.") + moduleName + QLatin1Char('.') + className + QLatin1String("::") + name);
|
||||||
return TextEditor::HelpItem(maybeHelpId, name, TextEditor::HelpItem::QmlProperty);
|
if (!Core::HelpManager::instance()->linksForIdentifier(maybeHelpId1).isEmpty())
|
||||||
|
return TextEditor::HelpItem(maybeHelpId1, name, TextEditor::HelpItem::QmlProperty);
|
||||||
|
const QString maybeHelpId2(QLatin1String("QML.") + className + QLatin1String("::") + name);
|
||||||
|
if (!Core::HelpManager::instance()->linksForIdentifier(maybeHelpId2).isEmpty())
|
||||||
|
return TextEditor::HelpItem(maybeHelpId2, name, TextEditor::HelpItem::QmlProperty);
|
||||||
|
const QString maybeHelpId3(className + QLatin1String("::") + name);
|
||||||
|
if (!Core::HelpManager::instance()->linksForIdentifier(maybeHelpId3).isEmpty())
|
||||||
|
return TextEditor::HelpItem(maybeHelpId3, name, TextEditor::HelpItem::QmlProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cur == lastScope)
|
if (cur == lastScope)
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ private:
|
|||||||
const QmlJS::ContextPtr &context);
|
const QmlJS::ContextPtr &context);
|
||||||
|
|
||||||
TextEditor::HelpItem qmlHelpItem(const QmlJS::ScopeChain &lookupContext,
|
TextEditor::HelpItem qmlHelpItem(const QmlJS::ScopeChain &lookupContext,
|
||||||
|
const QmlJS::Document::Ptr &qmlDocument,
|
||||||
QmlJS::AST::Node *node) const;
|
QmlJS::AST::Node *node) const;
|
||||||
|
|
||||||
QmlJS::ModelManagerInterface *m_modelManager;
|
QmlJS::ModelManagerInterface *m_modelManager;
|
||||||
|
|||||||
Reference in New Issue
Block a user