@Override protected Iterable<? extends ProcessingStep> initSteps() { Filer filer = new FormattingFiler(processingEnv.getFiler()); Messager messager = processingEnv.getMessager(); Elements elements = processingEnv.getElementUtils(); Types types = processingEnv.getTypeUtils(); AndroidInjectKeyFinder keyFinder = new AndroidInjectKeyFinder(elements, messager); return ImmutableList.of( keyFinder, new AndroidMapKeyValidator(elements, types, messager), new ContributesAndroidInjectorGenerator( filer, new AndroidInjectorDescriptor.Validator(types, messager, keyFinder))); }
AndroidInjectKeyFinder(Elements elements, Messager messager) { this.elements = elements; this.messager = messager; // collect all dagger supported types Stream.of( elements.getPackageElement("dagger.android"), elements.getPackageElement("dagger.android.support")) .filter(packageElement -> packageElement != null) .flatMap(packageElement -> typesIn(packageElement.getEnclosedElements()).stream()) .filter(type -> isAnnotationPresent(type, MapKey.class)) .filter(mapKey -> mapKey.getAnnotation(MapKey.class).unwrapValue()) .flatMap(AndroidInjectKeyFinder::classForAnnotationElement) .map(key -> elements.getTypeElement(key.getCanonicalName()).asType()) .forEach(typeMirror -> daggerSupportedTypes.put(typeMirror, mapKeyValue(typeMirror, elements))); annotationsAndTypes.putAll(daggerSupportedTypes); }
keyFinder.annotationsAndTypes() .entrySet() .stream()
@Override public Set<Element> process(SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation) { for (Map.Entry<Class<? extends Annotation>, Element> entry : elementsByAnnotation.entries()) { AnnotationMirror annotation = getAnnotationMirror(entry.getValue(), AndroidInjectorKeyRegistry.class).get(); for (TypeMirror mapKey : getAnnotationValue(annotation, "keys").accept(new Util.AllTypesVisitor(), null)) { if (daggerSupportedTypes.containsKey(mapKey)) { messager.printMessage(Diagnostic.Kind.ERROR, String.format("%s is automatically supported", mapKey)); } if (isAnnotationPresent(MoreTypes.asElement(mapKey), MapKey.class)) { TypeMirror mapKeyValue = mapKeyValue(mapKey, elements); annotationsAndTypes.put(mapKey, mapKeyValue); } else { messager.printMessage(Diagnostic.Kind.ERROR, String.format("%s is not a @MapKey", mapKey), entry.getValue()); } } } return ImmutableSet.of(); }