From 8544efa73b8fd85ac0919c8320ffa90ee0d2a557 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Thu, 26 Sep 2024 13:42:25 +0200 Subject: [PATCH] bringing back an order in completion proposals, got lost due to random hashmap ordering --- ...nnotationAttributeCompletionProcessor.java | 3 ++- .../beans/DependsOnCompletionProcessor.java | 3 ++- .../java/beans/NamedCompletionProvider.java | 3 ++- .../java/beans/ProfileCompletionProvider.java | 3 ++- .../beans/QualifierCompletionProvider.java | 3 ++- .../beans/ResourceCompletionProvider.java | 3 ++- ...ditionalOnResourceCompletionProcessor.java | 3 ++- .../CronExpressionCompletionProvider.java | 8 +++---- .../java/scope/ScopeCompletionProcessor.java | 21 +++++++++++-------- 9 files changed, 30 insertions(+), 20 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationAttributeCompletionProcessor.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationAttributeCompletionProcessor.java index 53399807c..712558bf7 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationAttributeCompletionProcessor.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationAttributeCompletionProcessor.java @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.boot.java.annotations; import java.util.Collection; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -127,7 +128,7 @@ public class AnnotationAttributeCompletionProcessor implements CompletionProvide Map filteredProposals = proposals.entrySet().stream() .filter(candidate -> candidate.getKey().toLowerCase().contains(filterPrefix.toLowerCase())) .filter(candidate -> !alreadyMentionedValues.contains(candidate.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (u, v) -> u, LinkedHashMap::new)); double score = filteredProposals.size(); for (Map.Entry entry : filteredProposals.entrySet()) { String candidate = entry.getKey(); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/DependsOnCompletionProcessor.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/DependsOnCompletionProcessor.java index 13bcd3215..2bd3e2894 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/DependsOnCompletionProcessor.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/DependsOnCompletionProcessor.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; @@ -240,7 +241,7 @@ public class DependsOnCompletionProcessor implements AnnotationAttributeCompleti return Arrays.stream(this.springIndex.getBeansOfProject(project.getElementName())) .map(bean -> bean.getName()) .distinct() - .collect(Collectors.toMap(key -> key, value -> value)); + .collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new)); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/NamedCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/NamedCompletionProvider.java index 7d864ba43..b3f2a6fd5 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/NamedCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/NamedCompletionProvider.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -41,7 +42,7 @@ public class NamedCompletionProvider implements AnnotationAttributeCompletionPro findAllNamedValues(beans), Arrays.stream(beans).map(bean -> bean.getName())) .distinct() - .collect(Collectors.toMap(key -> key, value -> value)); + .collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new)); } private Stream findAllNamedValues(Bean[] beans) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ProfileCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ProfileCompletionProvider.java index 47d6860e4..37a004309 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ProfileCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ProfileCompletionProvider.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -39,7 +40,7 @@ public class ProfileCompletionProvider implements AnnotationAttributeCompletionP return findAllProfiles(beans) .distinct() - .collect(Collectors.toMap(key -> key, value -> value)); + .collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new)); } private Stream findAllProfiles(Bean[] beans) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/QualifierCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/QualifierCompletionProvider.java index bc6daf4f2..c51718df1 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/QualifierCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/QualifierCompletionProvider.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -41,7 +42,7 @@ public class QualifierCompletionProvider implements AnnotationAttributeCompletio findAllQualifiers(beans), Arrays.stream(beans).map(bean -> bean.getName())) .distinct() - .collect(Collectors.toMap(key -> key, value -> value)); + .collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new)); } private Stream findAllQualifiers(Bean[] beans) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ResourceCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ResourceCompletionProvider.java index d16f8b63b..b8a006fe6 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ResourceCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ResourceCompletionProvider.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; @@ -37,7 +38,7 @@ public class ResourceCompletionProvider implements AnnotationAttributeCompletion return Arrays.stream(beans).map(bean -> bean.getName()) .distinct() - .collect(Collectors.toMap(key -> key, value -> value)); + .collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new)); } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionalonresource/ConditionalOnResourceCompletionProcessor.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionalonresource/ConditionalOnResourceCompletionProcessor.java index 0fb39b9b2..9905ab524 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionalonresource/ConditionalOnResourceCompletionProcessor.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionalonresource/ConditionalOnResourceCompletionProcessor.java @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.boot.java.conditionalonresource; import java.nio.file.Paths; import java.util.Comparator; +import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; @@ -35,7 +36,7 @@ public class ConditionalOnResourceCompletionProcessor implements AnnotationAttri }) .map(r -> r.replaceAll("\\\\", "/")) .map(r -> "classpath:" + r) - .collect(Collectors.toMap(key -> key, value -> value)); + .collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new)); return resources; } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/cron/CronExpressionCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/cron/CronExpressionCompletionProvider.java index cc1994eb6..e521a29eb 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/cron/CronExpressionCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/cron/CronExpressionCompletionProvider.java @@ -11,11 +11,11 @@ public class CronExpressionCompletionProvider implements AnnotationAttributeComp private static final Map CRON_EXPRESSIONS_MAP = new LinkedHashMap<>(); static { - CRON_EXPRESSIONS_MAP.put("0 0 * * * 1-5", "every hour every day between Monday and Friday"); - CRON_EXPRESSIONS_MAP.put("0 */5 * * * *", "every 5 minutes"); - CRON_EXPRESSIONS_MAP.put("0 * * * * *", "every minute"); - CRON_EXPRESSIONS_MAP.put("0 0 */6 * * *", "every 6 hours at minute 0"); CRON_EXPRESSIONS_MAP.put("0 0 * * * *", "every hour"); + CRON_EXPRESSIONS_MAP.put("0 0 * * * 1-5", "every hour every day between Monday and Friday"); + CRON_EXPRESSIONS_MAP.put("0 * * * * *", "every minute"); + CRON_EXPRESSIONS_MAP.put("0 */5 * * * *", "every 5 minutes"); + CRON_EXPRESSIONS_MAP.put("0 0 */6 * * *", "every 6 hours at minute 0"); CRON_EXPRESSIONS_MAP.put("0 0 * * * SUN", "every hour at Sunday day"); CRON_EXPRESSIONS_MAP.put("0 0 0 * * *", "at 00:00"); CRON_EXPRESSIONS_MAP.put("0 0 0 * * SAT,SUN", "at 00:00 on Saturday and Sunday"); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/scope/ScopeCompletionProcessor.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/scope/ScopeCompletionProcessor.java index 8c1510743..fb11a9b7a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/scope/ScopeCompletionProcessor.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/scope/ScopeCompletionProcessor.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.scope; +import java.util.LinkedHashMap; import java.util.Map; import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider; @@ -20,15 +21,17 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; */ public class ScopeCompletionProcessor implements AnnotationAttributeCompletionProvider { - private static final Map SCOPE_COMPLETIONS = Map.of( - "application", "application", - "globalSession", "globalSession", - "prototype", "prototype", - "request", "request", - "session", "session", - "singleton", "singleton", - "websocket", "websocket" - ); + private static final Map SCOPE_COMPLETIONS = new LinkedHashMap<>(); + + static { + SCOPE_COMPLETIONS.put("application", "application"); + SCOPE_COMPLETIONS.put("globalSession", "globalSession"); + SCOPE_COMPLETIONS.put("prototype", "prototype"); + SCOPE_COMPLETIONS.put("request", "request"); + SCOPE_COMPLETIONS.put("session", "session"); + SCOPE_COMPLETIONS.put("singleton", "singleton"); + SCOPE_COMPLETIONS.put("websocket", "websocket"); + } @Override public Map getCompletionCandidates(IJavaProject project) {