This is an automated email from the ASF dual-hosted git repository.
dbalek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 8746414d30 LSP: Scan for projects on server init.
new b9341742b4 Merge pull request #6370 from
dbalek/dbalek/lsp-scan-for-projects
8746414d30 is described below
commit 8746414d3021f8ee0ba7411f91a37af34dd634da
Author: Dusan Balek <[email protected]>
AuthorDate: Wed Aug 23 13:18:18 2023 +0200
LSP: Scan for projects on server init.
---
.../modules/java/lsp/server/protocol/Server.java | 59 ++++++++++++++++++++--
.../server/protocol/TextDocumentServiceImpl.java | 2 +-
2 files changed, 56 insertions(+), 5 deletions(-)
diff --git
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
index f0d6b26c72..ba01d4f530 100644
---
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
+++
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
@@ -49,6 +49,7 @@ import java.util.prefs.Preferences;
import java.util.LinkedHashSet;
import java.util.WeakHashMap;
import java.util.concurrent.CompletionException;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.lsp4j.CallHierarchyRegistrationOptions;
import org.eclipse.lsp4j.CodeActionKind;
import org.eclipse.lsp4j.CodeActionOptions;
@@ -104,6 +105,7 @@ import org.netbeans.api.editor.mimelookup.MimeRegistration;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.source.ClasspathInfo;
import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectInformation;
@@ -670,6 +672,14 @@ public final class Server {
// Wait for all priming builds, even those already pending, to
finish:
CompletableFuture.allOf(primingBuilds.toArray(new
CompletableFuture[primingBuilds.size()])).thenRun(() -> {
+ Set<Project> additionalProjects = new LinkedHashSet<>();
+ for (Project prj : projects) {
+ Set<Project> containedProjects =
ProjectUtils.getContainedProjects(prj, true);
+ if (containedProjects != null) {
+ additionalProjects.addAll(containedProjects);
+ }
+ }
+ projects.addAll(additionalProjects);
OpenProjects.getDefault().open(projects.toArray(new
Project[0]), false);
try {
LOG.log(Level.FINER, "{0}: Calling openProjects() for :
{1}", new Object[]{id, Arrays.asList(projects)});
@@ -857,7 +867,6 @@ public final class Server {
}
} else {
String root = init.getRootUri();
-
if (root != null) {
try {
projectCandidates.add(Utils.fromUri(root));
@@ -869,11 +878,37 @@ public final class Server {
}
}
CompletableFuture<Project[]> prjs = workspaceProjects;
- SERVER_INIT_RP.post(() -> asyncOpenSelectedProjects0(prjs,
projectCandidates, true, true));
+ SERVER_INIT_RP.post(() -> {
+ List<FileObject> additionalCandidates = new ArrayList<>();
+ AtomicBoolean cancel = new AtomicBoolean();
+ ProgressHandle h = ProgressHandle.createHandle("Collecting
workspace projects...", () -> {
+ cancel.set(true);
+ return true;
+ });
+ h.start();
+ try {
+ for (FileObject candidate : projectCandidates) {
+ if (cancel.get()) {
+ break;
+ }
+ Project prj = FileOwnerQuery.getOwner(candidate);
+ if (prj == null) {
+ collectProjectCandidates(candidate,
additionalCandidates, cancel);
+ }
+ }
+ } catch (IOException ex) {
+ LOG.log(Level.FINE, null, ex);
+ } finally {
+ h.finish();
+ }
+ if (!cancel.get()) {
+ projectCandidates.addAll(additionalCandidates);
+ }
+ asyncOpenSelectedProjects0(prjs, projectCandidates, true,
true);
+ });
// chain showIndexingComplete message after initial project open.
- prjs.
- thenApply(this::showIndexingCompleted);
+ prjs.thenApply(this::showIndexingCompleted);
initializeOptions();
@@ -885,6 +920,22 @@ public final class Server {
);
}
+ private void collectProjectCandidates(FileObject fo, List<FileObject>
candidates, AtomicBoolean cancel) throws IOException {
+ for (FileObject chld : fo.getChildren()) {
+ if (cancel.get()) {
+ return;
+ }
+ if (chld.isFolder() && !chld.isSymbolicLink()) {
+ Project prj = FileOwnerQuery.getOwner(chld);
+ if (prj != null) {
+ candidates.add(chld);
+ } else {
+ collectProjectCandidates(chld, candidates, cancel);
+ }
+ }
+ }
+ }
+
private void initializeOptions() {
getWorkspaceProjects().thenAccept(projects -> {
if (projects != null && projects.length > 0) {
diff --git
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
index bbc0de64b0..75bd96a18e 100644
---
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
+++
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
@@ -1987,7 +1987,7 @@ public class TextDocumentServiceImpl implements
TextDocumentService, LanguageCli
return file;
}
missingFileDiscovered(uri);
- } catch (MalformedURLException ex) {
+ } catch (MalformedURLException | IllegalArgumentException ex) {
if (!uri.startsWith("untitled:") && !uri.startsWith("jdt:")) {
LOG.log(Level.WARNING, "Invalid file URL: " + uri, ex);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists