Skip to content

Commit 9585dc4

Browse files
committed
fix(preferences): JS/TS settings now apply without restart
Previously only workspace-wide servers were notified (forProject(null)). Now also notify per-project and per-document servers (open projects/editors). Ensures TypeScript/JavaScript formatter and related options take effect immediately.
1 parent 50e56e6 commit 9585dc4

File tree

1 file changed

+60
-4
lines changed

1 file changed

+60
-4
lines changed

org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/ui/preferences/ProcessStreamConnectionProviderWithPreference.java

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* SPDX-License-Identifier: EPL-2.0
99
*
1010
* Contributors:
11-
* Angelo ZERR (Red Hat Inc.) - initial implementation
11+
* Angelo ZERR (Red Hat Inc.) - initial implementation
1212
*******************************************************************************/
1313
package org.eclipse.wildwebdeveloper.ui.preferences;
1414

@@ -18,24 +18,35 @@
1818
import java.util.HashMap;
1919
import java.util.Map;
2020
import java.util.Objects;
21+
import java.util.Set;
2122
import java.util.concurrent.CompletableFuture;
23+
import java.util.concurrent.ConcurrentHashMap;
2224

25+
import org.eclipse.core.resources.ResourcesPlugin;
2326
import org.eclipse.jface.preference.IPreferenceStore;
27+
import org.eclipse.jface.text.IDocument;
2428
import org.eclipse.jface.util.IPropertyChangeListener;
2529
import org.eclipse.jface.util.PropertyChangeEvent;
30+
import org.eclipse.lsp4e.LSPEclipseUtils;
2631
import org.eclipse.lsp4e.LanguageServers;
2732
import org.eclipse.lsp4e.LanguageServersRegistry;
2833
import org.eclipse.lsp4e.LanguageServersRegistry.LanguageServerDefinition;
2934
import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider;
3035
import org.eclipse.lsp4j.DidChangeConfigurationParams;
36+
import org.eclipse.lsp4j.services.LanguageServer;
3137
import org.eclipse.lsp4j.services.WorkspaceService;
38+
import org.eclipse.ui.IEditorPart;
39+
import org.eclipse.ui.IEditorReference;
40+
import org.eclipse.ui.IWorkbenchPage;
41+
import org.eclipse.ui.IWorkbenchWindow;
42+
import org.eclipse.ui.PlatformUI;
3243

3344
/**
3445
* This class extends {@link ProcessStreamConnectionProvider} to manage
3546
* {@link IPreferenceStore} and call
3647
* {@link WorkspaceService#didChangeConfiguration(DidChangeConfigurationParams)}
3748
* when the preference store changes.
38-
*
49+
*
3950
*/
4051
public abstract class ProcessStreamConnectionProviderWithPreference extends ProcessStreamConnectionProvider
4152
implements IPropertyChangeListener {
@@ -162,9 +173,54 @@ public void propertyChange(PropertyChangeEvent event) {
162173
@SuppressWarnings("rawtypes")
163174
DidChangeConfigurationParams params = new DidChangeConfigurationParams(createSettings());
164175

176+
final Set<LanguageServer> notifiedServers = ConcurrentHashMap.newKeySet();
177+
165178
LanguageServers.forProject(null).withPreferredServer(languageServerDefinition).excludeInactive()
166-
.collectAll((w, ls) -> CompletableFuture.completedFuture(ls)).thenAccept(
167-
lss -> lss.stream().forEach(ls -> ls.getWorkspaceService().didChangeConfiguration(params)));
179+
.collectAll((wrapper, server) -> {
180+
if (languageServerDefinition.equals(wrapper.serverDefinition) && notifiedServers.add(server)) {
181+
server.getWorkspaceService().didChangeConfiguration(params);
182+
}
183+
return CompletableFuture.completedFuture(null);
184+
});
185+
186+
// also explicitly check project-scoped LS because `LanguageServers.forProject(null)` does not return LanguageServers
187+
// that do not support supportsWorkspaceFolderCapability like JSTSLanguageServer. These LS do not pass the
188+
// `LanguageServerWrapper.canOperate(IProject)` test with null project argument as used by `LanguageServers.forProject(null)`
189+
for (final var project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
190+
if (!project.isOpen())
191+
continue;
192+
193+
LanguageServers.forProject(project).withPreferredServer(languageServerDefinition).excludeInactive()
194+
.collectAll((wrapper, server) -> {
195+
if (languageServerDefinition.equals(wrapper.serverDefinition) && notifiedServers.add(server)) {
196+
server.getWorkspaceService().didChangeConfiguration(params);
197+
}
198+
return CompletableFuture.completedFuture(null);
199+
});
200+
}
201+
202+
// check per-doc LS
203+
for (final IWorkbenchWindow win : PlatformUI.getWorkbench().getWorkbenchWindows()) {
204+
for (IWorkbenchPage page : win.getPages()) {
205+
for (IEditorReference ref : page.getEditorReferences()) {
206+
IEditorPart editor = ref.getEditor(false); // do not restore unopened editors
207+
if (editor == null)
208+
continue;
209+
210+
IDocument doc = LSPEclipseUtils.getDocument(editor.getEditorInput());
211+
if (doc == null)
212+
continue;
213+
214+
LanguageServers.forDocument(doc).withPreferredServer(languageServerDefinition)
215+
.collectAll((wrapper, server) -> {
216+
if (languageServerDefinition.equals(wrapper.serverDefinition) && notifiedServers.add(server)) {
217+
server.getWorkspaceService().didChangeConfiguration(params);
218+
}
219+
return CompletableFuture.completedFuture(null);
220+
});
221+
}
222+
}
223+
}
168224
}
169225
}
170226

0 commit comments

Comments
 (0)