Skip to content

Commit 54d501d

Browse files
committed
Open projects that correspond to workspace folders. Prevents "do you want to open project ?" questions.
1 parent 69fbded commit 54d501d

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
import org.eclipse.lsp4j.WorkDoneProgressCancelParams;
7474
import org.eclipse.lsp4j.WorkDoneProgressParams;
7575
import org.eclipse.lsp4j.WorkspaceFolder;
76+
import org.eclipse.lsp4j.WorkspaceFoldersOptions;
77+
import org.eclipse.lsp4j.WorkspaceServerCapabilities;
7678
import org.eclipse.lsp4j.jsonrpc.Endpoint;
7779
import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
7880
import org.eclipse.lsp4j.jsonrpc.Launcher;
@@ -120,7 +122,6 @@
120122
import org.netbeans.spi.project.ActionProvider;
121123
import org.openide.filesystems.FileObject;
122124
import org.openide.filesystems.FileUtil;
123-
import org.openide.util.Exceptions;
124125
import org.openide.util.Lookup;
125126
import org.openide.util.NbBundle;
126127
import org.openide.util.NbPreferences;
@@ -642,6 +643,7 @@ public void finished(boolean success) {
642643
projectSet.retainAll(openedProjects);
643644
projectSet.addAll(projects);
644645

646+
Project[] prjsRequested = projects.toArray(new Project[projects.size()]);
645647
Project[] prjs = projects.toArray(new Project[projects.size()]);
646648
LOG.log(Level.FINER, "{0}: Finished opening projects: {1}", new Object[]{id, Arrays.asList(projects)});
647649
synchronized (this) {
@@ -661,7 +663,7 @@ public void finished(boolean success) {
661663
openingFileOwners.put(p, f.thenApply(unused -> p));
662664
}
663665
}
664-
f.complete(prjs);
666+
f.complete(prjsRequested);
665667
}).exceptionally(e -> {
666668
f.completeExceptionally(e);
667669
return null;
@@ -736,7 +738,7 @@ private InitializeResult constructInitResponse(InitializeParams init, JavaSource
736738
capabilities.setDocumentFormattingProvider(true);
737739
capabilities.setDocumentRangeFormattingProvider(true);
738740
capabilities.setReferencesProvider(true);
739-
741+
740742
CallHierarchyRegistrationOptions chOpts = new CallHierarchyRegistrationOptions();
741743
chOpts.setWorkDoneProgress(true);
742744
capabilities.setCallHierarchyProvider(chOpts);
@@ -773,6 +775,14 @@ private InitializeResult constructInitResponse(InitializeParams init, JavaSource
773775
FoldingRangeProviderOptions foldingOptions = new FoldingRangeProviderOptions();
774776
capabilities.setFoldingRangeProvider(foldingOptions);
775777
textDocumentService.init(init.getCapabilities(), capabilities);
778+
779+
// register for workspace changess
780+
WorkspaceServerCapabilities wcaps = new WorkspaceServerCapabilities();
781+
WorkspaceFoldersOptions wfopts = new WorkspaceFoldersOptions();
782+
wfopts.setSupported(true);
783+
wfopts.setChangeNotifications(true);
784+
wcaps.setWorkspaceFolders(wfopts);
785+
capabilities.setWorkspace(wcaps);
776786
}
777787
return new InitializeResult(capabilities);
778788
}

java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import java.util.Locale;
5151
import java.util.Map;
5252
import java.util.Map.Entry;
53-
import java.util.Objects;
5453
import java.util.Optional;
5554
import java.util.Set;
5655
import java.util.concurrent.CompletableFuture;
@@ -71,12 +70,14 @@
7170
import org.eclipse.lsp4j.CompletionItem;
7271
import org.eclipse.lsp4j.DidChangeConfigurationParams;
7372
import org.eclipse.lsp4j.DidChangeWatchedFilesParams;
73+
import org.eclipse.lsp4j.DidChangeWorkspaceFoldersParams;
7474
import org.eclipse.lsp4j.ExecuteCommandParams;
7575
import org.eclipse.lsp4j.Location;
7676
import org.eclipse.lsp4j.Position;
7777
import org.eclipse.lsp4j.Range;
7878
import org.eclipse.lsp4j.ShowDocumentParams;
7979
import org.eclipse.lsp4j.SymbolInformation;
80+
import org.eclipse.lsp4j.WorkspaceFolder;
8081
import org.eclipse.lsp4j.WorkspaceSymbol;
8182
import org.eclipse.lsp4j.WorkspaceSymbolLocation;
8283
import org.eclipse.lsp4j.WorkspaceSymbolParams;
@@ -129,10 +130,12 @@
129130
import org.netbeans.spi.project.ui.ProjectProblemsProvider;
130131
import org.openide.DialogDisplayer;
131132
import org.openide.NotifyDescriptor;
133+
import org.openide.awt.StatusDisplayer;
132134
import org.openide.filesystems.FileObject;
133135
import org.openide.filesystems.URLMapper;
134136
import org.openide.util.Exceptions;
135137
import org.openide.util.Lookup;
138+
import org.openide.util.NbBundle;
136139
import org.openide.util.NbPreferences;
137140
import org.openide.util.Pair;
138141
import org.openide.util.RequestProcessor;
@@ -1170,6 +1173,54 @@ void updateJavaImportPreferences(FileObject fo, JsonObject configuration) {
11701173
}
11711174
}
11721175

1176+
@NbBundle.Messages({
1177+
"# {0} - project name",
1178+
"MSG_ProjectFolderInitializationComplete=Completed initialization of project {0}",
1179+
"# {0} - some project name",
1180+
"# {1} - number of other projects loaded",
1181+
"MSG_ProjectFolderInitializationComplete2=Completed initialization of {0} and {1} other projectss"
1182+
})
1183+
@Override
1184+
public void didChangeWorkspaceFolders(DidChangeWorkspaceFoldersParams params) {
1185+
List<FileObject> refreshProjectFolders = new ArrayList<>();
1186+
for (WorkspaceFolder wkspFolder : params.getEvent().getAdded()) {
1187+
String uri = wkspFolder.getUri();
1188+
try {
1189+
FileObject f = Utils.fromUri(uri);
1190+
if (f != null) {
1191+
refreshProjectFolders.add(f);
1192+
}
1193+
} catch (MalformedURLException ex) {
1194+
// expected, perhaps some client-specific URL scheme ?
1195+
LOG.fine("Workspace folder URI could not be converted into fileobject: {0}");
1196+
}
1197+
}
1198+
if (!refreshProjectFolders.isEmpty()) {
1199+
server.asyncOpenSelectedProjects(refreshProjectFolders, true).thenAccept((projects) -> {
1200+
// report initialization of a project / projects
1201+
String msg;
1202+
if (projects.length == 0) {
1203+
// this should happen immediately
1204+
return;
1205+
}
1206+
ProjectInformation pi = ProjectUtils.getInformation(projects[0]);
1207+
String n = pi.getDisplayName();
1208+
if (n == null) {
1209+
n = pi.getName();
1210+
}
1211+
if (n == null) {
1212+
n = projects[0].getProjectDirectory().getName();
1213+
}
1214+
if (projects.length == 1) {
1215+
msg = Bundle.MSG_ProjectFolderInitializationComplete(n);
1216+
} else {
1217+
msg = Bundle.MSG_ProjectFolderInitializationComplete2(n, projects.length);
1218+
}
1219+
StatusDisplayer.getDefault().setStatusText(msg, StatusDisplayer.IMPORTANCE_ANNOTATION);
1220+
});
1221+
}
1222+
}
1223+
11731224
@Override
11741225
public void didChangeWatchedFiles(DidChangeWatchedFilesParams arg0) {
11751226
//TODO: not watching files for now

0 commit comments

Comments
 (0)