private void buildMixins(RoundEnvironment roundEnv, IFactory factory, Map<Element, CommandSpec> mixinsDeclared, List<MixinInfo> mixinInfoList, Map<TypeMirror, List<CommandSpec>> commandTypes, Map<Element, OptionSpec.Builder> options, Map<Element, PositionalParamSpec.Builder> parameters) { Set<? extends Element> explicitMixins = roundEnv.getElementsAnnotatedWith(Mixin.class); for (Element element : explicitMixins) { if (element.asType().getKind() != TypeKind.DECLARED) { error(element, "@Mixin must have a declared type, not %s", element.asType()); continue; } TypeElement type = (TypeElement) ((DeclaredType) element.asType()).asElement(); CommandSpec mixin = buildCommand(type, factory, mixinsDeclared, commandTypes, options, parameters); logger.fine("Built mixin: " + mixin + " from " + element); if (EnumSet.of(ElementKind.FIELD, ElementKind.PARAMETER).contains(element.getKind())) { VariableElement variableElement = (VariableElement) element; String name = element.getAnnotation(Mixin.class).name(); if (name.length() == 0) { name = variableElement.getSimpleName().toString(); } Element targetType = element.getEnclosingElement(); CommandSpec mixee = buildCommand(targetType, factory, mixinsDeclared, commandTypes, options, parameters); mixinInfoList.add(new MixinInfo(mixee, name, mixin)); logger.fine("Mixin name=" + name + ", target command=" + mixee.userObject()); } } }
@Command void withMixin(@Mixin SomeMixin mixin) { }
@Command void posAndOptAndMixin(int[] x, @Option(names = "-y") String[] y, @Mixin SomeMixin mixin) { }
@Command void posAndMixin(int[] x, @Mixin SomeMixin mixin) { }
@Command void mixinFirst(@Mixin SomeMixin mixin, int[] x, @Option(names = "-y") String[] y) { } }
String mixinName() { String annotationName = getAnnotation(Mixin.class).name(); return empty(annotationName) ? name() : annotationName; }
static class Issue439Command { @Mixin Issue439Mixin mixin; @Spec CommandSpec spec; @Option(names = "--raptor") void setRaptorFences(final String value) { throw new ParameterException(spec.commandLine(), "RAPTOR error"); } }
@Command static class AnnotatedClassWithMixinParameters { @Mixin SomeMixin mixin; @Command(name="sum") long sum(@Option(names = "-y") String[] y, @Mixin SomeMixin subMixin, int[] x) { return mixin.a + mixin.b + y.length + subMixin.a + subMixin.b + x.length; } }
@Command(name="sum") long sum(@Option(names = "-a") int a, @Mixin EmptyMixin mixin) { return a; } }
@Command(name="sum") long sum(@Option(names = "-y") String[] y, @Mixin SomeMixin subMixin, int[] x) { return mixin.a + mixin.b + y.length + subMixin.a + subMixin.b + x.length; } }
@Command(name="sum") long sum(@Option(names = "-y") String[] y, @Mixin SomeMixin subMixin, int[] x) { return y.length + subMixin.a + subMixin.b + x.length; } }
List<String> unmatched; @Mixin Object mixin;
CommandSpec spec; @Mixin ExampleMixin mixin;
@Command(name = "mixee", description = "This command has a footer and an option mixed in") public class CommandWithMixin { @Mixin CommonOption commonOption = new CommonOption(); @Option(names = "-y", description = "command option") int y; @Command public void doit(@Mixin CommonOption commonOptionParam, @Option(names = "-z") int z, @Parameters String arg0, String arg1) {} public static void main(String[] args) { CommandWithMixin cmd = new CommandWithMixin(); new CommandLine(cmd).parseArgs("-x", "3", "-y", "4"); System.out.printf("x=%s, y=%s%n", cmd.commonOption.x, cmd.y); } }
@Command void posAndOptAndMixin(int[] x, @Option(names = "-y") String[] y, @Mixin SomeMixin mixin) { }
@Command void posAndMixin(int[] x, @Mixin SomeMixin mixin) { }
public String getMixinName() { String annotationName = getAnnotation(Mixin.class).name(); return empty(annotationName) ? getName() : annotationName; }
@Command void withMixin(@Mixin SomeMixin mixin) { }
static class Issue439Command { @Mixin Issue439Mixin mixin; @Spec CommandSpec spec; @Option(names = "--raptor") void setRaptorFences(final String value) { throw new ParameterException(spec.commandLine(), "RAPTOR error"); } }