@Nullable
  private static LinkedHashMap<String, Optional<String>> resolveCollectionsNTFields(@NotNull PyCallExpression callExpression) {
    // SUPPORTED CASES:

    // fields = ["x", "y"]
    // Point = namedtuple(..., fields)

    // Point = namedtuple(..., field_names=["x", "y"])

    // Point = namedtuple(..., "x y")

    // Point = namedtuple(..., ("x y"))

    // Point = namedtuple(..., "x, y")

    // Point = namedtuple(..., ["x", "y"])

    final PyExpression fields = getFieldsArgumentValue(callExpression, "field_names");

    final PyExpression resolvedFields = fields instanceof PyReferenceExpression
                                        ? PyResolveUtil.fullResolveLocally((PyReferenceExpression)fields)
                                        : fields;

    final Collector<String, ?, LinkedHashMap<String, Optional<String>>> toFieldsOfUnknownType =
      Collectors.toMap(Function.identity(), key -> Optional.empty(), (v1, v2) -> v2, LinkedHashMap::new);

    final List<String> listValue = PyUtil.strListValue(resolvedFields);
    if (listValue != null) return listValue.contains(null) ? null : StreamEx.of(listValue).collect(toFieldsOfUnknownType);

    final String resolvedFieldsValue = PyPsiUtils.strValue(resolvedFields);
    if (resolvedFieldsValue == null) return null;

    return StreamEx
      .of(StringUtil.tokenize(resolvedFieldsValue, ", ").iterator())
      .collect(toFieldsOfUnknownType);
  }
@Nullable
  private static LinkedHashMap<String, Optional<String>> resolveCollectionsNTFields(@NotNull PyCallExpression callExpression)