docs: static List<TypeParameter> parseList(final Parser parser, final String definingClassName)
              throws ParseException {
          if (parser.peek() != '<') {
              return Collections.emptyList();
          }
          parser.expect('<');
          final List<TypeParameter> typeParams = new ArrayList<>(1);
          while (parser.peek() != '>') {
              if (!parser.hasMore()) {
                  throw new ParseException(parser, "Missing '>'");
              }
              if (!TypeUtils.getIdentifierToken(parser)) {
                  throw new ParseException(parser, "Could not parse identifier token");
              }
              final String identifier = parser.currToken();
              // classBound may be null
              final ReferenceTypeSignature classBound = ReferenceTypeSignature.parseClassBound(parser,
                      definingClassName);
              List<ReferenceTypeSignature> interfaceBounds;
              if (parser.peek() == ':') {
                  interfaceBounds = new ArrayList<>();
                  while (parser.peek() == ':') {
                      parser.expect(':');
                      final ReferenceTypeSignature interfaceTypeSignature = ReferenceTypeSignature
                              .parseReferenceTypeSignature(parser, definingClassName);
                      if (interfaceTypeSignature == null) {
                          throw new ParseException(parser, "Missing interface type signature");
                      }
                      interfaceBounds.add(interfaceTypeSignature);
                  }
              } else {
                  interfaceBounds = Collections.emptyList();
              }
              typeParams.add(new TypeParameter(identifier, classBound, interfaceBounds));
          }
          parser.expect('>');
          return typeParams;
      }