private static UnmatchedArgsBinding buildUnmatchedForField(final IAnnotatedElement member) { ITypeInfo info = member.getTypeInfo(); if (!(info.getClassName().equals(String[].class.getName()) || (info.isCollection() && info.getActualGenericTypeArguments().equals(Arrays.asList(String.class.getName()))))) { throw new InitializationException("Invalid type for " + member + ": must be either String[] or List<String>"); } if (info.getClassName().equals(String[].class.getName())) { return UnmatchedArgsBinding.forStringArrayConsumer(member.setter()); } else { return UnmatchedArgsBinding.forStringCollectionSupplier(new IGetter() { @SuppressWarnings("unchecked") public <T> T get() throws Exception { List<String> result = (List<String>) member.getter().get(); if (result == null) { result = new ArrayList<String>(); member.setter().set(result); } return (T) result; } }); } } }
private static Range defaultArity(IAnnotatedElement member) { ITypeInfo info = member.getTypeInfo(); if (member.isAnnotationPresent(Option.class)) { boolean zeroArgs = info.isBoolean() || (info.isMultiValue() && info.getAuxiliaryTypeInfos().get(0).isBoolean()); return zeroArgs ? Range.valueOf("0").unspecified(true) : Range.valueOf("1").unspecified(true); } if (info.isMultiValue()) { return Range.valueOf("0..1").unspecified(true); } return Range.valueOf("1").unspecified(true);// for single-valued fields (incl. boolean positional parameters) } /** Returns the default arity {@code Range} for {@link Option options}: booleans have arity 0, other types have arity 1.
Builder(Option option, IAnnotatedElement source, IFactory factory) { this(source); arity = Range.optionArity(source); required = option.required(); paramLabel = inferLabel(option.paramLabel(), source.getName(), source.getTypeInfo()); hideParamSyntax = option.hideParamSyntax(); interactive = option.interactive(); description = option.description(); descriptionKey = option.descriptionKey(); splitRegex = option.split(); hidden = option.hidden(); defaultValue = option.defaultValue(); showDefaultValue = option.showDefaultValue(); if (factory != null) { converters = DefaultFactory.createConverter(factory, option.converter()); if (!NoCompletionCandidates.class.equals(option.completionCandidates())) { completionCandidates = DefaultFactory.createCompletionCandidates(factory, option.completionCandidates()); } } } Builder(Parameters parameters, IAnnotatedElement source, IFactory factory) {
Builder(Parameters parameters, IAnnotatedElement source, IFactory factory) { this(source); arity = Range.parameterArity(source); required = arity.min > 0; // method parameters may be positional parameters without @Parameters annotation if (parameters == null) { paramLabel = inferLabel(null, source.getName(), source.getTypeInfo()); } else { paramLabel = inferLabel(parameters.paramLabel(), source.getName(), source.getTypeInfo()); hideParamSyntax = parameters.hideParamSyntax(); interactive = parameters.interactive(); description = parameters.description(); descriptionKey = parameters.descriptionKey(); splitRegex = parameters.split(); hidden = parameters.hidden(); defaultValue = parameters.defaultValue(); showDefaultValue = parameters.showDefaultValue(); if (factory != null) { // annotation processors will pass a null factory converters = DefaultFactory.createConverter(factory, parameters.converter()); if (!NoCompletionCandidates.class.equals(parameters.completionCandidates())) { completionCandidates = DefaultFactory.createCompletionCandidates(factory, parameters.completionCandidates()); } } } } private static String inferLabel(String label, String fieldName, ITypeInfo typeInfo) {
private static CommandSpec buildMixinForField(IAnnotatedElement member, IFactory factory) { try { Object userObject = member.getter().get(); if (userObject == null) { userObject = factory.create(member.getTypeInfo().getType()); member.setter().set(userObject); } CommandSpec result = CommandSpec.forAnnotatedObject(userObject, factory); return result.withToString(member.getToString()); } catch (InitializationException ex) { throw ex; } catch (Exception ex) { throw new InitializationException("Could not access or modify mixin member " + member + ": " + ex, ex); } } private static UnmatchedArgsBinding buildUnmatchedForField(final IAnnotatedElement member) {
Builder(IAnnotatedElement source) { userObject = source.userObject(); setTypeInfo(source.getTypeInfo()); toString = source.getToString(); getter = source.getter(); setter = source.setter(); hasInitialValue = source.hasInitialValue(); try { initialValue = source.getter().get(); } catch (Exception ex) { initialValue = null; } } Builder(Option option, IAnnotatedElement source, IFactory factory) {