This is an automated email from the ASF dual-hosted git repository.

entl 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 8b9e822  Be able to resolve project problems in VSCode extension. 
(#3400)
8b9e822 is described below

commit 8b9e822e3aee7ea3d8c47cc0f271d80f86eaad65
Author: Martin Entlicher <[email protected]>
AuthorDate: Tue Jan 4 22:09:38 2022 +0100

    Be able to resolve project problems in VSCode extension. (#3400)
---
 .../org/netbeans/modules/gradle/GradleProject.java | 10 ++--
 .../gradle/GradleProjectProblemProvider.java       | 17 ++++--
 .../hints/infrastructure/JavaErrorProvider.java    | 11 +++-
 .../modules/java/lsp/server/protocol/Server.java   |  5 ++
 .../server/protocol/TextDocumentServiceImpl.java   |  2 +-
 .../lsp/server/protocol/WorkspaceServiceImpl.java  | 62 ++++++++++++++++++++++
 java/java.lsp.server/vscode/package.json           | 18 +++----
 7 files changed, 105 insertions(+), 20 deletions(-)

diff --git a/extide/gradle/src/org/netbeans/modules/gradle/GradleProject.java 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleProject.java
index b0c4276..ed731a0 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/GradleProject.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/GradleProject.java
@@ -101,11 +101,15 @@ public final class GradleProject implements Serializable, 
Lookup.Provider {
     }
 
     public final GradleProject invalidate(String... reasons) {
+        Set<String> problems = reasons.length > 0 ? new 
LinkedHashSet<>(Arrays.asList(reasons)) : Collections.emptySet();
         if (getQuality().worseThan(Quality.EVALUATED)) {
-            return this;
+            if (!problems.isEmpty()) {
+                return new GradleProject(getQuality(), problems, this);
+            } else {
+                return this;
+            }
         } else {
-            Set<String> p = new LinkedHashSet<>(Arrays.asList(reasons));
-            return new GradleProject(Quality.EVALUATED, p, this);
+            return new GradleProject(Quality.EVALUATED, problems, this);
         }
     }
 
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
index b6b7b24..2b53729 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
@@ -26,6 +26,7 @@ import java.beans.PropertyChangeSupport;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Future;
 import org.netbeans.api.project.Project;
 import org.netbeans.spi.project.ProjectServiceProvider;
@@ -81,10 +82,11 @@ public class GradleProjectProblemProvider implements 
ProjectProblemsProvider {
         GradleProject gp = 
project.getLookup().lookup(NbGradleProjectImpl.class).getGradleProject();
         if (gp.getQuality().notBetterThan(EVALUATED)) {
             ret.add(ProjectProblem.createError(Bundle.LBL_PrimingRequired(), 
Bundle.TXT_PrimingRequired(), resolver));
-        }
-        for (String problem : gp.getProblems()) {
-            String[] lines = problem.split("\\n"); //NOI18N
-            ret.add(ProjectProblem.createWarning(lines[0], 
problem.replaceAll("\\n", "<br/>"), resolver)); //NOI18N
+        } else {
+            for (String problem : gp.getProblems()) {
+                String[] lines = problem.split("\\n"); //NOI18N
+                ret.add(ProjectProblem.createWarning(lines[0], 
problem.replaceAll("\\n", "<br/>"), resolver)); //NOI18N
+            }
         }
         return ret;
     }
@@ -98,7 +100,12 @@ public class GradleProjectProblemProvider implements 
ProjectProblemsProvider {
                 Quality q = gradleProject.getQuality();
                 Status st = q.worseThan(SIMPLE) ? Status.UNRESOLVED
                         : q.worseThan(FULL) ? Status.RESOLVED_WITH_WARNING : 
Status.RESOLVED;
-                return Result.create(st);
+                Set<String> problems = gradleProject.getProblems();
+                if (problems.isEmpty()) {
+                    return Result.create(st);
+                } else {
+                    return Result.create(st, problems.iterator().next());
+                }
             });
        }
     }
diff --git 
a/java/java.hints/src/org/netbeans/modules/java/hints/infrastructure/JavaErrorProvider.java
 
b/java/java.hints/src/org/netbeans/modules/java/hints/infrastructure/JavaErrorProvider.java
index 2b6c246..d882cb4 100644
--- 
a/java/java.hints/src/org/netbeans/modules/java/hints/infrastructure/JavaErrorProvider.java
+++ 
b/java/java.hints/src/org/netbeans/modules/java/hints/infrastructure/JavaErrorProvider.java
@@ -147,7 +147,13 @@ public class JavaErrorProvider implements ErrorProvider {
                 default: 
diagBuilder.setSeverity(Diagnostic.Severity.Information); break;
             }
 
-            String id = key(errorKind) + ":" + idx++ + "-" + err.getId();
+            String rangeString;
+            try {
+                rangeString = (range.getBegin().getLine()+1) + ":" + 
(range.getBegin().getColumn()+1) + "-" + (range.getEnd().getLine()+1) + ":" + 
(range.getEnd().getColumn()+1);
+            } catch (IOException ex) {
+                rangeString = null;
+            }
+            String id = key(errorKind) + "(" + ++idx + "): " + (rangeString != 
null ? rangeString : "");
 
             diagBuilder.setCode(id);
             diagBuilder.addActions(errorReporter -> convertFixes(err, 
errorReporter));
@@ -185,7 +191,8 @@ public class JavaErrorProvider implements ErrorProvider {
 
         for (Fix f : fixes) {
             if (f instanceof IncompleteClassPath.ResolveFix) {
-                CodeAction action = new CodeAction(f.getText(), new 
Command(f.getText(), "XXX"/*Server.JAVA_BUILD_WORKSPACE*/));
+                // We know that this is a project problem and that the 
problems reported by ProjectProblemsProvider should be resolved
+                CodeAction action = new CodeAction(f.getText(), new 
Command(f.getText(), "java.project.resolveProjectProblems"));
                 result.add(action);
             }
             if (f instanceof ImportClass.FixImport) {
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 3694598..b6c1e05 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
@@ -709,6 +709,7 @@ public final class Server {
                         JAVA_NEW_FROM_TEMPLATE,
                         JAVA_NEW_PROJECT,
                         JAVA_PROJECT_CONFIGURATION_COMPLETION,
+                        JAVA_PROJECT_RESOLVE_PROJECT_PROBLEMS,
                         JAVA_SUPER_IMPLEMENTATION,
                         JAVA_SOURCE_FOR,
                         JAVA_CLEAR_PROJECT_CACHES,
@@ -882,6 +883,10 @@ public final class Server {
      * Provides code-completion of configurations.
      */
     public static final String JAVA_PROJECT_CONFIGURATION_COMPLETION = 
"java.project.configuration.completion";
+    /**
+     * Provides resolution of project problems.
+     */
+    public static final String JAVA_PROJECT_RESOLVE_PROJECT_PROBLEMS = 
"java.project.resolveProjectProblems";
 
 
     /**
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 6d23041..cccd478 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
@@ -895,7 +895,7 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                             }
                             action.setKind(kind(err.getSeverity()));
                             if (inputAction.getCommand() != null) {
-                                action.setCommand(new 
Command(inputAction.getCommand().getTitle(), 
inputAction.getCommand().getCommand()));
+                                action.setCommand(new 
Command(inputAction.getCommand().getTitle(), 
inputAction.getCommand().getCommand(), 
Arrays.asList(params.getTextDocument().getUri())));
                             }
                             if (inputAction.getEdit() != null) {
                                 org.netbeans.api.lsp.WorkspaceEdit edit = 
inputAction.getEdit();
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
index f30099a..103fc47 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
@@ -40,12 +40,15 @@ import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiConsumer;
@@ -111,6 +114,9 @@ import org.netbeans.spi.project.ActionProgress;
 import org.netbeans.spi.project.ActionProvider;
 import org.netbeans.spi.project.ProjectConfiguration;
 import org.netbeans.spi.project.ProjectConfigurationProvider;
+import org.netbeans.spi.project.ui.ProjectProblemsProvider;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.URLMapper;
 import org.openide.util.Exceptions;
@@ -485,6 +491,62 @@ public final class WorkspaceServiceImpl implements 
WorkspaceService, LanguageCli
                         .thenApply(avoid -> 
completionFutures.stream().flatMap(c -> 
c.join().stream()).collect(Collectors.toList()));
                 return (CompletableFuture<Object>) (CompletableFuture<?>) 
joinedFuture;
             }
+            case Server.JAVA_PROJECT_RESOLVE_PROJECT_PROBLEMS: {
+                final CompletableFuture<Object> result = new 
CompletableFuture<>();
+                List<Object> arguments = params.getArguments();
+                if (!arguments.isEmpty()) {
+                    String fileStr = ((JsonPrimitive) 
arguments.get(0)).getAsString();
+                    FileObject file;
+                    try {
+                        file = 
URLMapper.findFileObject(URI.create(fileStr).toURL());
+                    } catch (MalformedURLException ex) {
+                        result.completeExceptionally(ex);
+                        return result;
+                    }
+                    Project project = FileOwnerQuery.getOwner(file);
+                    if (project != null) {
+                        ProjectProblemsProvider ppp = 
project.getLookup().lookup(ProjectProblemsProvider.class);
+                        if (ppp != null) {
+                            Collection<? extends 
ProjectProblemsProvider.ProjectProblem> problems = ppp.getProblems();
+                            if (!problems.isEmpty()) {
+                                WORKER.post(() -> {
+                                    
List<Pair<ProjectProblemsProvider.ProjectProblem, 
Future<ProjectProblemsProvider.Result>>> resolvers = new LinkedList<>();
+                                    for 
(ProjectProblemsProvider.ProjectProblem problem : ppp.getProblems()) {
+                                        if (problem.isResolvable()) {
+                                            resolvers.add(Pair.of(problem, 
problem.resolve()));
+                                        } else {
+                                            
DialogDisplayer.getDefault().notifyLater(new 
NotifyDescriptor.Message(problem.getDescription(), 
NotifyDescriptor.Message.ERROR_MESSAGE));
+                                        }
+                                    }
+                                    if (!resolvers.isEmpty()) {
+                                        for 
(Pair<ProjectProblemsProvider.ProjectProblem, 
Future<ProjectProblemsProvider.Result>> resolver : resolvers) {
+                                            try {
+                                                if 
(!resolver.second().get().isResolved()) {
+                                                    String message = 
resolver.second().get().getMessage();
+                                                    if (message != null) {
+                                                        
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message(message, 
NotifyDescriptor.Message.ERROR_MESSAGE));
+                                                    }
+                                                }
+                                            } catch (ExecutionException ex) {
+                                                
result.completeExceptionally(ex.getCause());
+                                            } catch (InterruptedException ex) {
+                                                result.complete(false);
+                                                break;
+                                            }
+                                        }
+                                    }
+                                    if (!result.isDone()) {
+                                        result.complete(true);
+                                    }
+                                });
+                            }
+                        }
+                    }
+                } else {
+                    result.completeExceptionally(new 
IllegalStateException("Expecting file URL as an argument to " + command));
+                }
+                return result;
+            }
             case Server.JAVA_CLEAR_PROJECT_CACHES: {
                 // politely clear project manager's cache of "no project" 
answers
                 ProjectManager.getDefault().clearNonProjectCache();
diff --git a/java/java.lsp.server/vscode/package.json 
b/java/java.lsp.server/vscode/package.json
index 6bb6c22..b786ba9 100644
--- a/java/java.lsp.server/vscode/package.json
+++ b/java/java.lsp.server/vscode/package.json
@@ -415,7 +415,7 @@
                                "command": "java.workspace.newproject",
                                "title": "New Project...",
                                "category": "Java",
-                               "icon" : "$(new-folder)"
+                               "icon": "$(new-folder)"
                        },
                        {
                                "command": "java.goto.super.implementation",
@@ -431,11 +431,11 @@
                                "command": "foundProjects.deleteEntry",
                                "title": "Delete"
                        },
-                        {
-                                "command": "db.add.connection",
-                                "title": "Add Database Connection",
-                               "category": "Database"
-                        },
+                       {
+                               "command": "db.add.connection",
+                               "title": "Add Database Connection",
+                               "category": "Database"
+                       },
                        {
                                "command": 
"nbls:Database:netbeans.db.explorer.action.Connect",
                                "title": "Connect to Database"
@@ -494,8 +494,8 @@
                                "command": 
"java.workspace.configureRunSettings",
                                "title": "Edit",
                                "icon": "$(edit)"
-            },
-            {
+                       },
+                       {
                                "command": "testing.runAll",
                                "title": "Run All Tests",
                                "category": "Test"
@@ -606,7 +606,7 @@
                                        "command": 
"workbench.action.debug.start",
                                        "when": "nbJavaLSReady && view == 
foundProjects"
                                }
-                               ],
+                       ],
                        "view/item/context": [
                                {
                                        "command": "foundProjects.deleteEntry",

---------------------------------------------------------------------
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