You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by vi...@apache.org on 2022/03/05 11:00:32 UTC

[netbeans] branch master updated: ide/lsp.client + MultiMimeLanguageServerProvider (#3655)

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

vieiro 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 d781b1c  ide/lsp.client + MultiMimeLanguageServerProvider (#3655)
d781b1c is described below

commit d781b1ca719f0a868777005aca3a6e00edbf7d58
Author: Antonio Vieiro <vi...@apache.org>
AuthorDate: Sat Mar 5 12:00:07 2022 +0100

    ide/lsp.client + MultiMimeLanguageServerProvider (#3655)
    
    * ide/lsp.client + MultiMimeLanguageServerProvider
    * Copy MultiMimeLanguageServerProvider.getMimeTypes
    * Contemplate already restarted servers
---
 ide/lsp.client/apichanges.xml                      | 12 ++++++++
 ide/lsp.client/nbproject/project.properties        |  2 +-
 .../netbeans/modules/lsp/client/LSPBindings.java   | 20 ++++++++++++
 .../spi/MultiMimeLanguageServerProvider.java       | 36 ++++++++++++++++++++++
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/ide/lsp.client/apichanges.xml b/ide/lsp.client/apichanges.xml
index 3128885..dc04136 100644
--- a/ide/lsp.client/apichanges.xml
+++ b/ide/lsp.client/apichanges.xml
@@ -25,6 +25,18 @@
     <apidef name="lsp_client">LSP Client API</apidef>
 </apidefs>
 <changes>
+    <change id="MultiMimeLanguageServerProvider">
+        <api name="lsp_client" />
+        <summary>Adding MultiMimeLanguageServerProvider</summary>
+        <version major="0" minor="1.9" />
+        <date day="22" month="2" year="2022" />
+        <author login="vieiro" />
+        <compatibility addition="yes" binary="compatible" source="compatible" />
+        <description>
+               org.netbeans.modules.lsp.client.spi.MultiMimeLanguageServerProvider
+        </description>
+        <class name="MultiMimeLanguageServerProvider" package="org.netbeans.modules.lsp.client.spi"/>
+    </change>
     <change id="ServerRestarter">
         <api name="lsp_client" />
         <summary>Adding ServerRestarter</summary>
diff --git a/ide/lsp.client/nbproject/project.properties b/ide/lsp.client/nbproject/project.properties
index 2b6502e..1c729a6 100644
--- a/ide/lsp.client/nbproject/project.properties
+++ b/ide/lsp.client/nbproject/project.properties
@@ -24,4 +24,4 @@ release.external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar=modules/ext/org.eclipse.ls
 release.external/org.eclipse.xtend.lib-2.19.0.jar=modules/ext/org.eclipse.xtend.lib-2.19.0.jar
 release.external/org.eclipse.xtend.lib.macro-2.19.0.jar=modules/ext/org.eclipse.xtend.lib.macro-2.19.0.jar
 release.external/org.eclipse.xtext.xbase.lib-2.19.0.jar=modules/ext/org.eclipse.xtext.xbase.lib-2.19.0.jar
-spec.version.base=1.15.0
+spec.version.base=1.16.0
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
index b2e7e06..88fac4c 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
@@ -82,6 +82,7 @@ import org.netbeans.modules.lsp.client.options.MimeTypeInfo;
 import org.netbeans.modules.lsp.client.spi.ServerRestarter;
 import org.netbeans.modules.lsp.client.spi.LanguageServerProvider;
 import org.netbeans.modules.lsp.client.spi.LanguageServerProvider.LanguageServerDescription;
+import org.netbeans.modules.lsp.client.spi.MultiMimeLanguageServerProvider;
 import org.openide.awt.NotificationDisplayer;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
@@ -209,6 +210,12 @@ public class LSPBindings {
             if (bindings != null) {
                 description.bindings = new WeakReference<>(bindings);
                 description.lastStartTimeStamp = System.currentTimeMillis();
+                // If ServerDescription acknowledges another mimetypes, add these
+                // to project2MimeType2Server too.
+                Map<String, ServerDescription> mimeType2Server = project2MimeType2Server.get(uri);
+                for(String mt: description.mimeTypes) {
+                    mimeType2Server.put(mt, description);
+                }
                 WORKER.post(() -> cs.fireChange());
             }
         }
@@ -247,6 +254,12 @@ public class LSPBindings {
         ServerRestarter restarter = () -> {
             synchronized (LSPBindings.class) {
                 ServerDescription description = project2MimeType2Server.getOrDefault(baseUri, Collections.emptyMap()).remove(mt);
+                // Remove any other mimetypes as well.
+                if (description != null) {
+                    for(String anotherMT: description.mimeTypes) {
+                        project2MimeType2Server.get(baseUri).remove(anotherMT);
+                    }
+                }
                 Reference<LSPBindings> bRef = description != null ? description.bindings : null;
                 LSPBindings b = bRef != null ? bRef.get() : null;
 
@@ -269,6 +282,12 @@ public class LSPBindings {
 
         for (LanguageServerProvider provider : MimeLookup.getLookup(mt).lookupAll(LanguageServerProvider.class)) {
             final Lookup lkp = prj != null ? Lookups.fixed(prj, mimeTypeInfo, restarter) : Lookups.fixed(mimeTypeInfo, restarter);
+            inDescription.mimeTypes = Collections.singleton(mt);
+            // If this is a MultiMimeLanguageServerProvider, then retrieve all 
+            // mime types handled by this server.
+            if (provider instanceof MultiMimeLanguageServerProvider) {
+                inDescription.mimeTypes = new HashSet<>(((MultiMimeLanguageServerProvider)provider).getMimeTypes());
+            }
             LanguageServerDescription desc = provider.startServer(lkp);
 
             if (desc != null) {
@@ -574,5 +593,6 @@ public class LSPBindings {
         public long lastStartTimeStamp;
         public int failedCount;
         public Reference<LSPBindings> bindings;
+        public Set<String> mimeTypes;
     }
 }
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/spi/MultiMimeLanguageServerProvider.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/spi/MultiMimeLanguageServerProvider.java
new file mode 100644
index 0000000..67e70e9
--- /dev/null
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/spi/MultiMimeLanguageServerProvider.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.lsp.client.spi;
+
+import java.util.Set;
+
+/**
+ * Possibly start a language server. Should be installed in the Mime Lookup for
+ * all the given mime types that are handled by the given server.
+ * @author antonio
+ */
+public interface MultiMimeLanguageServerProvider extends LanguageServerProvider {
+
+    /**
+     * Returns the set of mime types handled by this server.
+     * @return The set of mime types handled by this server.
+     */
+    Set<String> getMimeTypes();
+
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists