code: private static void collectDecorators(List<DecoratorAndOrder> list, List<Annotation> annotations) {
          if (annotations.isEmpty()) {
              return;
          }
  
          // Respect the order of decorators which is specified by a user. The first one is first applied
          // for most of the cases. But if @Decorator and user-defined decorators are specified in a mixed order,
          // the specified order and the applied order can be different. To overcome this problem, we introduce
          // "order" attribute to @Decorator annotation to sort decorators. If a user-defined decorator
          // annotation has "order" attribute, it will be also used for sorting.
          for (final Annotation annotation : annotations) {
              if (annotation instanceof Decorator) {
                  final Decorator d = (Decorator) annotation;
                  list.add(new DecoratorAndOrder(d, newDecorator(d), d.order()));
                  continue;
              }
  
              if (annotation instanceof Decorators) {
                  final Decorator[] decorators = ((Decorators) annotation).value();
                  for (final Decorator d : decorators) {
                      list.add(new DecoratorAndOrder(d, newDecorator(d), d.order()));
                  }
                  continue;
              }
  
              DecoratorAndOrder udd = userDefinedDecorator(annotation);
              if (udd != null) {
                  list.add(udd);
                  continue;
              }
  
              // If user-defined decorators are repeatable and they are specified more than once.
              try {
                  final Method method = Iterables.getFirst(getMethods(annotation.annotationType(),
                                                                      withName("value")), null);
                  assert method != null : "No 'value' method is found from " + annotation;
                  final Annotation[] decorators = (Annotation[]) method.invoke(annotation);
                  for (final Annotation decorator : decorators) {
                      udd = userDefinedDecorator(decorator);
                      if (udd == null) {
                          break;
                      }
                      list.add(udd);
                  }
              } catch (Throwable ignore) {
                  // The annotation may be a container of a decorator or may be not, so we just ignore
                  // any exception from this clause.
              }
          }
      }
docs: Adds decorators to the specified {@code list}. Decorators which are annotated with {@link Decorator}
  and user-defined decorators will be collected.