private List<ParameterDescription> getParameterDescriptions(MethodTarget methodTarget) { return Utils.createMethodParameters(methodTarget.getMethod()) .flatMap(mp -> parameterResolvers.stream().filter(pr -> pr.supports(mp)).limit(1L) .flatMap(pr -> pr.describe(mp))) .collect(Collectors.toList()); }
/** * Verifies that we have at least one {@link ParameterResolver} that supports each of the * {@link MethodParameter}s in the method. */ private void validateParameterResolvers(MethodTarget methodTarget) { Utils.createMethodParameters(methodTarget.getMethod()) .forEach(parameter -> { parameterResolvers.stream() .filter(resolver -> resolver.supports(parameter)) .findFirst() .orElseThrow(() -> new ParameterResolverMissingException(parameter)); }); }
private void validateArgs(Object[] args, MethodTarget methodTarget) { for (int i = 0; i < args.length; i++) { if (args[i] == UNRESOLVED) { MethodParameter methodParameter = Utils.createMethodParameter(methodTarget.getMethod(), i); throw new IllegalStateException("Could not resolve " + methodParameter); } } Set<ConstraintViolation<Object>> constraintViolations = validator.forExecutables().validateParameters( methodTarget.getBean(), methodTarget.getMethod(), args); if (constraintViolations.size() > 0) { throw new ParameterValidationException(constraintViolations, methodTarget); } }
/** * Gather completion proposals given some (incomplete) input the user has already typed * in. When and how this method is invoked is implementation specific and decided by the * actual user interface. */ public List<CompletionProposal> complete(CompletionContext context) { String prefix = context.upToCursor(); List<CompletionProposal> candidates = new ArrayList<>(); candidates.addAll(commandsStartingWith(prefix)); String best = findLongestCommand(prefix); if (best != null) { CompletionContext argsContext = context.drop(best.split(" ").length); // Try to complete arguments MethodTarget methodTarget = methodTargets.get(best); Method method = methodTarget.getMethod(); List<MethodParameter> parameters = Utils.createMethodParameters(method).collect(Collectors.toList()); for (ParameterResolver resolver : parameterResolvers) { for (int index = 0; index < parameters.size(); index++) { MethodParameter parameter = parameters.get(index); if (resolver.supports(parameter)) { resolver.complete(parameter, argsContext).stream().forEach(candidates::add); } } } } return candidates; }
.findFirst(); MethodParameter methodParameter = Utils.createMethodParameter(result.getMethodTarget().getMethod(), parameterIndex.get()); List<ParameterDescription> descriptions = findParameterResolver(methodParameter)
if (availability.isAvailable()) { List<String> wordsForArgs = wordsForArguments(command, words); Method method = methodTarget.getMethod();