Skip to content

Commit a5e6276

Browse files
Merge pull request #125 from NipunaRanasinghe/pr/add-restart
Add language server restart support
2 parents ca5eed7 + 0d34468 commit a5e6276

File tree

4 files changed

+67
-15
lines changed

4 files changed

+67
-15
lines changed

src/main/java/org/wso2/lsp4intellij/IntellijLanguageClient.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.intellij.openapi.editor.EditorFactory;
2424
import com.intellij.openapi.fileEditor.FileDocumentManager;
2525
import com.intellij.openapi.project.Project;
26+
import com.intellij.openapi.project.ProjectManager;
2627
import com.intellij.openapi.util.Disposer;
2728
import com.intellij.openapi.vfs.VirtualFile;
2829
import com.intellij.openapi.vfs.VirtualFileManager;
@@ -38,17 +39,19 @@
3839
import org.wso2.lsp4intellij.extensions.LSPExtensionManager;
3940
import org.wso2.lsp4intellij.requests.Timeout;
4041
import org.wso2.lsp4intellij.requests.Timeouts;
41-
import org.wso2.lsp4intellij.utils.ApplicationUtils;
4242
import org.wso2.lsp4intellij.utils.FileUtils;
4343

4444
import java.util.Collections;
4545
import java.util.HashMap;
4646
import java.util.HashSet;
47+
import java.util.List;
4748
import java.util.Map;
4849
import java.util.Optional;
4950
import java.util.Set;
5051
import java.util.concurrent.ConcurrentHashMap;
5152

53+
import static org.wso2.lsp4intellij.utils.ApplicationUtils.pool;
54+
5255
public class IntellijLanguageClient implements ApplicationComponent {
5356

5457
private static Logger LOG = Logger.getInstance(IntellijLanguageClient.class);
@@ -91,8 +94,10 @@ public static void addServerDefinition(LanguageServerDefinition definition, Proj
9194
if (definition != null) {
9295
if (project != null) {
9396
processDefinition(definition, FileUtils.projectToUri(project));
97+
restart(project);
9498
} else {
9599
processDefinition(definition, "");
100+
restart();
96101
}
97102
LOG.info("Added definition for " + definition);
98103
} else {
@@ -150,7 +155,7 @@ public static void editorOpened(Editor editor) {
150155
}
151156
String projectUri = FileUtils.projectToUri(project);
152157
if (projectUri != null) {
153-
ApplicationUtils.pool(() -> {
158+
pool(() -> {
154159
String ext = file.getExtension();
155160
final String fileName = file.getName();
156161
LOG.info("Opened " + fileName);
@@ -232,7 +237,7 @@ public static void editorClosed(Editor editor) {
232237
return;
233238
}
234239

235-
ApplicationUtils.pool(() -> {
240+
pool(() -> {
236241
LanguageServerWrapper serverWrapper = LanguageServerWrapper.forEditor(editor);
237242
if (serverWrapper != null) {
238243
LOG.info("Disconnecting " + FileUtils.editorToURIString(editor));
@@ -241,6 +246,33 @@ public static void editorClosed(Editor editor) {
241246
});
242247
}
243248

249+
250+
/**
251+
* This can be used to instantly apply a language server definition without restarting the IDE.
252+
*/
253+
public static void restart() {
254+
Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
255+
for (Project project : openProjects) {
256+
restart(project);
257+
}
258+
}
259+
260+
/**
261+
* This can be used to instantly apply a project-specific language server definition without restarting the
262+
* project/IDE.
263+
*
264+
* @param project The project instance which need to be restarted
265+
*/
266+
public static void restart(Project project) {
267+
try {
268+
List<Editor> allOpenedEditors = FileUtils.getAllOpenedEditors(project);
269+
allOpenedEditors.forEach(IntellijLanguageClient::editorClosed);
270+
allOpenedEditors.forEach(IntellijLanguageClient::editorOpened);
271+
} catch (Exception e) {
272+
LOG.warn(String.format("Refreshing project: %s is failed due to: ", project.getName()), e);
273+
}
274+
}
275+
244276
/**
245277
* Returns current timeout values.
246278
*

src/main/java/org/wso2/lsp4intellij/client/languageserver/LSPServerStatusWidget.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ public Consumer<MouseEvent> getClickConsumer() {
124124
actions.add(new ShowConnectedFiles());
125125
}
126126
actions.add(new ShowTimeouts());
127-
if (wrapper.isResettable()) {
128-
actions.add(new Reset());
127+
if (wrapper.isRestartable()) {
128+
actions.add(new Restart());
129129
}
130130

131131
String title = "Server actions";
@@ -185,15 +185,15 @@ public void actionPerformed(AnActionEvent e) {
185185
}
186186
}
187187

188-
class Reset extends AnAction implements DumbAware {
188+
class Restart extends AnAction implements DumbAware {
189189

190-
Reset() {
191-
super("&Reset", "Reset the server so it can be started again.", null);
190+
Restart() {
191+
super("&Restart", "Restarts the language server.", null);
192192
}
193193

194194
@Override
195195
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
196-
wrapper.reset();
196+
wrapper.restart();
197197
}
198198

199199
}

src/main/java/org/wso2/lsp4intellij/client/languageserver/wrapper/LanguageServerWrapper.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public ServerCapabilities getServerCapabilities() {
219219
}
220220
} catch (TimeoutException e) {
221221
notifyFailure(INIT);
222-
String msg = String.format("%s \n not initialized after %ds \n Check settings",
222+
String msg = String.format("%s \n is not initialized after %d seconds",
223223
serverDefinition.toString(), getTimeout(INIT) / 1000);
224224
LOG.warn(msg, e);
225225
invokeLater(() -> {
@@ -673,20 +673,21 @@ private void connect(String uri) {
673673
}
674674

675675
/**
676-
* Is the langauge server in a state where it can be resettable. Normally language server is
677-
* resettable if it has timedout or has a startup error.
676+
* Is the language server in a state where it can be restartable. Normally language server is
677+
* restartable if it has timeout or has a startup error.
678678
*/
679-
public boolean isResettable() {
679+
public boolean isRestartable() {
680680
return status == STOPPED && (alreadyShownTimeout || alreadyShownCrash);
681681
}
682682

683683
/**
684684
* Reset language server wrapper state so it can be started again if it was failed earlier.
685685
*/
686-
public void reset() {
687-
if (isResettable()) {
686+
public void restart() {
687+
if (isRestartable()) {
688688
alreadyShownCrash = false;
689689
alreadyShownTimeout = false;
690+
IntellijLanguageClient.restart(project);
690691
}
691692
}
692693
}

src/main/java/org/wso2/lsp4intellij/utils/FileUtils.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
import java.net.URI;
4343
import java.net.URISyntaxException;
4444
import java.net.URL;
45+
import java.util.ArrayList;
4546
import java.util.Arrays;
47+
import java.util.List;
4648
import java.util.Set;
4749
import java.util.stream.Collectors;
4850

@@ -65,6 +67,23 @@ public static String extFromPsiFile(PsiFile psiFile) {
6567
return psiFile.getVirtualFile().getExtension();
6668
}
6769

70+
public static List<Editor> getAllOpenedEditors(Project project) {
71+
return computableReadAction(() -> {
72+
List<Editor> editors = new ArrayList<>();
73+
FileEditor[] allEditors = FileEditorManager.getInstance(project).getAllEditors();
74+
for (FileEditor fEditor : allEditors) {
75+
if (fEditor instanceof TextEditor) {
76+
Editor editor = ((TextEditor) fEditor).getEditor();
77+
if (editor.isDisposed() || !isEditorSupported(editor)) {
78+
continue;
79+
}
80+
editors.add(editor);
81+
}
82+
}
83+
return editors;
84+
});
85+
}
86+
6887
public static Editor editorFromPsiFile(PsiFile psiFile) {
6988
return editorFromVirtualFile(psiFile.getVirtualFile(), psiFile.getProject());
7089
}

0 commit comments

Comments
 (0)