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());
}
}
}