Jshint: Отступ табуляции нарушает несколько правил

Созданный на 23 июн. 2017  ·  29Комментарии  ·  Источник: jshint/jshint

Кажется, что отступ с использованием табуляции нарушает положение, сообщаемое как минимум 3 правилами, а возможно, и больше.

Все следующее было проверено с использованием этого файла .jshintrc :

{
  "strict": "global",
  "unused": true
}

Протестированная версия JSHint — v2.9.5.

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

W032

Если вы линтуете этот код:

'use strict';

    function foo() {
    };

foo();

В строке 4, столбце 6 сообщается об ошибке, но в строке 4 всего 4 символа.

W098

Если вы линтуете этот код:

'use strict';

    function foobar(
        $foo
    ) {
        return 'foo';
    }

foobar();

В строке 4, столбце 9 сообщается об ошибке, но в строке 4 всего 7 символов.

W117

Если вы линтуете этот код:

'use strict';

    function foobar() {
        if (true) {
            fun1();
        }
    }

foobar();

В строке 5, столбце 13 сообщается об ошибке, но в строке 4 всего 11 символов.


Сообщаемая позиция символа, кажется, идет все дальше и дальше, чем больше табуляции в начале рассматриваемой строки.

Сырые файлы можно найти здесь: linter-jshint_GH416.zip

Первоначально обнаружен при расследовании https://github.com/AtomLinter/linter-jshint/issues/416.

Правила, о которых известно, что они затронуты:

  • W009
  • W014
  • E015
  • W024
  • W027
  • W030
  • W032
  • W033
  • W040
  • W043
  • W069
  • W075
  • W098
  • W116
  • W119
  • W140
  • E041
  • Многие другие...
Needs Discussion

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

ПОЖАЛУЙСТА, ВСЕ ВАШИ РЕШЕНИЯ, СОСИ, IVE ПОТРЕБИЛ ПОСЛЕДНИЕ ГРЯБЫЕ 5 ЧАСОВ, ПЫТАЯСЬ СОТРУДНИЧАТЬ ГРЕБАННЫЙ ФАЙЛ JAVASCRIPT, ЭТО БЛЯДЬ 2017 ПОЧЕМУ У МЕНЯ ЭТА ПРОБЛЕМА АТОМ ЭТО ГЛОБАЛЬНОЕ ПРОБЛЕМ МОЕЙ БЛЯДНОЙ ЖИЗНИ Исправь себя, ты, глупый язь

И КТО, БЛЯДЬ, НЕ ИСПОЛЬЗУЕТ ВКЛАДКИ, ЧТОБЫ ОТСТАТЬ БУКВАЛЬНО WTF, ЗАЧЕМ ВЫ ВЫПУСКАЕТЕ НЕИСПРАВНЫЙ ПАКЕТ ДЛЯ МИЛЛИОНОВ, ЧТО LINT JS???????

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

Спасибо за отчет! Проблема связана со строкой 1610 lex.js :

this.input = this.input.replace(/\t/g, state.tab);

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

Моя первоначальная мысль состоит в том, чтобы отслеживать это «эффективное смещение» как новое свойство объекта токена с именем column . Это можно использовать для предупреждений, связанных со стилем. Затем можно повторно реализовать атрибут character для описания «истинного» смещения символов, где каждая кодовая точка (табуляция или что-то другое) увеличивает счетчик ровно на 1. Это значение будет использоваться для выдачи предупреждений. Затем подключаемые модули репортеров будут контролировать то, как они отображают символ табуляции, и они смогут соответствующим образом интерпретировать сообщаемый номер «столбца».

Тебе это нравится, @Arcanemagus?

Для меня это звучит идеально, по крайней мере, на первый взгляд, без реальных знаний о внутренностях JSHint 😛. В идеале мне просто нужен какой-то метод получения истинного количества столбцов (где каждая кодовая точка считается одним столбцом).

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

Похоже, что W030 , W033 и W009 также затронуты. Из вашего описания я предполагаю, что затронуты _все_ правила?

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

Вот пример того, как jshint пытается предупредить меня, что мой «==» должен быть «===». Обратите внимание на ошибочное расположение оранжевого подчеркивания:
erroneoustargeting

Надеюсь, это подтвердит ваши мысли по этому вопросу.

Сегодня у меня есть немного времени, чтобы покопаться, и я считаю, что установка для параметра indent значения 1 даст желаемые результаты.

@Arcanemagus Можете ли вы переопределить значение параметра indent для ваших потребителей? Если это возможно, я бы предпочел это сделать, поскольку я не уверен, как изменение значения по умолчанию в самом JSHint может повлиять на его потребителей.

Хм, в настоящее время этот проект использует интерфейс командной строки, на который он похож. Его можно переписать, чтобы использовать Node.js API, что сделает это возможным.

  • Изменит ли принудительное значение indent результаты, которые увидят потребители? Цель этого пакета — максимально приблизиться к запуску jshint самостоятельно, но с интегрированием результатов в редактор.
  • Есть ли в JSHint API скрытый метод для захвата конфигурации файла или его необходимо реализовать? Текущая документация не показывает такую ​​функцию.

Как насчет добавления аргумента командной строки, который позволяет переопределять значения из конфигурации?
Что-то подобное часто встречается в таких инструментах, как -g в nginx, -o в ssh, -c в git и многих других, я думаю.

$ jshint -o "indent = 1" -o "-W034 = true" -o "globals.require = false" -o "globals.$ = null"

Кто-нибудь знает, в какой версии это было введено? 2.9.5?

По крайней мере, тогда мы могли бы на время понизить статус временного сотрудника. исправить.

@jaredatch Вернувшись в https://github.com/AtomLinter/linter-jshint/pull/386 (выпущенный в версии 3.1.0 linter-jshint ), все обходные пути для отчетов об ошибках JSHint были удалены. Весь смысл этой проверки состоит в том, чтобы найти такие ошибки, когда линтер сообщает о недопустимых точках, чтобы об этом можно было сообщить и исправить для _всех_, использующих линтер. (В конце концов, если вы не можете доверять линтеру в получении точных данных, зачем его использовать?)

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

@Arcanemagus попался , очень ценю понимание. Продолжайте в том же духе 👍

Если у вас есть лучшая / более полезная идея сообщения о том, как linter-jshint сообщает об этих недействительных баллах, не стесняйтесь сообщать о проблеме / отправлять PR здесь 😉.

ПОЖАЛУЙСТА, ВСЕ ВАШИ РЕШЕНИЯ, СОСИ, IVE ПОТРЕБИЛ ПОСЛЕДНИЕ ГРЯБЫЕ 5 ЧАСОВ, ПЫТАЯСЬ СОТРУДНИЧАТЬ ГРЕБАННЫЙ ФАЙЛ JAVASCRIPT, ЭТО БЛЯДЬ 2017 ПОЧЕМУ У МЕНЯ ЭТА ПРОБЛЕМА АТОМ ЭТО ГЛОБАЛЬНОЕ ПРОБЛЕМ МОЕЙ БЛЯДНОЙ ЖИЗНИ Исправь себя, ты, глупый язь

И КТО, БЛЯДЬ, НЕ ИСПОЛЬЗУЕТ ВКЛАДКИ, ЧТОБЫ ОТСТАТЬ БУКВАЛЬНО WTF, ЗАЧЕМ ВЫ ВЫПУСКАЕТЕ НЕИСПРАВНЫЙ ПАКЕТ ДЛЯ МИЛЛИОНОВ, ЧТО LINT JS???????

Кто не использует точки буквально, почему вы выпускаете этот ломаный английский для миллионов, которым английский является?

Ой. И заглавные буквы идут в начале предложения. Не везде.

/Тролль (извините, не удержался)

Ну, я думаю, решение будет деактивировать это на данный момент...
Кому вообще нужны линтеры?

@jugglinmike Можете ли вы ответить на вопросы в https://github.com/jshint/jshint/issues/3151#issuecomment -312512856?

У меня есть 20 уникальных проблем, открытых для разных случаев, когда это срабатывает, так как похоже, что исправление этого здесь займет некоторое время, я хотел бы перейти к обходному пути, предполагая, что это не изменит результаты для пользователей.

Эта проблема ускользнула от моего внимания; Я сожалею об этом, @Arcanemagus. К сожалению, я не думаю, что смогу уделить этому внимание, которого оно заслуживает, до этих выходных. Будет ли это работать для вас?

@jugglinmike Конечно 😉

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

@cobexer Мне нравится эта идея, потому что она не только дает нам путь вперед, но и
может быть полезно людям в других контекстах. Тем не менее, насколько мне известно, там
никогда не было запроса на такую ​​​​функциональность, и я не хочу
соглашайтесь на любую новую функцию только потому, что она кажется хорошей. И есть причина
не рекомендуется использовать эту функцию, в частности: между файлами "rc", в строке
конфигурация и API Node.js, пользователи уже спотыкаются, когда хотят
чтобы понять, почему данная опция включена. Добавление еще одного вектора для конфига
администрация может усугубить эту проблему.

Я думаю, что наиболее жизнеспособное решение здесь основано на моем предыдущемпредложение .
Однако мы должны рассматривать свойство character как общедоступный API — Atom
В конце концов, плагин Editor сам построен на нем. Поэтому вместо того, чтобы изменить это
свойство и определение нового, которое имеет семантику текущего, я думаю
нам нужно оставить character как есть и предоставить запрошенные данные на новом
Имя свойства.

Я начал работу над новой функцией в эти выходные. Я хочу избежать регрессии в
все расходы, поэтому нам нужно расширить тесты проекта, чтобы последовательно подтвердить
ожидаемый номер символа. Когда я начал это делать, я обнаружил недостатки в
набор тестов, которые необходимо решить в первую очередь. gh-3174 — это первый шаг к
эта цель.

Все это говорит о том, что, похоже, это может занять некоторое время. @Arcanemagus Я знаю
вы несете основную тяжесть этой ошибки, и я ценю, что вы восприняли это как
возможность увидеть улучшение JSHint. Мне также нравится, что вы интересуетесь
избегать любого решения, которое не является прозрачным для ваших пользователей. Вкратце
Удалось ли вам порекомендовать пользователям установить для параметра indent значение 1 ?
Это не идеально, но это должно решить их краткосрочную проблему.
это будет продолжать работать даже после того, как мы исправим это.

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

Единственная причина, по которой я добавил проверку в универсальную библиотеку, используемую большинством провайдеров линтеров для Atom, заключается в том, что подобные ошибки могут быть обнаружены в исходных линтерах и зарегистрированы/исправлены 😉. На самом деле это было бы обнаружено раньше, но была проверка в linter-jshint , которая в основном скрывала все ошибки недопустимых точек от _way_ назад, когда синтаксический анализатор полностью терпел неудачу в большинстве документов, и у нас не было хорошего способа сообщить об этом. пользователям или дедупликации отчетов о проблемах. Теперь, когда они были выяснены, я удалил эту проверку, и вот мы здесь 😛.

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

На самом деле, прозрачное решение для этой конкретной проблемы было бы в порядке, я просто не знаю, изменит ли принудительное изменение параметра indent на 1 результаты, которые они видят, по сравнению с тем, что они получили бы от сами управляют jshint .

В краткосрочной перспективе вам удалось порекомендовать пользователям установить отступ равным 1?

Это... отличная идея, о которой я даже не подумал опубликовать в этих выпусках. Я обязательно упомяну об этом в более прокомментированных вопросах!

О, да, установка свойства «отступ» на 1 в .jshintrc — отличный обходной путь. Хотел бы я знать об этом раньше. У меня уже есть .jshintrc, потому что jshint не использует по умолчанию es6, так что это просто добавить. 👍

Рад это слышать, @tustin2121!

Обновление: я все еще работаю над укреплением набора тестов JSHint, чтобы избежать регрессий. Последним в этом направлении является gh-3176.

Есть новости по этому вопросу?
image

Похоже, эта ошибка затрагивает как минимум 40 различных правил 😛.

Любые обновления по этому поводу, прошло несколько месяцев с тех пор, как у меня появились эти ошибки, сводящие меня с ума :)

Привет @xcrap! Я только что проверил ветку комментариев, и не похоже, чтобы кто-то опубликовал какие-либо обновления. Хорошей новостью является то, что JSHint — это проект с открытым исходным кодом, поэтому вы можете помочь решить проблему, если она вызывает у вас стресс! Хотите протянуть руку помощи? Я буду рад дать вам совет.

@jugglinmike Желаю! Я всегда пробую себя в крошечных проектах, но мои навыки js супер базовые и ограниченные :)

Я назначил награду в размере 50 долларов за эту ошибку, другие могут внести свой вклад в увеличение награды по этой ссылке: https://www.bountysource.com/issues/46533252-tab-indentation-breaks-multiple-rules

Вытягивание вилки @tzvipm локально и перестройка jshint помогли мне решить проблему, если кто-то еще наткнулся на это:

git clone https://github.com/tzvipm/jshint
git remote add upstream [email protected]:jshint/jshint.git
git fetch upstream
git stash
git merge upstream/master
git mergetool --tool=opendiff
npm run build
Была ли эта страница полезной?
0 / 5 - 0 рейтинги