21 QObject::connect(server->notifySignals(),
22 &QLspNotifySignals::receivedDidChangeWorkspaceFoldersNotification,
this,
23 [
this](
const DidChangeWorkspaceFoldersParams ¶ms) {
24 const WorkspaceFoldersChangeEvent &event = params.event;
26 const QList<WorkspaceFolder> &removed = event.removed;
27 QList<QByteArray> toRemove;
28 for (
const WorkspaceFolder &folder : removed) {
29 toRemove.append(QQmlLSUtils::lspUriToQmlUrl(folder.uri));
30 m_codeModelManager->removeDirectory(
31 QQmlLSUtils::lspUriToQmlUrl(folder.uri));
33 m_codeModelManager->removeRootUrls(toRemove);
34 const QList<WorkspaceFolder> &added = event.added;
35 QList<QByteArray> toAdd;
36 for (
const WorkspaceFolder &folder : added) {
37 toAdd.append(QQmlLSUtils::lspUriToQmlUrl(folder.uri));
39 m_codeModelManager->addRootUrls(toAdd);
42 QObject::connect(server, &QLanguageServer::clientInitialized,
this,
43 &WorkspaceHandlers::clientInitialized);
52 QLspSpecification::InitializeResult &serverInfo)
54 if (!clientInfo.capabilities.workspace
55 || !clientInfo.capabilities.workspace->value(u"workspaceFolders"_s).toBool(
false))
57 WorkspaceFoldersServerCapabilities folders;
58 folders.supported =
true;
59 folders.changeNotifications =
true;
60 if (!serverInfo.capabilities.workspace)
61 serverInfo.capabilities.workspace = QJsonObject();
62 serverInfo.capabilities.workspace->insert(u"workspaceFolders"_s,
63 QTypedJson::toJsonValue(folders));
65 openInitialWorkspace(clientInfo);
105 QLanguageServerProtocol *protocol = server->protocol();
106 const auto clientInfo = server->clientInfo();
107 QList<Registration> registrations;
108 if (clientInfo.capabilities.workspace
109 && clientInfo.capabilities.workspace
110 ->value(u"didChangeWatchedFiles"_s)[u"dynamicRegistration"_s]
113 int(WatchKind::Create) |
int(WatchKind::Change) |
int(WatchKind::Delete);
114 DidChangeWatchedFilesRegistrationOptions watchedFilesParams;
115 FileSystemWatcher qmlWatcher;
116 qmlWatcher.globPattern = QByteArray(
"*.{qml,js,mjs}");
117 qmlWatcher.kind = watchAll;
118 FileSystemWatcher qmldirWatcher;
119 qmldirWatcher.globPattern =
"qmldir";
120 qmldirWatcher.kind = watchAll;
121 FileSystemWatcher qmltypesWatcher;
122 qmltypesWatcher.globPattern = QByteArray(
"*.qmltypes");
123 qmltypesWatcher.kind = watchAll;
124 watchedFilesParams.watchers = QList<FileSystemWatcher>({
125 std::move(qmlWatcher),
126 std::move(qmldirWatcher),
127 std::move(qmltypesWatcher)
129 registrations.append(Registration {
131 ClientCapabilitiesInfo::WorkspaceDidChangeWatchedFiles,
132 ClientCapabilitiesInfo::WorkspaceDidChangeWatchedFiles,
133 QTypedJson::toJsonValue(watchedFilesParams) });
136 if (!registrations.isEmpty()) {
137 RegistrationParams params;
138 params.registrations = registrations;
139 protocol->requestRegistration(
144 [protocol](
const ResponseError &err) {
145 LogMessageParams msg;
146 msg.message = QByteArray(
"Registration of file updates failed, will miss file "
147 "changes from outside the editor.");
148 msg.message.append(QString::number(err.code).toUtf8());
149 if (!err.message.isEmpty())
150 msg.message.append(
" ");
151 msg.message.append(err.message);
152 msg.type = MessageType::Warning;
153 qCWarning(lspServerLog) << QString::fromUtf8(msg.message);
154 protocol->notifyLogMessage(msg);