diff --git a/rascal-lsp/src/main/checkerframework/rascal.astub b/rascal-lsp/src/main/checkerframework/rascal.astub index ec523a30c..c11166d44 100644 --- a/rascal-lsp/src/main/checkerframework/rascal.astub +++ b/rascal-lsp/src/main/checkerframework/rascal.astub @@ -20,3 +20,14 @@ public abstract class TreeVisitor extends IdentityVisitor T call(IValue... parameters) { } +} diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/InterpretedLanguageContributions.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/InterpretedLanguageContributions.java index cccc33b44..bd6266655 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/InterpretedLanguageContributions.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/InterpretedLanguageContributions.java @@ -622,7 +622,7 @@ public InterruptibleFuture execution(String command) { ), exec); } - private InterruptibleFuture execFunction(String name, CompletableFuture<@Nullable IFunction> target, T defaultResult, IValue... args) { + private InterruptibleFuture execFunction(String name, CompletableFuture<@Nullable IFunction> target, T defaultResult, IValue... args) { if (target == null) { return InterruptibleFuture.completedFuture(defaultResult, exec); } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageContributionsMultiplexer.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageContributionsMultiplexer.java index 329c51faf..644d85b3b 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageContributionsMultiplexer.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageContributionsMultiplexer.java @@ -230,16 +230,9 @@ private CompletableFuture anyTrue(Function CompletableFuture anyTrue( Function> predicate, T falsy, BinaryOperator or) { - - var result = CompletableFutureUtils.completedFuture(falsy, exec); // no short-circuiting, but it's not problem, it's only triggered at the beginning of a registry // pretty soon the future will be completed. - for (var c: contributions) { - var checkCurrent = predicate.apply(c.contrib) - .exceptionally(e -> falsy); - result = result.thenCombine(checkCurrent, or); - } - return result; + return CompletableFutureUtils.reduce(contributions.stream().map(c -> predicate.apply(c.contrib).exceptionally(_e -> falsy)), CompletableFutureUtils.completedFuture(falsy, exec), Function.identity(), or); } @Override diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java index c5115f234..52afa7371 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java @@ -53,6 +53,7 @@ import org.apache.logging.log4j.core.util.IOUtils; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.nullness.qual.PolyNull; import org.eclipse.lsp4j.ApplyWorkspaceEditParams; import org.eclipse.lsp4j.CallHierarchyIncomingCall; import org.eclipse.lsp4j.CallHierarchyIncomingCallsParams; @@ -441,7 +442,7 @@ public CompletableFuture> codeLens(CodeLensParams param .thenApply(s -> s.stream() .map(e -> locCommandTupleToCodeLense(contrib.getName(), e)) .collect(Collectors.toList()) - ), () -> null); + ), Collections::emptyList); } @@ -625,11 +626,11 @@ public CompletableFuture> inlayHint(InlayHintParams params) { .thenApply(s -> s.stream() .map(this::rowToInlayHint) .collect(Collectors.toList()) - ), () -> null); + ), Collections::emptyList); } - private static CompletableFuture recoverExceptions(CompletableFuture future, Supplier defaultValue) { + private static CompletableFuture<@PolyNull T> recoverExceptions(CompletableFuture<@PolyNull T> future, Supplier<@PolyNull T> defaultValue) { return future .exceptionally(e -> { logger.error("Operation failed with", e); @@ -870,7 +871,7 @@ public CompletableFuture> foldingRange(FoldingRangeRequestPar return recoverExceptions(file.getCurrentTreeAsync(true).thenApply(Versioned::get).thenApply(FoldingRanges::getFoldingRanges) .whenComplete((r, e) -> logger.trace("Folding regions success, reporting {} regions back", r == null ? 0 : r.size()) - ), Collections::emptyList); + ), Collections::emptyList); } @Override diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/CapabilityRegistration.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/CapabilityRegistration.java index cb5c6fb72..b2df79872 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/CapabilityRegistration.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/CapabilityRegistration.java @@ -65,7 +65,7 @@ public class CapabilityRegistration { private final LanguageClient client; private final Executor exec; - private final CompletableFuture noop; + private final CompletableFuture<@Nullable Void> noop; private final Set> dynamicCapabilities; private final Set> staticCapabilities; diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java index e581a3273..f957e9163 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java @@ -45,6 +45,7 @@ import org.apache.logging.log4j.Logger; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.nullness.qual.PolyNull; import org.eclipse.lsp4j.ApplyWorkspaceEditParams; import org.eclipse.lsp4j.ApplyWorkspaceEditResponse; import org.eclipse.lsp4j.ClientCapabilities; @@ -346,10 +347,10 @@ public CompletableFuture, List s == null ? Collections.emptyList() : s.getDefinition(params.getPosition())) .thenApply(Either::forLeft) - , () -> Either.forLeft(Collections.emptyList())); + , () -> Either.forLeft(Collections.emptyList())); } else { - return CompletableFutureUtils.completedFuture(Either.forLeft(Collections.emptyList()), exec); + return CompletableFutureUtils.completedFuture(Either.forLeft(Collections.emptyList()), exec); } } @@ -413,7 +414,7 @@ public CompletableFuture Locations.toRange(TreeAdapter.getLocation(cur), columns)) - .thenApply(Either3::forFirst), () -> null); + .thenApply(Either3::forFirst), () -> Either3.forSecond(new PrepareRenameResult())); } @Override @@ -670,9 +671,7 @@ public CompletableFuture> codeLens(CodeLensParams param return recoverExceptions(f.getLastTreeAsync(false) .thenApply(Versioned::get) .thenApplyAsync(availableRascalServices()::locateCodeLenses, exec) - .thenApply(List::stream) - .thenApply(res -> res.map(this::makeRunCodeLens)) - .thenApply(s -> s.collect(Collectors.toList())), () -> null) + .thenApply(lenses -> lenses.stream().map(this::makeRunCodeLens).collect(Collectors.toList())), () -> null) ; } @@ -724,7 +723,7 @@ public CompletableFuture executeCommand(String extension, String command return availableRascalServices().executeCommand(command).get(); } - private static CompletableFuture recoverExceptions(CompletableFuture future, Supplier defaultValue) { + private static CompletableFuture<@PolyNull T> recoverExceptions(CompletableFuture<@PolyNull T> future, Supplier<@PolyNull T> defaultValue) { return future .exceptionally(e -> { if (e instanceof ResponseErrorException) { @@ -735,7 +734,7 @@ private static CompletableFuture recoverExceptions(Completab }); } - private static CompletableFuture> recoverExceptions(CompletableFuture> future) { + private static CompletableFuture> recoverExceptions(CompletableFuture> future) { return recoverExceptions(future, Collections::emptyList); } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/CodeActions.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/CodeActions.java index 9d80a818a..684c67a62 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/CodeActions.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/CodeActions.java @@ -88,7 +88,7 @@ public static CompletableFuture> extractActionsFromDiagnostics(Co /* merges two streams of CodeAction terms and then converts them to LSP objects */ public static CompletableFuture>> mergeAndConvertCodeActions(IBaseTextDocumentService doc, String dedicatedLanguageName, String languageName, CompletableFuture> quickfixes, CompletableFuture> codeActions) { return codeActions.thenCombine(quickfixes, (actions, quicks) -> - Stream.concat(quicks, actions) + Stream.concat(quicks, actions) .map(IConstructor.class::cast) .map(cons -> constructorToCodeAction(doc, dedicatedLanguageName, languageName, cons)) .map(Either::forRight) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/Diagnostics.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/Diagnostics.java index c5ba8b86f..807de94e6 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/Diagnostics.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/conversion/Diagnostics.java @@ -256,7 +256,7 @@ private static List translateDiagnostics(ICollection messages, Co .collect(Collectors.toList()); } - public static Map> translateMessages(ICollection messages, ColumnMaps cm) { + public static Map> translateMessages(IList messages, ColumnMaps cm) { return messages.stream() .filter(IConstructor.class::isInstance) .map(IConstructor.class::cast) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/CompletableFutureUtils.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/CompletableFutureUtils.java index 3a412336d..368adf497 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/CompletableFutureUtils.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/CompletableFutureUtils.java @@ -36,7 +36,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.checkerframework.checker.nullness.qual.PolyNull; public class CompletableFutureUtils { private CompletableFutureUtils() {/* hidden */ } @@ -133,7 +132,7 @@ public static CompletableFuture reduce(Stream> fu */ public static CompletableFuture reduce(Iterable> futures, CompletableFuture identity, Function map, BinaryOperator concat) { - CompletableFuture result = identity; + var result = identity; for (var fut : futures) { result = result.thenCombine(fut, (acc, t) -> concat.apply(acc, map.apply(t))); } @@ -141,7 +140,7 @@ public static CompletableFuture reduce(Iterable> return result; } - private static List<@PolyNull T> concat(List<@PolyNull T> l, List<@PolyNull T> r) { + private static List concat(List l, List r) { if (r.isEmpty()) { return l; } @@ -149,7 +148,7 @@ public static CompletableFuture reduce(Iterable> return r; } - var ls = new LinkedList<@PolyNull T>(l); + var ls = new LinkedList(l); ls.addAll(r); return ls; } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/InterruptibleFuture.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/InterruptibleFuture.java index 7fa8e25f2..0f5373b58 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/InterruptibleFuture.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/InterruptibleFuture.java @@ -32,7 +32,6 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; -import org.checkerframework.checker.nullness.qual.PolyNull; public class InterruptibleFuture { @@ -102,9 +101,9 @@ public static InterruptibleFuture completedFuture(T result, Executor exec * Turn an completable future with a interruptible future inside into a * normal interruptible future by inlining them */ - public static InterruptibleFuture<@PolyNull T> flatten(CompletableFuture> f, Executor exec) { + public static InterruptibleFuture flatten(CompletableFuture> f, Executor exec) { return new InterruptibleFuture<>( - f.<@PolyNull T>thenCompose(InterruptibleFuture::get), + f.thenCompose(InterruptibleFuture::get), () -> f.thenAcceptAsync(InterruptibleFuture::interrupt, exec) // schedule interrupt async so that we don't deadlock during interrupt ); } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/ReplaceableFuture.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/ReplaceableFuture.java index 33ad5924d..aa828b472 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/ReplaceableFuture.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/concurrent/ReplaceableFuture.java @@ -31,8 +31,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicReference; - import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.nullness.qual.PolyNull; /** * A wrapper around CompletableFuture's that allow for us to replace the results of a still running future, and call an @@ -111,7 +111,7 @@ public InterruptibleFuture replace(InterruptibleFuture with) { return new InterruptibleFuture<>(result, with::interrupt); } - public static ReplaceableFuture completedFuture(T result, Executor exec) { + public static ReplaceableFuture<@PolyNull T> completedFuture(@PolyNull T result, Executor exec) { return new ReplaceableFuture<>(CompletableFutureUtils.completedFuture(result, exec)); } }