From 0a4e1d28987b42c2ce2badcd323d93131a206eb4 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 26 Feb 2021 12:23:27 +0100 Subject: [PATCH] added cancel handling to references requests --- .../util/ReferencesHandler.java | 5 ++-- .../util/SimpleTextDocumentService.java | 2 +- .../handlers/BootJavaReferencesHandler.java | 24 ++++++++++++++----- .../boot/java/handlers/ReferenceProvider.java | 5 ++-- .../ValuePropertyReferencesProvider.java | 9 +++---- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ReferencesHandler.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ReferencesHandler.java index b08b1edb1..4b34ac1c5 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ReferencesHandler.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ReferencesHandler.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.Location; import org.eclipse.lsp4j.ReferenceParams; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; @FunctionalInterface public interface ReferencesHandler { - List handle(ReferenceParams params); + List handle(CancelChecker cancelToken, ReferenceParams 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 ec53a7532..6fc54f435 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 @@ -350,7 +350,7 @@ public class SimpleTextDocumentService implements TextDocumentService, DocumentE if (h != null) { return CompletableFutures.computeAsync(cancelToken -> { - List list = h.handle(params); + List list = h.handle(cancelToken, params); return list != null && list.isEmpty() ? null : list; }); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java index 35de57170..30e637f47 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java @@ -13,6 +13,7 @@ package org.springframework.ide.vscode.boot.java.handlers; import java.io.File; import java.util.List; import java.util.Map; +import java.util.concurrent.CancellationException; import java.util.stream.Stream; import org.eclipse.jdt.core.JavaCore; @@ -26,6 +27,7 @@ import org.eclipse.jdt.core.dom.NodeFinder; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.ReferenceParams; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IClasspathUtil; @@ -52,7 +54,7 @@ public class BootJavaReferencesHandler implements ReferencesHandler { } @Override - public List handle(ReferenceParams params) { + public List handle(CancelChecker cancelToken, ReferenceParams params) { SimpleTextDocumentService documents = server.getTextDocumentService(); TextDocument doc = documents.getLatestSnapshot(params); @@ -61,11 +63,17 @@ public class BootJavaReferencesHandler implements ReferencesHandler { if (server.getInterestingLanguages().contains(doc.getLanguageId())) { try { int offset = doc.toOffset(params.getPosition()); - List referencesResult = provideReferences(doc, offset); + + cancelToken.checkCanceled(); + + List referencesResult = provideReferences(cancelToken, doc, offset); if (referencesResult != null) { return referencesResult; } } + catch (CancellationException e) { + throw e; + } catch (Exception e) { } } @@ -74,7 +82,7 @@ public class BootJavaReferencesHandler implements ReferencesHandler { return SimpleTextDocumentService.NO_REFERENCES; } - private List provideReferences(TextDocument document, int offset) throws Exception { + private List provideReferences(CancelChecker cancelToken, TextDocument document, int offset) throws Exception { ASTParser parser = ASTParser.newParser(AST.JLS15); Map options = JavaCore.getOptions(); JavaCore.setComplianceOptions(JavaCore.VERSION_15, options); @@ -92,18 +100,21 @@ public class BootJavaReferencesHandler implements ReferencesHandler { String unitName = docURI.substring(docURI.lastIndexOf("/")); parser.setUnitName(unitName); parser.setSource(document.get(0, document.getLength()).toCharArray()); + + cancelToken.checkCanceled(); CompilationUnit cu = (CompilationUnit) parser.createAST(null); ASTNode node = NodeFinder.perform(cu, offset, 0); if (node != null) { - return provideReferencesForAnnotation(node, offset, document); + cancelToken.checkCanceled(); + return provideReferencesForAnnotation(cancelToken, node, offset, document); } return null; } - private List provideReferencesForAnnotation(ASTNode node, int offset, TextDocument doc) { + private List provideReferencesForAnnotation(CancelChecker cancelToken, ASTNode node, int offset, TextDocument doc) { Annotation annotation = null; while (node != null && !(node instanceof Annotation)) { @@ -114,11 +125,12 @@ public class BootJavaReferencesHandler implements ReferencesHandler { annotation = (Annotation) node; ITypeBinding type = annotation.resolveTypeBinding(); if (type != null) { + String qualifiedName = type.getQualifiedName(); if (qualifiedName != null) { ReferenceProvider provider = this.referenceProviders.get(qualifiedName); if (provider != null) { - return provider.provideReferences(node, annotation, type, offset, doc); + return provider.provideReferences(cancelToken, node, annotation, type, offset, doc); } } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/ReferenceProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/ReferenceProvider.java index bbd24c9c6..42d8a056c 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/ReferenceProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/ReferenceProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 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 @@ -16,6 +16,7 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.lsp4j.Location; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.springframework.ide.vscode.commons.util.text.TextDocument; /** @@ -23,7 +24,7 @@ import org.springframework.ide.vscode.commons.util.text.TextDocument; */ public interface ReferenceProvider { - List provideReferences(ASTNode node, Annotation annotation, + List provideReferences(CancelChecker cancelToken, ASTNode node, Annotation annotation, ITypeBinding type, int offset, TextDocument doc); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.java index f25be8d7c..d71c3222d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.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 @@ -20,7 +20,6 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -34,6 +33,7 @@ import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.WorkspaceFolder; +import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.springframework.ide.vscode.boot.java.handlers.ReferenceProvider; import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; @@ -46,7 +46,6 @@ import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser; import org.springframework.ide.vscode.java.properties.parser.ParseResults; import org.springframework.ide.vscode.java.properties.parser.Parser; import org.springframework.ide.vscode.java.properties.parser.PropertiesAst.KeyValuePair; -import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.NodeId; @@ -64,8 +63,10 @@ public class ValuePropertyReferencesProvider implements ReferenceProvider { } @Override - public List provideReferences(ASTNode node, Annotation annotation, + public List provideReferences(CancelChecker cancelToken, ASTNode node, Annotation annotation, ITypeBinding type, int offset, TextDocument doc) { + + cancelToken.checkCanceled(); try { // case: @Value("prefix<*>")