diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmlls/qqmlgotodefinitionsupport.cpp | 9 | ||||
| -rw-r--r-- | src/qmlls/qqmllsutils.cpp | 29 | ||||
| -rw-r--r-- | src/qmlls/qqmllsutils_p.h | 2 |
3 files changed, 35 insertions, 5 deletions
diff --git a/src/qmlls/qqmlgotodefinitionsupport.cpp b/src/qmlls/qqmlgotodefinitionsupport.cpp index f34af6ceef..36258a87e0 100644 --- a/src/qmlls/qqmlgotodefinitionsupport.cpp +++ b/src/qmlls/qqmlgotodefinitionsupport.cpp @@ -49,7 +49,14 @@ void QmlGoToDefinitionSupport::process(RequestPointerArgument request) auto &front = std::get<QList<QQmlLSUtils::ItemLocation>>(itemsFound).front(); - auto location = QQmlLSUtils::findDefinitionOf(front.domItem); + const QByteArray shortestRootUrl = + m_codeModelManager->shortestRootUrlForFile(request->m_parameters.textDocument.uri); + + const QStringList headerDirectories = shortestRootUrl.isEmpty() + ? QStringList{} + : QStringList{ QUrl::fromEncoded(shortestRootUrl).toLocalFile() }; + + const auto location = QQmlLSUtils::findDefinitionOf(front.domItem, headerDirectories); if (!location) return; diff --git a/src/qmlls/qqmllsutils.cpp b/src/qmlls/qqmllsutils.cpp index b2f2e0f901..21f0cdc6b4 100644 --- a/src/qmlls/qqmllsutils.cpp +++ b/src/qmlls/qqmllsutils.cpp @@ -1948,7 +1948,26 @@ findPropertyDefinitionOf(const DomItem &file, QQmlJS::SourceLocation propertyDef return {}; } -std::optional<Location> findDefinitionOf(const DomItem &item) +static std::optional<Location> fallbackLocationForCppType(const ExpressionType &type, + const QStringList &headerLocations) +{ + // fallback: construct location from the line number in the qmltypes file for C++ defined + // elements: + const QString filePath = + findFilePathFromFileName(headerLocations, type.semanticScope->filePath()); + if (filePath.isEmpty()) + return {}; + + // note: Select the first line of the file if lineNumber is not set. + const quint32 lineNumber = type.semanticScope->lineNumber(); + const QQmlJS::SourceLocation startLocation = lineNumber == 0 + ? QQmlJS::SourceLocation{ 0, 0, 1, 1 } + : type.semanticScope->sourceLocation(); + const TextPosition endPosition{ static_cast<int>(startLocation.startLine) + 1, 1 }; + return Location{ filePath, startLocation, endPosition }; +} + +std::optional<Location> findDefinitionOf(const DomItem &item, const QStringList &headerDirectories) { auto resolvedExpression = resolveExpressionType(item, ResolveOptions::ResolveOwnerType); @@ -2006,8 +2025,12 @@ std::optional<Location> findDefinitionOf(const DomItem &item) } case AttachedTypeIdentifier: case QmlComponentIdentifier: { - return Location::tryFrom(resolvedExpression->semanticScope->filePath(), - resolvedExpression->semanticScope->sourceLocation(), item); + if (const auto result = + Location::tryFrom(resolvedExpression->semanticScope->filePath(), + resolvedExpression->semanticScope->sourceLocation(), item)) { + return result; + } + return fallbackLocationForCppType(*resolvedExpression, headerDirectories); } case QualifiedModuleIdentifier: { const DomItem imports = item.fileObject().field(Fields::imports); diff --git a/src/qmlls/qqmllsutils_p.h b/src/qmlls/qqmllsutils_p.h index 5340c7c829..47b0990709 100644 --- a/src/qmlls/qqmllsutils_p.h +++ b/src/qmlls/qqmllsutils_p.h @@ -263,7 +263,7 @@ QByteArray qmlUrlToLspUri(const QByteArray &url); QLspSpecification::Range qmlLocationToLspLocation(Location qmlLocation); DomItem baseObject(const DomItem &qmlObject); std::optional<Location> findTypeDefinitionOf(const DomItem &item); -std::optional<Location> findDefinitionOf(const DomItem &item); +std::optional<Location> findDefinitionOf(const DomItem &item, const QStringList &headerDirectories); Usages findUsagesOf(const DomItem &item); std::optional<ErrorMessage> |
