/**
  * Returns true if the method is a provider.
  *
  * <p>Synthetic bridge methods are excluded. Starting with JDK 8, javac copies annotations onto
  * bridge methods (which always have erased signatures).
  */
 private Optional<Annotation> isProvider(Binder binder, Method method) {
   if (method.isBridge() || method.isSynthetic()) {
     return Optional.absent();
   }
   Annotation annotation = null;
   for (Class<? extends Annotation> annotationClass : scanner.annotationClasses()) {
     Annotation foundAnnotation = method.getAnnotation(annotationClass);
     if (foundAnnotation != null) {
       if (annotation != null) {
         binder.addError(
             "More than one annotation claimed by %s on method %s."
                 + " Methods can only have one annotation claimed per scanner.",
             scanner, method);
         return Optional.absent();
       }
       annotation = foundAnnotation;
     }
   }
   return Optional.fromNullable(annotation);
 }
  private <T> ProviderMethod<T> createProviderMethod(
      Binder binder, Method method, Annotation annotation) {
    binder = binder.withSource(method);
    Errors errors = new Errors(method);

    // prepare the parameter providers
    InjectionPoint point = InjectionPoint.forMethod(method, typeLiteral);
    List<Dependency<?>> dependencies = point.getDependencies();
    List<Provider<?>> parameterProviders = Lists.newArrayList();
    for (Dependency<?> dependency : point.getDependencies()) {
      parameterProviders.add(binder.getProvider(dependency));
    }

    @SuppressWarnings("unchecked") // Define T as the method's return type.
    TypeLiteral<T> returnType = (TypeLiteral<T>) typeLiteral.getReturnType(method);
    Key<T> key = getKey(errors, returnType, method, method.getAnnotations());
    try {
      key = scanner.prepareMethod(binder, annotation, key, point);
    } catch (Throwable t) {
      binder.addError(t);
    }
    Class<? extends Annotation> scopeAnnotation =
        Annotations.findScopeAnnotation(errors, method.getAnnotations());
    for (Message message : errors.getMessages()) {
      binder.addError(message);
    }
    return ProviderMethod.create(
        key,
        method,
        delegate,
        ImmutableSet.copyOf(dependencies),
        parameterProviders,
        scopeAnnotation,
        skipFastClassGeneration,
        annotation);
  }