From 1a138d4009d5673445d90fef9293ef4c19109e55 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 26 Feb 2021 12:28:21 +0100 Subject: [PATCH] added cancel handling to code lens requests --- .../languageserver/util/CodeLensHandler.java | 5 +++-- .../util/SimpleTextDocumentService.java | 2 +- .../boot/java/handlers/BootJavaCodeLensEngine.java | 13 +++++++++---- .../vscode/boot/java/handlers/CodeLensProvider.java | 5 +++-- .../WebfluxHandlerCodeLensProvider.java | 13 +++++++++---- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CodeLensHandler.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CodeLensHandler.java index 8e76399e2..5f4c0a814 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CodeLensHandler.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CodeLensHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2018 Pivotal, Inc. + * Copyright (c) 2017, 2021 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -14,10 +14,11 @@ import java.util.List; import org.eclipse.lsp4j.CodeLens; import org.eclipse.lsp4j.CodeLensParams; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; @FunctionalInterface public interface CodeLensHandler { - List handle(CodeLensParams params); + List handle(CancelChecker cancelToken, CodeLensParams params); } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java index 6fc54f435..19a57b8bb 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java @@ -422,7 +422,7 @@ public class SimpleTextDocumentService implements TextDocumentService, DocumentE if (handler != null) { return CompletableFutures.computeAsync(cancelToken -> { - return handler.handle(params); + return handler.handle(cancelToken, params); }); } return CompletableFuture.completedFuture(Collections.emptyList()); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCodeLensEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCodeLensEngine.java index e24c610a3..39a643997 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCodeLensEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCodeLensEngine.java @@ -13,10 +13,12 @@ package org.springframework.ide.vscode.boot.java.handlers; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4j.CodeLens; import org.eclipse.lsp4j.CodeLensParams; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.util.CodeLensHandler; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; @@ -36,7 +38,7 @@ public class BootJavaCodeLensEngine implements CodeLensHandler { } @Override - public List handle(CodeLensParams params) { + public List handle(CancelChecker cancelToken, CodeLensParams params) { SimpleTextDocumentService documents = server.getTextDocumentService(); String docURI = params.getTextDocument().getUri(); @@ -45,11 +47,14 @@ public class BootJavaCodeLensEngine implements CodeLensHandler { // Spring Boot LS get events from boot properties files as well, so filter them out if (server.getInterestingLanguages().contains(doc.getLanguageId())) { try { - List codeLensesResult = provideCodeLenses(doc); + List codeLensesResult = provideCodeLenses(cancelToken, doc); if (codeLensesResult != null) { return codeLensesResult; } } + catch (CancellationException e) { + throw e; + } catch (Exception e) { } } @@ -58,13 +63,13 @@ public class BootJavaCodeLensEngine implements CodeLensHandler { return SimpleTextDocumentService.NO_CODELENS; } - private List provideCodeLenses(TextDocument document) { + private List provideCodeLenses(CancelChecker cancelToken, TextDocument document) { return server.getCompilationUnitCache().withCompilationUnit(document, cu -> { if (cu != null) { List result = new ArrayList<>(); for (CodeLensProvider codeLensProvider : codelensProviders) { - codeLensProvider.provideCodeLenses(document, cu, result); + codeLensProvider.provideCodeLenses(cancelToken, document, cu, result); } if (result.size() > 0) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/CodeLensProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/CodeLensProvider.java index ed77bdccb..8d3bb82f6 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/CodeLensProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/CodeLensProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2018 Pivotal, Inc. + * Copyright (c) 2017, 2021 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -14,6 +14,7 @@ import java.util.List; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.lsp4j.CodeLens; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.springframework.ide.vscode.commons.util.text.TextDocument; /** @@ -21,6 +22,6 @@ import org.springframework.ide.vscode.commons.util.text.TextDocument; */ public interface CodeLensProvider { - public void provideCodeLenses(TextDocument document, CompilationUnit cu, List resultAccumulator); + public void provideCodeLenses(CancelChecker cancelToken, TextDocument document, CompilationUnit cu, List resultAccumulator); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java index f522da346..20fa8c0a9 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2019 Pivotal, Inc. + * Copyright (c) 2018, 2021 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -18,6 +18,7 @@ import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.lsp4j.CodeLens; import org.eclipse.lsp4j.Command; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.springframework.ide.vscode.boot.app.SpringSymbolIndex; import org.springframework.ide.vscode.boot.java.handlers.CodeLensProvider; import org.springframework.ide.vscode.boot.java.handlers.SymbolAddOnInformation; @@ -36,17 +37,19 @@ public class WebfluxHandlerCodeLensProvider implements CodeLensProvider { } @Override - public void provideCodeLenses(TextDocument document, CompilationUnit cu, List resultAccumulator) { + public void provideCodeLenses(CancelChecker cancelToken, TextDocument document, CompilationUnit cu, List resultAccumulator) { cu.accept(new ASTVisitor() { @Override public boolean visit(MethodDeclaration node) { - provideCodeLens(node, document, resultAccumulator); + provideCodeLens(cancelToken, node, document, resultAccumulator); return super.visit(node); } }); } - protected void provideCodeLens(MethodDeclaration node, TextDocument document, List resultAccumulator) { + protected void provideCodeLens(CancelChecker cancelToken, MethodDeclaration node, TextDocument document, List resultAccumulator) { + cancelToken.checkCanceled(); + IMethodBinding methodBinding = node.resolveBinding(); if (methodBinding != null && methodBinding.getDeclaringClass() != null && methodBinding.getMethodDeclaration() != null @@ -54,6 +57,8 @@ public class WebfluxHandlerCodeLensProvider implements CodeLensProvider { final String handlerClass = methodBinding.getDeclaringClass().getBinaryName().trim(); final String handlerMethod = methodBinding.getMethodDeclaration().toString().trim(); + + cancelToken.checkCanceled(); List handlerInfos = this.springIndexer.getAllAdditionalInformation((addon) -> { if (addon instanceof WebfluxHandlerInformation) {