docs: private void visitAnnotationAttributes(AnnotationNode an, AnnotationVisitor av) {
          Map<String, Object> constantAttrs = new HashMap<String, Object>();
          Map<String, PropertyExpression> enumAttrs = new HashMap<String, PropertyExpression>();
          Map<String, Object> atAttrs = new HashMap<String, Object>();
          Map<String, ListExpression> arrayAttrs = new HashMap<String, ListExpression>();
  
          for (String name : an.getMembers().keySet()) {
              Expression expr = an.getMember(name);
              if (expr instanceof AnnotationConstantExpression) {
                  atAttrs.put(name, ((AnnotationConstantExpression) expr).getValue());
              } else if (expr instanceof ConstantExpression) {
                  constantAttrs.put(name, ((ConstantExpression) expr).getValue());
              } else if (expr instanceof ClassExpression) {
                  constantAttrs.put(name,
                          Type.getType(BytecodeHelper.getTypeDescription((expr.getType()))));
              } else if (expr instanceof PropertyExpression) {
                  enumAttrs.put(name, (PropertyExpression) expr);
              } else if (expr instanceof ListExpression) {
                  arrayAttrs.put(name, (ListExpression) expr);
              } else if (expr instanceof ClosureExpression) {
                  ClassNode closureClass = controller.getClosureWriter().getOrAddClosureClass((ClosureExpression) expr, ACC_PUBLIC);
                  constantAttrs.put(name,
                          Type.getType(BytecodeHelper.getTypeDescription(closureClass)));
              }
          }
  
          for (Map.Entry entry : constantAttrs.entrySet()) {
              av.visit((String) entry.getKey(), entry.getValue());
          }
          for (Map.Entry entry : enumAttrs.entrySet()) {
              PropertyExpression propExp = (PropertyExpression) entry.getValue();
              av.visitEnum((String) entry.getKey(),
                      BytecodeHelper.getTypeDescription(propExp.getObjectExpression().getType()),
                      String.valueOf(((ConstantExpression) propExp.getProperty()).getValue()));
          }
          for (Map.Entry entry : atAttrs.entrySet()) {
              AnnotationNode atNode = (AnnotationNode) entry.getValue();
              AnnotationVisitor av2 = av.visitAnnotation((String) entry.getKey(),
                      BytecodeHelper.getTypeDescription(atNode.getClassNode()));
              visitAnnotationAttributes(atNode, av2);
              av2.visitEnd();
          }
          visitArrayAttributes(an, arrayAttrs, av);
      }