From efd9e24100fdf8f2c287b03ad520daea639c0d32 Mon Sep 17 00:00:00 2001 From: Eric Bottard Date: Tue, 29 Aug 2017 16:30:01 +0200 Subject: [PATCH] Fix completion on unfinished values Fixes #143 --- .../standard/StandardParameterResolver.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardParameterResolver.java b/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardParameterResolver.java index aa011891..17ad5dba 100644 --- a/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardParameterResolver.java +++ b/spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardParameterResolver.java @@ -114,7 +114,8 @@ public class StandardParameterResolver implements ParameterResolver { List words = wordsBuffer.stream().filter(w -> !w.isEmpty()).collect(Collectors.toList()); - CacheKey cacheKey = new CacheKey(methodParameter.getMethod(), words); + CacheKey cacheKey = new CacheKey(methodParameter.getMethod(), wordsBuffer); + parameterCache.clear(); Map resolved = parameterCache.computeIfAbsent(cacheKey, (k) -> { Map result = new HashMap<>(); @@ -308,16 +309,21 @@ public class StandardParameterResolver implements ParameterResolver { arity = getArity(parameter); parameterRawValue = parameterCache.get(cacheKey).get(parameter); set = parameterRawValue.explicit; - } - catch (ParameterMissingResolutionException e) { + } catch (ParameterMissingResolutionException e) { set = false; - } - catch (Exception e) { + } catch (UnfinishedParameterResolutionException e) { + if (e.getParameterDescription().parameter().equals(methodParameter)) { + unfinished = e; + set = false; + } else { + return Collections.emptyList(); + } + } catch (Exception e) { unfinished = e; set = false; // Most likely what is already typed would fail resolution (eg type conversion failure) // Exit early and let other parameters have a chance at being proposed - //return Collections.emptyList(); + return Collections.emptyList(); } // There are 4 possible cases: @@ -344,8 +350,10 @@ public class StandardParameterResolver implements ParameterResolver { // We're done already return result; } - // Case 4 - result.addAll(valueCompletions(methodParameter, context)); + if (!context.currentWord().equals("")) { + // Case 4 + result.addAll(valueCompletions(methodParameter, context)); + } if (parameterRawValue.positional()) { // Case 4.1: There exists "--command foo" and user has typed "--comm" which (wrongly) got resolved as a positional param