code: 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;
  	}
docs: 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.