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

Reply via email to