docs: public void visitClass(ClassNode classNode) {
          try {
              this.classNode = classNode;
              this.internalClassName = BytecodeHelper.getClassInternalName(classNode);
  
              //System.out.println("Generating class: " + classNode.getName());
  
              this.internalBaseClassName = BytecodeHelper.getClassInternalName(classNode.getSuperClass());
  
              cv.visit(
                      Opcodes.V1_3,
                      classNode.getModifiers(),
                      internalClassName,
                      (String) null,
                      internalBaseClassName,
                      BytecodeHelper.getClassInternalNames(classNode.getInterfaces())
              );
  
              classNode.visitContents(this);
  
              for (Iterator iter = innerClasses.iterator(); iter.hasNext();) {
                  ClassNode innerClass = (ClassNode) iter.next();
                  ClassNode innerClassType = innerClass;
                  String innerClassInternalName = BytecodeHelper.getClassInternalName(innerClassType);
                  String outerClassName = internalClassName; // default for inner classes
                  MethodNode enclosingMethod = innerClass.getEnclosingMethod();
                  if (enclosingMethod != null) {
                      // local inner classes do not specify the outer class name
                      outerClassName = null;
                  }
                  cv.visitInnerClass(
                          innerClassInternalName,
                          outerClassName,
                          innerClassType.getName(),
                          innerClass.getModifiers());
              }
              cv.visitEnd();
          }
          catch (GroovyRuntimeException e) {
              e.setModule(classNode.getModule());
              throw e;
          }
      }