Jshint: Тернарный разрыв строки

Созданный на 5 июл. 2015  ·  19Комментарии  ·  Источник: jshint/jshint

var a = (tern)
    ? b
    : c;

Этот код выдает предупреждение: Bad line breaking before '?'.

Управление потоком jshint:

Сначала поймайте "?" токен, а затем передать его функции выражения

  infix("?", function(left, that) {
    increaseComplexityCount();
    that.left = left;
    that.right = expression(10);
    advance(":");
    that["else"] = expression(10);
    return that;
  }, 30);

Выражение функции содержит эту логику рядом с его началом

    var isDangerous =
      state.option.asi &&
      state.tokens.prev.line !== startLine(state.tokens.curr) &&
      _.contains(["]", ")"], state.tokens.prev.id) &&
      _.contains(["[", "("], state.tokens.curr.id);

    if (isDangerous)
      warning("W014", state.tokens.curr, state.tokens.curr.id);

Похоже, что код JSHint неправильно улавливает разрыв строки между ")" и "?" в своей логике ASI. ASI не должен применяться в этом случае. Разбиение тройки на несколько строк облегчает чтение кода. Пример:

var a = (tern1 > 0)
        ? b
        : (tern2 > x)
            ? c
            : d,
    e = 1;
Needs Discussion P1

Самый полезный комментарий

@prettydiff
это проходит

/* jshint laxbreak: true */
var a = (tern)
    ? b
    : c;

Итак, просто включите эту опцию, чтобы не получать предупреждения.

laxbreak будет удален в ближайшее время. это проблема, поднятая для его удаления - # 1867

Все 19 Комментарий

почему вы все еще используете JSHint, а не только JSLint, который намного лучше?

@ kaizer200 JSHint — гораздо более часто используемый инструмент. Моя цель состоит в том, чтобы как можно точнее добиться соответствия настройкам по умолчанию обоих. Таким образом, я могу точно представить любое желание пользователя соответствовать любому инструменту с наименьшими возможными настройками.

Я думаю, что это нужно, так как есть этот тест:

code = [ 'var a = b ', '? c : d;' ];
TestRun(test)
  .addError(2, "Bad line breaking before '?'.")
  .test(code, { es3: true });

( tests/unit/options.js , строка 1583)

Тот факт, что есть тест, не означает, что он нужен. Это больше территория оао

@caitp Вы это исправляете?

Это не отключено laxbreak? Я знаю, что он устарел, но он не будет удален до v3.

Для v3 нет реальной дорожной карты, от нее можно безопасно избавиться --- она ​​не сломает ничьих сборок.

@caitp Для того же токена JSHint также должен разрешать разрывы строк перед &&, ||, ... по умолчанию.

Есть дорожная карта, которую мы с @jugglinmike обсуждаем. Это все, что касается вехи v3.

Это не сломает сборку людей, но остановит предупреждения, на которые люди полагаются, когда нет предупреждений и очень мало документации о том, что опция была удалена (и нет основной версии версии, чтобы люди посмотрели на список изменений и заметили, что они должны использовать jscs )

Никто на это реально не рассчитывает, и веха — это не дорожная карта. Веха v3 существует уже целую вечность, нет ни крайних сроков, ни давления. Существует журнал изменений для всех выпусков, а не только для основных, а другие фиктивные предупреждения уже удалены. Нет убедительных аргументов, чтобы оставить это на неопределенный срок, это территория АО.

Веха v3 существует уже целую вечность

Недавно мы прояснили его и сделали его более коротким и достижимым списком.

Его ждет пара пиарщиков.

Существует журнал изменений для всех выпусков, а не только для основных, а другие фиктивные предупреждения уже удалены. Нет убедительных аргументов, чтобы оставить это на неопределенный срок, это территория АО.

Согласен, только когда. Я просто не согласен с _both_ классификацией, не предупреждайте об устаревших правилах как о критическом изменении, поэтому не объединяйтесь до v3 и в то же время удаляйте устаревшие правила. Если jshint хочет быть очень осторожным, будьте очень осторожны. Если он хочет удалить правила, поднимите основную версию или предупредите людей.

Довольно легко пропустить, что параметры устарели, если вы настроили jshint некоторое время назад — мы хотим, чтобы люди получали опыт, чтобы они подняли ошибку, а затем им сказали, что она устарела? или сделать это очевидным?

Никто реально не полагается на это

Раньше я полагался на jshint для проверки стиля, пока не узнал о jscs и не переключился на него. Бьюсь об заклад, многие люди все еще.

Никто реально не полагается на это

Поиск на GitHub... https://github.com/search?l=json&q=%22laxbreak%22%3A+false&ref=searchresults&type=Code&utf8=%E2%9C%93

@prettydiff
это проходит

/* jshint laxbreak: true */
var a = (tern)
    ? b
    : c;

Итак, просто включите эту опцию, чтобы не получать предупреждения.

laxbreak будет удален в ближайшее время. это проблема, поднятая для его удаления - # 1867

есть возражения против закрытия этого как дубликата № 1867?

Я голосую за то, чтобы сделать это новой ошибкой и исправить ее должным образом. Здесь не требуется изменение основной версии.

@lukeapage Если laxbreak будет удален в версии 3.0, будет ли этот пример кода генерировать предупреждения в версии 3.0, и каковы приблизительные сроки выпуска версии 3.0?

Если laxbreak будет удален в версии 3.0, будет ли этот пример кода генерировать предупреждения в версии 3.0.

План состоит в том, чтобы удалить опцию laxbreak и больше не предупреждать о случаях laxbreak.
Использование параметра может вызвать предупреждение о том, что параметр устарел и может быть удален.

каковы приблизительные сроки выпуска версии 3.0

Я не уверен, есть очередь PR, чтобы просмотреть/доработать и исправить много ошибок. Сомневаюсь, что это произойдет в ближайший месяц.

Кейт является более долгосрочным участником, и другие участники / владельцы могут решить согласиться с ней и удалить предупреждения в следующем выпуске, после чего вы перестанете видеть предупреждения, а затем в версии 3 вы начнете получать предупреждения о том, что опция laxbreak устарела. (если вы решите начать использовать это сейчас).

@lukeapage Теперь вы можете закрыть эту ошибку (с моей точки зрения).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги