@Override
  protected Pair<SectionField, Integer> parseSectionField(int lineNum, int sectionIndent, @NotNull FieldType kind) {
    final Substring line = getLine(lineNum);
    Substring namesPart, type = null, description = null;
    if (kind.canHaveBothNameAndType) {
      final List<Substring> colonSeparatedParts = splitByFirstColon(line);
      namesPart = colonSeparatedParts.get(0).trim();
      if (colonSeparatedParts.size() == 2) {
        type = colonSeparatedParts.get(1).trim();
      }
    }
    else {
      namesPart = line.trim();
    }
    if (kind.preferType && type == null) {
      type = namesPart;
      namesPart = null;
    }
    final List<Substring> names = new ArrayList<>();
    if (namesPart != null) {
      // Unlike Google code style, Numpydoc allows to list several parameter with same file together, e.g.
      // x1, x2 : array_like
      //     Input arrays, description of `x1`, `x2`.
      for (Substring name : namesPart.split(NAME_SEPARATOR)) {
        final Substring identifier = cleanUpName(name);
        if (!isValidName(identifier.toString())) {
          return Pair.create(null, lineNum);
        }
        names.add(identifier);
      }
    }
    if (namesPart == null && !isValidType(type.toString())) {
      return Pair.create(null, lineNum);
    }
    final Pair<List<Substring>, Integer> parsedDescription = parseFieldContinuation(lineNum, kind);
    final List<Substring> descriptionLines = parsedDescription.getFirst();
    if (!descriptionLines.isEmpty()) {
      description = descriptionLines.get(0).union(descriptionLines.get(descriptionLines.size() - 1));
    }
    return Pair.create(new SectionField(names, type, description != null ? description.trim() : null), parsedDescription.getSecond());
  }
@Override
  protected Pair<SectionField, Integer> parseSectionField(int lineNum, int sectionIndent, @NotNull FieldType kind)