6#include <QtQmlLS/private/qqmllsutils_p.h>
7#include <QtCore/private/qfactoryloader_p.h>
8#include <QtCore/qlibraryinfo.h>
9#include <QtCore/qdiriterator.h>
10#include <QtCore/qdir.h>
11#include <QtQmlCompiler/private/qqmljstyperesolver_p.h>
18using namespace
QQmlJS::Dom;
24 while (dirIterator.hasNext()) {
34 const auto keys = pluginLoader.metaDataKeys();
36 auto instance = qobject_cast<QQmlLSHelpPluginInterface *>(pluginLoader.instance(
i));
39 instance->initialize(
QDir::tempPath() +
"/collectionFile.qhc"_L1,
nullptr);
47 if (m_docRootPath ==
path)
52 if (foundQchFiles.isEmpty()) {
54 <<
"No documentation files found in the Qt doc installation path: " <<
path;
58 return registerDocumentations(foundQchFiles);
66void HelpManager::registerDocumentations(
const QStringList &docs)
const
70 std::for_each(docs.cbegin(), docs.cend(),
71 [
this](
const auto &
file) { m_helpPlugin->registerDocumentation(file); });
74std::optional<QByteArray> HelpManager::extractDocumentation(
const DomItem &
item)
const
76 if (
item.internalKind() == DomType::ScriptIdentifierExpression) {
77 const auto resolvedType =
82 return extractDocumentationForIdentifiers(
item, resolvedType.value());
84 return extractDocumentationForDomElements(
item);
87 Q_UNREACHABLE_RETURN(std::nullopt);
90std::optional<QByteArray>
91HelpManager::extractDocumentationForIdentifiers(
const DomItem &
item,
94 const auto qmlFile =
item.containingFile().as<
QmlFile>();
97 const auto links = collectDocumentationLinks(expr.
semanticScope, qmlFile->typeResolver(),
127 <<
"Documentation extraction for" << expr.
name.value() <<
"was not implemented";
130 Q_UNREACHABLE_RETURN(std::nullopt);
133std::optional<QByteArray> HelpManager::extractDocumentationForDomElements(
const DomItem &
item)
const
135 const auto qmlFile =
item.containingFile().as<
QmlFile>();
139 const auto name =
item.field(Fields::name).value().toString();
140 std::vector<QQmlLSHelpProviderBase::DocumentLink> links;
141 switch (
item.internalKind()) {
142 case DomType::QmlObject: {
143 links = collectDocumentationLinks(
item.nearestSemanticScope(), qmlFile->typeResolver(),
147 case DomType::PropertyDefinition: {
150 links = collectDocumentationLinks(scope, qmlFile->typeResolver(),
name);
153 case DomType::Binding: {
156 links = collectDocumentationLinks(scope, qmlFile->typeResolver(),
name);
159 case DomType::MethodInfo: {
162 links = collectDocumentationLinks(scope, qmlFile->typeResolver(),
name);
167 <<
item.internalKindStr() <<
"was not implemented for documentation extraction";
175std::optional<QByteArray>
177 const std::vector<QQmlLSHelpProviderBase::DocumentLink> &links,
183 for (
auto &&link : links) {
184 const auto fileData = m_helpPlugin->fileData(link.url);
185 if (fileData.isEmpty()) {
186 qCDebug(QQmlLSHelpUtilsLog) <<
"No documentation found for" << link.url;
191 if (documentation.isEmpty())
193 return documentation.toUtf8();
199std::optional<QByteArray>
205 if (m_helpPlugin->registeredNamespaces().empty())
208 std::optional<QByteArray>
result;
213 for (
const auto &
entry : itemLocations) {
230std::vector<QQmlLSHelpProviderBase::DocumentLink>
231HelpManager::collectDocumentationLinks(
237 const auto potentialDocumentationLinks =
239 const std::shared_ptr<QQmlJSTypeResolver> &typeResolver)
240 -> std::vector<QQmlLSHelpProviderBase::DocumentLink> {
241 if (!scope || !typeResolver)
244 std::vector<QQmlLSHelpProviderBase::DocumentLink> links;
245 const auto docLinks = m_helpPlugin->documentsForKeyword(typeResolver->nameForType(scope));
246 std::copy(docLinks.cbegin(), docLinks.cend(), std::back_inserter(links));
251 const auto result = potentialDocumentationLinks(scope, typeResolver);
std::optional< QByteArray > documentationForItem(const QQmlJS::Dom::DomItem &file, QLspSpecification::Position position) const
QString documentationRootPath() const
void setDocumentationRootPath(const QString &path)
The QDirIterator class provides an iterator for directory entrylists.
static QString tempPath()
Returns the absolute canonical path of the system's temporary directory.
QString absoluteFilePath() const
A QmlFile, when loaded in a DomEnvironment that has the DomCreationOption::WithSemanticAnalysis,...
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QQmlJSScope::ConstPtr findDefiningScopeForProperty(const QQmlJSScope::ConstPtr &referrerScope, const QString &nameToCheck)
Finds the scope where a property is first defined.
QQmlJSScope::ConstPtr findDefiningScopeForMethod(const QQmlJSScope::ConstPtr &referrerScope, const QString &nameToCheck)
QQmlJSScope::ConstPtr findDefiningScopeForBinding(const QQmlJSScope::ConstPtr &referrerScope, const QString &nameToCheck)
std::optional< ExpressionType > resolveExpressionType(const QQmlJS::Dom::DomItem &item, ResolveOptions options)
QList< ItemLocation > itemsFromTextLocation(const DomItem &file, int line, int character)
Find the DomItem representing the object situated in file at given line and character/column.
@ EnumeratorValueIdentifier
@ GroupedPropertyIdentifier
@ PropertyChangedHandlerIdentifier
@ PropertyChangedSignalIdentifier
@ SignalHandlerIdentifier
Combined button and popup list for selecting options.
#define qCWarning(category,...)
#define qCDebug(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
GLsizei const GLchar *const * path
#define QQmlLSHelpPluginInterface_iid
static QStringList documentationFiles(const QString &qtInstallationPath)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QQmlJSScope::ConstPtr semanticScope
std::optional< QString > name