Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmllscompletion_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QQMLLSCOMPLETION_H
6#define QQMLLSCOMPLETION_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
20#include "qqmllsutils_p.h"
21#include "qqmllsplugin_p.h"
22
23#include <QtLanguageServer/private/qlanguageserverspectypes_p.h>
24#include <QtQmlDom/private/qqmldomexternalitems_p.h>
25#include <QtQmlDom/private/qqmldomtop_p.h>
26#include <QtCore/private/qduplicatetracker_p.h>
27#include <QtCore/private/qfactoryloader_p.h>
28#include <QtCore/qpluginloader.h>
29#include <QtCore/qxpfunctional.h>
30
31QT_BEGIN_NAMESPACE
32
33Q_DECLARE_LOGGING_CATEGORY(QQmlLSCompletionLog)
34
35
36class QQmlLSCompletion
37{
38 using DomItem = QQmlJS::Dom::DomItem;
39public:
40 enum class ImportCompletionType { None, Module, Version };
41 enum AppendOption { AppendSemicolon, AppendNothing };
42
43 QQmlLSCompletion(const QFactoryLoader &pluginLoader);
44
45 using CompletionItem = QLspSpecification::CompletionItem;
46 using BackInsertIterator = std::back_insert_iterator<QList<CompletionItem>>;
47 QList<CompletionItem> completions(const DomItem &currentItem,
48 const CompletionContextStrings &ctx) const;
49
50 static CompletionItem makeSnippet(QUtf8StringView qualifier, QUtf8StringView label,
51 QUtf8StringView insertText);
52
53 static CompletionItem makeSnippet(QUtf8StringView label, QUtf8StringView insertText);
54
55private:
56 struct QQmlLSCompletionPosition
57 {
58 DomItem itemAtPosition;
59 CompletionContextStrings cursorPosition;
60 qsizetype offset() const { return cursorPosition.offset(); }
61 };
62
63 void collectCompletions(const DomItem &currentItem, const CompletionContextStrings &ctx,
64 BackInsertIterator result) const;
65
66 bool betweenLocations(QQmlJS::SourceLocation left, const QQmlLSCompletionPosition &positionInfo,
67 QQmlJS::SourceLocation right) const;
68 bool afterLocation(QQmlJS::SourceLocation left,
69 const QQmlLSCompletionPosition &positionInfo) const;
70 bool beforeLocation(const QQmlLSCompletionPosition &ctx, QQmlJS::SourceLocation right) const;
71 bool ctxBeforeStatement(const QQmlLSCompletionPosition &positionInfo,
72 const DomItem &parentForContext,
73 QQmlJS::Dom::FileLocationRegion firstRegion) const;
74 bool isCaseOrDefaultBeforeCtx(const DomItem &currentClause,
75 const QQmlLSCompletionPosition &positionInfo,
76 QQmlJS::Dom::FileLocationRegion keywordRegion) const;
77 DomItem previousCaseOfCaseBlock(const DomItem &parentForContext,
78 const QQmlLSCompletionPosition &positionInfo) const;
79
80 void idsCompletions(const DomItem &component, BackInsertIterator it) const;
81
82 void suggestReachableTypes(const DomItem &context,
83 QQmlJS::Dom::LocalSymbolsTypes typeCompletionType,
84 QLspSpecification::CompletionItemKind kind,
85 BackInsertIterator it) const;
86
87 void suggestJSStatementCompletion(const DomItem &currentItem, BackInsertIterator it) const;
88 void suggestCaseAndDefaultStatementCompletion(BackInsertIterator it) const;
89 void suggestVariableDeclarationStatementCompletion(
90 BackInsertIterator it, AppendOption option = AppendSemicolon) const;
91
92 void suggestEnumerationsAndEnumerationValues(const QQmlJSScope::ConstPtr &scope,
93 const QString &enumName,
94 QDuplicateTracker<QString> &usedNames,
95 BackInsertIterator result) const;
96 DomItem ownerOfQualifiedExpression(const DomItem &qualifiedExpression) const;
97 void suggestJSExpressionCompletion(const DomItem &context, BackInsertIterator it) const;
98
99 void suggestBindingCompletion(const DomItem &itemAtPosition, BackInsertIterator it) const;
100
101 void insideImportCompletionHelper(const DomItem &file,
102 const QQmlLSCompletionPosition &positionInfo,
103 BackInsertIterator it) const;
104
105 void jsIdentifierCompletion(const QQmlJSScope::ConstPtr &scope,
106 QDuplicateTracker<QString> *usedNames, BackInsertIterator it) const;
107
108 void methodCompletion(const QQmlJSScope::ConstPtr &scope, QDuplicateTracker<QString> *usedNames,
109 BackInsertIterator it) const;
110 void propertyCompletion(const QQmlJSScope::ConstPtr &scope,
111 QDuplicateTracker<QString> *usedNames, BackInsertIterator it) const;
112 void enumerationCompletion(const QQmlJSScope::ConstPtr &scope,
113 QDuplicateTracker<QString> *usedNames, BackInsertIterator it) const;
114 void enumerationValueCompletionHelper(const QStringList &enumeratorKeys,
115 BackInsertIterator it) const;
116
117 void enumerationValueCompletion(const QQmlJSScope::ConstPtr &scope,
118 const QString &enumeratorName, BackInsertIterator it) const;
119
120 static bool cursorInFrontOfItem(const DomItem &parentForContext,
121 const QQmlLSCompletionPosition &positionInfo);
122 static bool cursorAfterColon(const DomItem &currentItem,
123 const QQmlLSCompletionPosition &positionInfo);
124 void insidePragmaCompletion(QQmlJS::Dom::DomItem currentItem,
125 const QQmlLSCompletionPosition &positionInfo,
126 BackInsertIterator it) const;
127 void insideQmlObjectCompletion(const DomItem &parentForContext,
128 const QQmlLSCompletionPosition &positionInfo,
129 BackInsertIterator it) const;
130 void insidePropertyDefinitionCompletion(const DomItem &currentItem,
131 const QQmlLSCompletionPosition &positionInfo,
132 BackInsertIterator it) const;
133 void insideBindingCompletion(const DomItem &currentItem,
134 const QQmlLSCompletionPosition &positionInfo,
135 BackInsertIterator it) const;
136 void insideImportCompletion(const DomItem &currentItem,
137 const QQmlLSCompletionPosition &positionInfo,
138 BackInsertIterator it) const;
139 void insideQmlFileCompletion(const DomItem &currentItem,
140 const QQmlLSCompletionPosition &positionInfo,
141 BackInsertIterator it) const;
142 void suggestContinueAndBreakStatementIfNeeded(const DomItem &itemAtPosition,
143 BackInsertIterator it) const;
144 void insideScriptLiteralCompletion(const DomItem &currentItem,
145 const QQmlLSCompletionPosition &positionInfo,
146 BackInsertIterator it) const;
147 void insideCallExpression(const DomItem &currentItem,
148 const QQmlLSCompletionPosition &positionInfo,
149 BackInsertIterator it) const;
150 void insideIfStatement(const DomItem &currentItem, const QQmlLSCompletionPosition &positionInfo,
151 BackInsertIterator it) const;
152 void insideReturnStatement(const DomItem &currentItem,
153 const QQmlLSCompletionPosition &positionInfo,
154 BackInsertIterator it) const;
155 void insideWhileStatement(const DomItem &currentItem,
156 const QQmlLSCompletionPosition &positionInfo,
157 BackInsertIterator it) const;
158 void insideDoWhileStatement(const DomItem &parentForContext,
159 const QQmlLSCompletionPosition &positionInfo,
160 BackInsertIterator it) const;
161 void insideForStatementCompletion(const DomItem &parentForContext,
162 const QQmlLSCompletionPosition &positionInfo,
163 BackInsertIterator it) const;
164 void insideForEachStatement(const DomItem &parentForContext,
165 const QQmlLSCompletionPosition &positionInfo,
166 BackInsertIterator it) const;
167 void insideSwitchStatement(const DomItem &parentForContext,
168 const QQmlLSCompletionPosition positionInfo,
169 BackInsertIterator it) const;
170 void insideCaseClause(const DomItem &parentForContext,
171 const QQmlLSCompletionPosition &positionInfo,
172 BackInsertIterator it) const;
173 void insideCaseBlock(const DomItem &parentForContext,
174 const QQmlLSCompletionPosition &positionInfo, BackInsertIterator it) const;
175 void insideDefaultClause(const DomItem &parentForContext,
176 const QQmlLSCompletionPosition &positionInfo,
177 BackInsertIterator it) const;
178 void insideBinaryExpressionCompletion(const DomItem &parentForContext,
179 const QQmlLSCompletionPosition &positionInfo,
180 BackInsertIterator it) const;
181 void insideScriptPattern(const DomItem &parentForContext,
182 const QQmlLSCompletionPosition &positionInfo,
183 BackInsertIterator it) const;
184 void insideVariableDeclarationEntry(const DomItem &parentForContext,
185 const QQmlLSCompletionPosition &positionInfo,
186 BackInsertIterator it) const;
187 void insideThrowStatement(const DomItem &parentForContext,
188 const QQmlLSCompletionPosition &positionInfo,
189 BackInsertIterator it) const;
190 void insideLabelledStatement(const DomItem &parentForContext,
191 const QQmlLSCompletionPosition &positionInfo,
192 BackInsertIterator it) const;
193 void insideContinueStatement(const DomItem &parentForContext,
194 const QQmlLSCompletionPosition &positionInfo,
195 BackInsertIterator it) const;
196 void insideBreakStatement(const DomItem &parentForContext,
197 const QQmlLSCompletionPosition &positionInfo,
198 BackInsertIterator it) const;
199 void insideConditionalExpression(const DomItem &parentForContext,
200 const QQmlLSCompletionPosition &positionInfo,
201 BackInsertIterator it) const;
202 void insideUnaryExpression(const DomItem &parentForContext,
203 const QQmlLSCompletionPosition &positionInfo,
204 BackInsertIterator it) const;
205 void insidePostExpression(const DomItem &parentForContext,
206 const QQmlLSCompletionPosition &positionInfo,
207 BackInsertIterator it) const;
208 void insideParenthesizedExpression(const DomItem &parentForContext,
209 const QQmlLSCompletionPosition &positionInfo,
210 BackInsertIterator it) const;
211 void insideTemplateLiteral(const DomItem &parentForContext,
212 const QQmlLSCompletionPosition &positionInfo,
213 BackInsertIterator it) const;
214 void insideNewExpression(const DomItem &parentForContext,
215 const QQmlLSCompletionPosition &positionInfo,
216 BackInsertIterator it) const;
217 void insideNewMemberExpression(const DomItem &parentForContext,
218 const QQmlLSCompletionPosition &positionInfo,
219 BackInsertIterator it) const;
220 void signalHandlerCompletion(const QQmlJSScope::ConstPtr &scope,
221 QDuplicateTracker<QString> *usedNames,
222 BackInsertIterator it) const;
223
224 void suggestSnippetsForLeftHandSideOfBinding(const DomItem &items,
225 BackInsertIterator result) const;
226
227 void suggestSnippetsForRightHandSideOfBinding(const DomItem &items,
228 BackInsertIterator result) const;
229
230private:
231 using CompletionFromPluginFunction = void(QQmlLSCompletionPlugin *plugin,
232 BackInsertIterator result);
233 void collectFromPlugins(const qxp::function_ref<CompletionFromPluginFunction> f,
234 BackInsertIterator result) const;
235
236 QStringList m_loadPaths;
237
238 std::vector<std::unique_ptr<QQmlLSCompletionPlugin>> m_plugins;
239};
240
242
243#endif // QQMLLSCOMPLETION_H
void collectFromAllJavaScriptParents(const F &&f, const QQmlJSScope::ConstPtr &scope)
static const QQmlJSScope * resolve(const QQmlJSScope *current, const QStringList &names)
static void collectLabels(const DomItem &context, QQmlLSCompletion::BackInsertIterator result)
static bool testScopeSymbol(const QQmlJSScope::ConstPtr &scope, LocalSymbolsTypes options, CompletionItemKind kind)