aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/qmlls/qqmlgotodefinitionsupport.cpp9
-rw-r--r--src/qmlls/qqmllsutils.cpp29
-rw-r--r--src/qmlls/qqmllsutils_p.h2
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>