5353import org .eclipse .lsp4j .UnregistrationParams ;
5454import org .eclipse .lsp4j .jsonrpc .ResponseErrorException ;
5555import org .eclipse .lsp4j .services .LanguageClient ;
56- import org .rascalmpl .vscode .lsp .parametric .ILanguageContributions ;
5756import org .rascalmpl .vscode .lsp .util .concurrent .CompletableFutureUtils ;
5857
5958/**
@@ -71,7 +70,7 @@ public class CapabilityRegistration {
7170 private final Set <AbstractDynamicCapability <?>> dynamicCapabilities ;
7271 private final Set <AbstractDynamicCapability <?>> staticCapabilities ;
7372
74- private final AtomicReference <Collection <ILanguageContributions >> lastContributions = new AtomicReference <>(Collections .emptyList ());
73+ private final AtomicReference <Collection <ICapabilityParams >> lastParams = new AtomicReference <>(Collections .emptyList ());
7574 // Map of method names with current registration values
7675 private final Map <String , Registration > currentRegistrations = new ConcurrentHashMap <>();
7776
@@ -80,7 +79,7 @@ public class CapabilityRegistration {
8079 * @param supportedCapabilities The capabilities to register with the client.
8180 * @param clientCapabilities The capabilities of the client. Determine whether dynamic registration is supported at all.
8281 */
83- public CapabilityRegistration (LanguageClient client , Executor exec , Set < AbstractDynamicCapability <?>> supportedCapabilities , ClientCapabilities clientCapabilities ) {
82+ public CapabilityRegistration (LanguageClient client , Executor exec , ClientCapabilities clientCapabilities , AbstractDynamicCapability <?>... supportedCapabilities ) {
8483 this .client = client ;
8584 this .exec = exec ;
8685 this .noop = CompletableFutureUtils .completedFuture (null , exec );
@@ -113,11 +112,11 @@ public void registerStaticCapabilities(ServerCapabilities result) {
113112
114113 /**
115114 * Update capabilities for language contributions.
116- * @param contribs The contributions to represent.
115+ * @param languages The contributions to represent.
117116 * @return A future that completes with a boolean that is false when any registration failed, and true otherwise.
118117 */
119- public CompletableFuture <Void > update (Collection <ILanguageContributions > contribs ) {
120- logger .debug ("Updating {} dynamic capabilities from {} contributions " , dynamicCapabilities .size (), contribs .size ());
118+ public CompletableFuture <Void > update (Collection <ICapabilityParams > languages ) {
119+ logger .debug ("Updating {} dynamic capabilities for {} languages " , dynamicCapabilities .size (), languages .size ());
121120 // Copy the contributions so we know we are looking at a stable collection of elements.
122121
123122 /*
@@ -126,7 +125,7 @@ public CompletableFuture<Void> update(Collection<ILanguageContributions> contrib
126125 Therefore, we need to set this reference before delegating any work to futures, where we lose guaranteed execution order.
127126 Additionally, this function should be called from a thread pool with predictable execution order.
128127 */
129- lastContributions .set (List .copyOf (contribs ));
128+ lastParams .set (List .copyOf (languages ));
130129 return CompletableFutureUtils .reduce (dynamicCapabilities .stream ().map (this ::updateRegistration ), exec )
131130 .thenAccept (_v -> logger .debug ("Done updating dynamic capabilities" ));
132131 }
@@ -157,16 +156,16 @@ public CompletableFuture<Void> update(Collection<ILanguageContributions> contrib
157156 * @return A future completing with `true` when successful, or `false` otherwise.
158157 */
159158 private <T > CompletableFuture <Void > updateRegistration (AbstractDynamicCapability <T > cap ) {
160- var contribs = lastContributions .get ();
159+ var params = lastParams .get ();
161160 var method = cap .methodName ();
162161
163- return tryBuildRegistration (cap , contribs ).thenCompose (registration -> {
162+ return tryBuildRegistration (cap , params ).thenCompose (registration -> {
164163 // Synchronize on `currentRegistrations`, so we can reliable compute the required registration
165164 // and update the current registration without interference from other threads.
166165 synchronized (currentRegistrations ) {
167166 // If someone else modified the contributions in the meantime, we need to restart.
168167 // Since we took a read-only copy of the contributions, instance comparison can be used everywhere
169- if (lastContributions .get () != contribs ) {
168+ if (lastParams .get () != params ) {
170169 return updateRegistration (cap );
171170 }
172171
@@ -204,7 +203,7 @@ private <T> CompletableFuture<Void> updateRegistration(AbstractDynamicCapability
204203 }
205204
206205 // Ensure that the registration is eventually consistent.
207- if (Objects .equals (currentRegistrations .get (method ), registration ) && lastContributions .get () == contribs ) {
206+ if (Objects .equals (currentRegistrations .get (method ), registration ) && lastParams .get () == params ) {
208207 // Our update persisted and the contributions did not change in the meantime. Success!
209208 return noop ;
210209 }
@@ -282,13 +281,13 @@ private <T> void handleError(@Nullable Throwable t, AbstractDynamicCapability<T>
282281 logger .error ("Unexpected error while (un)registering capability {}" , cap .methodName (), t );
283282 }
284283
285- private <T > CompletableFuture <@ Nullable Registration > tryBuildRegistration (AbstractDynamicCapability <T > cap , Collection <ILanguageContributions > contribs ) {
286- if (contribs .isEmpty ()) {
284+ private <T > CompletableFuture <@ Nullable Registration > tryBuildRegistration (AbstractDynamicCapability <T > cap , Collection <ICapabilityParams > languages ) {
285+ if (languages .isEmpty ()) {
287286 return CompletableFutureUtils .completedFuture (null , exec );
288287 }
289288
290289 // Filter contributions by providing this capability
291- return CompletableFutureUtils .filter (contribs , cap ::isProvidedBy ).<@ Nullable Registration >thenCompose (cs -> {
290+ return CompletableFutureUtils .filter (languages , cap ::isProvidedBy ).<@ Nullable Registration >thenCompose (cs -> {
292291 if (cs .isEmpty ()) {
293292 return CompletableFutureUtils .completedFuture (null , exec );
294293 }
0 commit comments