4#ifndef QQMLBASEMODULE_P_H
5#define QQMLBASEMODULE_P_H
21#include <QtQmlDom/private/qqmldom_utils_p.h>
25#include <unordered_map>
27template<
typename ParametersT,
typename ResponseT>
53template<
typename Result,
typename ResponseCallback>
69 template<
typename... T>
72 static_assert(std::disjunction_v<std::is_same<T, QQmlLSUtilsErrorMessage>...>,
73 "ResponseScopeGuard::setErrorFrom was passed a variant that never contains"
74 " an error message.");
75 if (
auto x = std::get_if<QQmlLSUtilsErrorMessage>(&
variant)) {
106 error.message.toUtf8());
112template<
typename RequestType>
119 using BaseT = QQmlBaseModule<RequestType>;
136 std::unordered_multimap<QString, RequestPointer>
m_pending;
140template<
typename Parameters,
typename Response>
146 m_response = std::move(response);
149 qDebug() <<
"Cannot find document in qmlls's codemodel, did you open it before accessing "
161template<
typename RequestType>
163 : m_codeModel(codeModel)
169template<
typename RequestType>
176template<
typename RequestType>
181 requestHandler(parameters, std::move(response));
186template<
typename RequestType>
190 auto req = std::make_unique<RequestType>();
194 if (!req->fillFrom(doc, parameters, std::move(response))) {
195 req->m_response.sendErrorResponse(0,
"Received invalid request", parameters);
198 const int minVersion = req->m_minVersion;
201 m_pending.insert({
QString::fromUtf8(req->m_parameters.textDocument.uri), std::move(req) });
208template<
typename RequestType>
212 std::vector<RequestPointer> toCompl;
218 toCompl.push_back(std::move(
value));
225 for (
auto it = toCompl.rbegin(),
end = toCompl.rend();
it !=
end; ++
it) {
226 process(std::move(*
it));
230template<
typename RequestType>
240 u
"Cannot proceed: current QML document is invalid! Fix"
241 u
" all the errors in your QML code and try again."_s };
247 envPtr->clearReferenceCache();
256 request->m_parameters.position.character);
258 if (itemsFound.isEmpty()) {
261 u
"Could not find any items at given text location."_s,
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Represents a consistent set of types organized in modules, it is the top level of the DOM.
DomItem fileObject(GoTo option=GoTo::Strict) const
static QList< QQmlLSUtilsItemLocation > itemsFromTextLocation(const DomItem &file, int line, int character)
Find the DomItem representing the object situated in file at given line and character/column.
static QByteArray lspUriToQmlUrl(const QByteArray &uri)
iterator erase(const_iterator i)
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
std::optional< int > docVersion
std::optional< int > validDocVersion
QQmlJS::Dom::DomItem validDoc
std::shared_ptr< Utils::TextDocument > textDocument
OpenDocumentSnapshot snapshot
void updatedSnapshot(const QByteArray &url)
QSet< QString >::iterator it
DBusConnection const char DBusError * error
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint GLint GLint GLint GLint x
[0]
QUrl url("example.com")
[constructor-url-reference]
QNetworkRequest request(url)
bool fillFrom(QmlLsp::OpenDocument doc, const Parameters ¶ms, Response &&response)
QQmlBaseModule< RequestType > BaseT
decltype(auto) getRequestHandler()
QQmlBaseModule(QmlLsp::QQmlCodeModel *codeModel)
std::variant< QList< QQmlLSUtilsItemLocation >, QQmlLSUtilsErrorMessage > itemsForRequest(const RequestPointer &request)
QmlLsp::QQmlCodeModel * m_codeModel
void updatedSnapshot(const QByteArray &uri)
void requestHandler(const RequestParameters ¶meters, RequestResponse &&response)
RequestPointer && RequestPointerArgument
typename RequestType::Response RequestResponse
virtual void process(RequestPointerArgument toBeProcessed)=0
std::unique_ptr< RequestType > RequestPointer
typename RequestType::Parameters RequestParameters
std::unordered_multimap< QString, RequestPointer > m_pending
This class sends a result or an error when going out of scope.
bool setErrorFrom(const std::optional< QQmlLSUtilsErrorMessage > &error)
ResponseCallback & m_callback
void setError(const QQmlLSUtilsErrorMessage &error)
std::variant< Result *, QQmlLSUtilsErrorMessage > m_response
bool setErrorFrom(const std::variant< T... > &variant)