@Override
  public @NotNull @Nls String getAdvancedInformationHint(@NotNull PsiElement element) {
    PsiExpression expression = null;
    PsiVariable psiVariable = getPossibleLocaleVariable(element);
    if (psiVariable != null) {
      expression = psiVariable.getInitializer();
    }
    else if (element instanceof PsiExpression psiExpression) {
      expression = psiExpression;
    }
    expression = PsiUtil.skipParenthesizedExprDown(expression);
    if (expression == null) return getInformationHint(element);
    CommonDataflow.DataflowResult result = CommonDataflow.getDataflowResult(expression);
    List<Pair<@Nls String, @Nls String>> infoLines = new ArrayList<>();
    String basicType = getTypePresentation(expression);
    if (result != null) {
      DfType dfType = result.getDfType(expression);
      PsiType type = expression.getType();
      Set<Object> values = result.getExpressionValues(expression);
      if (!values.isEmpty()) {
        infoLines.add(Pair.create(
          JavaBundle.message("type.information.value"),
          StreamEx.of(values).map(DfaPsiUtil::renderValue).sorted().collect(NlsMessages.joiningOr())));
      }
      else {
        if (dfType instanceof DfAntiConstantType) {
          List<Object> nonValues = new ArrayList<>(((DfAntiConstantType<?>)dfType).getNotValues());
          nonValues.remove(null); // Nullability: not-null will be displayed, so this just duplicates nullability info
          if (!nonValues.isEmpty()) {
            infoLines.add(Pair.create(
              JavaBundle.message("type.information.not.equal.to"),
              StreamEx.of(nonValues).map(DfaPsiUtil::renderValue).sorted().collect(NlsMessages.joiningNarrowAnd())));
          }
        }
        if (dfType instanceof DfIntegralType) {
          String rangeText = JvmPsiRangeSetUtil.getPresentationText(((DfIntegralType)dfType).getRange(), type);
          if (!rangeText.equals(InspectionsBundle.message("long.range.set.presentation.any"))) {
            infoLines.add(Pair.create(JavaBundle.message("type.information.range"), rangeText));
          }
        }
        else if (dfType instanceof DfFloatingPointType && !(dfType instanceof DfConstantType)) {
          String presentation = dfType.toString().replaceFirst("^(double|float) ?", ""); //NON-NLS
          if (!presentation.isEmpty()) {
            infoLines.add(Pair.create(JavaBundle.message("type.information.range"), presentation));
          }
        }
        else if (dfType instanceof DfReferenceType refType) {
          infoLines.add(Pair.create(JavaBundle.message("type.information.nullability"), refType.getNullability().getPresentationName()));
          infoLines.add(Pair.create(JavaBundle.message("type.information.constraints"), refType.getConstraint().getPresentationText(type)));
          if (refType.getMutability() != Mutability.UNKNOWN) {
            infoLines.add(Pair.create(JavaBundle.message("type.information.mutability"), refType.getMutability().getPresentationName()));
          }
          infoLines.add(Pair.create(JavaBundle.message("type.information.locality"),
                                    refType.isLocal() ? JavaBundle.message("type.information.local.object") : ""));
          SpecialField field = refType.getSpecialField();
          // ENUM_ORDINAL is not precise enough yet, and could be confusing for users
          if (field != null && field != SpecialField.ENUM_ORDINAL) {
            infoLines.add(Pair.create(field.getPresentationName(), field.getPresentationText(refType.getSpecialFieldType(), type)));
          }
        }
      }
    }
    infoLines.removeIf(pair -> pair.getSecond().isEmpty());
    if (!infoLines.isEmpty()) {
      infoLines.add(0, Pair.create(JavaBundle.message("type.information.type"), basicType));
      HtmlChunk[] rows = ContainerUtil.map2Array(infoLines, HtmlChunk.class, pair -> makeHtmlRow(pair.getFirst(), pair.getSecond()));
      return HtmlChunk.tag("table").children(rows).toString();
    }
    return basicType;
  }
@Override
  public @NotNull @Nls String getAdvancedInformationHint(@NotNull PsiElement element)