docs: static ClassTypeSignature parse(final String typeDescriptor, final ClassInfo classInfo) throws ParseException {
          final Parser parser = new Parser(typeDescriptor);
          // The defining class name is used to resolve type variables using the defining class' type descriptor.
          // But here we are parsing the defining class' type descriptor, so it can't contain variables that
          // point to itself => just use null as the defining class name.
          final String definingClassNameNull = null;
          final List<TypeParameter> typeParameters = TypeParameter.parseList(parser, definingClassNameNull);
          final ClassRefTypeSignature superclassSignature = ClassRefTypeSignature.parse(parser,
                  definingClassNameNull);
          List<ClassRefTypeSignature> superinterfaceSignatures;
          if (parser.hasMore()) {
              superinterfaceSignatures = new ArrayList<>();
              while (parser.hasMore()) {
                  final ClassRefTypeSignature superinterfaceSignature = ClassRefTypeSignature.parse(parser,
                          definingClassNameNull);
                  if (superinterfaceSignature == null) {
                      throw new ParseException(parser, "Could not parse superinterface signature");
                  }
                  superinterfaceSignatures.add(superinterfaceSignature);
              }
          } else {
              superinterfaceSignatures = Collections.emptyList();
          }
          if (parser.hasMore()) {
              throw new ParseException(parser, "Extra characters at end of type descriptor");
          }
          return new ClassTypeSignature(classInfo, typeParameters, superclassSignature, superinterfaceSignatures);
      }