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(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) {
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) {
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) {
private Builder(IAnnotatedElement member, IFactory factory) { super(member.getAnnotation(Parameters.class), member, factory); index = Range.parameterIndex(member); capacity = Range.parameterCapacity(member); } /** Returns a valid {@code PositionalParamSpec} instance. */
private static Range parameterIndex(IAnnotatedElement member) { if (member.isAnnotationPresent(Parameters.class)) { Range result = Range.valueOf(member.getAnnotation(Parameters.class).index()); if (!result.isUnspecified) { return result; } } if (member.isMethodParameter()) { int min = member.getMethodParamPosition(); int max = member.isMultiValue() ? Integer.MAX_VALUE : min; return new Range(min, max, member.isMultiValue(), false, ""); } return Range.valueOf("*"); // the default } static Range adjustForType(Range result, IAnnotatedElement member) {
private Builder(IAnnotatedElement member, IFactory factory) { super(member.getAnnotation(Option.class), member, factory); Option option = member.getAnnotation(Option.class); names = option.names(); help = option.help(); usageHelp = option.usageHelp(); versionHelp = option.versionHelp(); order = option.order(); }
private static Range parameterArity(IAnnotatedElement member) { if (member.isAnnotationPresent(Parameters.class)) { return adjustForType(Range.valueOf(member.getAnnotation(Parameters.class).arity()), member); } else { return member.isMethodParameter() ? adjustForType(Range.valueOf(""), member) : new Range(0, 0, false, true, "0"); } } /** Returns a new {@code Range} based on the {@link Parameters#index()} annotation on the specified field.
private static void validateUnmatched(IAnnotatedElement member) { if (member.isUnmatched() && member.isArgSpec()) { throw new DuplicateOptionAnnotationsException("A member cannot have both @Unmatched and @Option or @Parameters annotations, but '" + member + "' has both."); } } private static void validateArgSpecField(TypedMember member) {
private static Range optionArity(IAnnotatedElement member) { return member.isAnnotationPresent(Option.class) ? adjustForType(Range.valueOf(member.getAnnotation(Option.class).arity()), member) : new Range(0, 0, false, true, "0"); } /** Returns a new {@code Range} based on the {@link Parameters#arity()} annotation on the specified field,
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) {