private @NotNull NamesByExprInfo suggestVariableNameByExpression(@NotNull PsiExpression expr, @Nullable VariableKind variableKind) {
    List<String> fromLiteral = ExpressionUtils.nonStructuralChildren(expr)
      .map(e -> e instanceof PsiLiteralExpression literal && literal.getValue() instanceof String str ? str : null)
      .filter(Objects::nonNull)
      .flatMap(literal -> LiteralNameSuggester.literalNames(literal).stream())
      .distinct()
      .toList();
    final LinkedHashSet<String> names = new LinkedHashSet<>(fromLiteral);
    ContainerUtil.addIfNotNull(names, suggestVariableNameFromConstant(expr, variableKind));
    ContainerUtil.addIfNotNull(names, suggestVariableNameFromLiterals(expr));

    NamesByExprInfo byExpr = suggestVariableNameByExpressionOnly(expr, variableKind, false);
    NamesByExprInfo byExprPlace = suggestVariableNameByExpressionPlace(expr, variableKind);
    NamesByExprInfo byExprAllMethods = suggestVariableNameByExpressionOnly(expr, variableKind, true);

    names.addAll(byExpr.names);
    names.addAll(byExprPlace.names);

    PsiType type = expr.getType();
    if (type != null && variableKind != null) {
      names.addAll(doSuggestNamesByType(type, variableKind));
    }
    names.addAll(byExprAllMethods.names);

    String propertyName = byExpr.propertyName != null ? byExpr.propertyName : byExprPlace.propertyName;
    return new NamesByExprInfo(propertyName, names);
  }
private @NotNull NamesByExprInfo suggestVariableNameByExpression(@NotNull PsiExpression expr, @Nullable VariableKind variableKind)