@Nullable
  private static <T> T getCachedValue(PsiExpression expression, Key<T> key) {
    final T data = expression.getUserData(key);
    if (!(expression instanceof PsiBinaryExpression binaryExpression)) {
      return data;
    }
    final PsiExpression lhs = binaryExpression.getLOperand();
    T childData = null;
    if (lhs instanceof PsiBinaryExpression) {
      childData = lhs.getUserData(key);
    }
    if (childData == null) {
      final PsiExpression rhs = binaryExpression.getROperand();
      if (rhs instanceof PsiBinaryExpression) {
        childData = rhs.getUserData(key);
      }
    }
    if (childData != data) {
      expression.putUserData(key, childData);
    }
    return childData;
  }
@Nullable
  private static <T> T getCachedValue(PsiExpression expression, Key<T> key)