From d45ee5c33da0b0fefb89fcf88b9093732d21ca89 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Sat, 23 Mar 2019 00:37:40 -0400 Subject: [PATCH] PT #164842647: Boot properties proposals in parallel --- .../ide/vscode/commons/jdtls/JdtLsIndex.java | 5 ++-- ...opertiesCompletionProposalsCalculator.java | 21 +++++++++------ .../ApplicationYamlAssistContext.java | 26 +++++++++++-------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java index af5d017a4..83f147b4b 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java @@ -18,7 +18,6 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,11 +86,11 @@ public class JdtLsIndex implements ClasspathIndex { return typeCache.get(fqName, () -> { JavaDataParams params = new JavaDataParams(projectUri.toString(), "L" + fqName.replace('.', '/') + ";", false); try { - TypeData data = client.javaType(params).get(500, TimeUnit.MILLISECONDS); + TypeData data = client.javaType(params).get(); if (data != null) { return Optional.ofNullable(toType(data)); } - } catch (InterruptedException | ExecutionException | TimeoutException e) { + } catch (InterruptedException | ExecutionException e) { log.error("", e); } return Optional.empty(); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java index 95ce8941e..5d9365140 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java @@ -23,6 +23,8 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.common.PropertyCompletionFactory; import org.springframework.ide.vscode.boot.metadata.PropertyInfo; import org.springframework.ide.vscode.boot.metadata.hints.HintProvider; @@ -45,7 +47,6 @@ import org.springframework.ide.vscode.commons.util.CollectionUtil; import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.FuzzyMap.Match; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; -import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.text.DocumentRegion; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser; @@ -59,6 +60,8 @@ import com.google.common.collect.ImmutableList; public class PropertiesCompletionProposalsCalculator { + private static final Logger log = LoggerFactory.getLogger(PropertiesCompletionProposalsCalculator.class); + private static final PrefixFinder valuePrefixFinder = new PrefixFinder() { @Override protected boolean isPrefixChar(char c) { @@ -160,7 +163,7 @@ public class PropertiesCompletionProposalsCalculator { } } } catch (Exception e) { - Log.log(e); + log.error("{}", e); } return Collections.emptyList(); } @@ -219,7 +222,7 @@ public class PropertiesCompletionProposalsCalculator { //TODO: other cases ']' or '[' ? } } catch (Exception e) { - Log.log(e); + log.error("{}", e); } return Collections.emptyList(); } @@ -334,7 +337,7 @@ public class PropertiesCompletionProposalsCalculator { Collection> matches = findMatches(prefix); if (matches!=null && !matches.isEmpty()) { ArrayList proposals = new ArrayList(matches.size()); - for (final Match match : matches) { + matches.parallelStream().forEach(match -> { DocumentEdits docEdits; try { docEdits = LazyProposalApplier.from(() -> { @@ -345,15 +348,17 @@ public class PropertiesCompletionProposalsCalculator { edits.insert(offset, match.data.getId() + propertyCompletionPostfix(typeUtil, type)); return edits; } catch (Throwable t) { - Log.log(t); + log.error("{}", t); return new DocumentEdits(doc); } }); - proposals.add(completionFactory.property(doc, docEdits, match, typeUtil)); + synchronized (proposals) { + proposals.add(completionFactory.property(doc, docEdits, match, typeUtil)); + } } catch (Throwable e) { - Log.log(e); + log.error("{}", e); } - } + }); return proposals; } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java index 45f67c417..9b26ff9d2 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java @@ -27,9 +27,7 @@ import org.springframework.ide.vscode.boot.common.InformationTemplates; import org.springframework.ide.vscode.boot.common.PropertyCompletionFactory; import org.springframework.ide.vscode.boot.common.RelaxedNameConfig; import org.springframework.ide.vscode.boot.configurationmetadata.Deprecation; -import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents; import org.springframework.ide.vscode.boot.java.links.JavaElementLocationProvider; -import org.springframework.ide.vscode.boot.java.links.SourceLinkFactory; import org.springframework.ide.vscode.boot.java.links.SourceLinks; import org.springframework.ide.vscode.boot.metadata.IndexNavigator; import org.springframework.ide.vscode.boot.metadata.PropertyInfo; @@ -446,16 +444,22 @@ public abstract class ApplicationYamlAssistContext extends AbstractYamlAssistCon Collection> matchingProps = indexNav.findMatching(query); if (!matchingProps.isEmpty()) { ArrayList completions = new ArrayList(); - for (Match match : matchingProps) { - DocumentEdits edits = createEdits(doc, node, offset, query, match); - ScoreableProposal completion = completionFactory.property( - doc.getDocument(), edits, match, typeUtil - ); - if (getContextRoot(doc).exists(YamlPath.fromProperty(match.data.getId()))) { - completion.deemphasize(DEEMP_EXISTS); + matchingProps.parallelStream().forEach(match -> { + try { + DocumentEdits edits = createEdits(doc, node, offset, query, match); + ScoreableProposal completion = completionFactory.property( + doc.getDocument(), edits, match, typeUtil + ); + if (getContextRoot(doc).exists(YamlPath.fromProperty(match.data.getId()))) { + completion.deemphasize(DEEMP_EXISTS); + } + synchronized (completions) { + completions.add(completion); + } + } catch (Exception e) { + log.error("{}", e); } - completions.add(completion); - } + }); return completions; } return Collections.emptyList();