JSLint - игнорировать разделы кода
У меня есть огромный script, который передает JSLint (включая уклонение от всех плохих частей). За исключением одного участка, который представляет собой очень запутанный запутанный код, который встроен в более широкий контекст. JSLint генерирует довольно много жалоб для этого раздела, и я хотел бы выборочно отключить его для этого фрагмента кода. Я уже использую selective
/*jlsint xxx:true/false*/
чтобы отключить определенные предупреждения для некоторых крошечных фрагментов кода, которые противоречат интерпретации структуры.
В запутанном коде у меня есть конструкции, которые я не знаю, могут ли они быть отключены.
Например:
for(L=(117.>
вызывает это сообщение:
Problem at line 1 character 57: A trailing decimal point can be confused with a dot '117.
Конечно, я знаю, что могу очистить код, но он испускается из обфускатора, и я действительно не хочу очищать запутанный код!
Итак, есть ли способ сказать JSLint полностью игнорировать фрагмент кода?
Я знаю этот запрос JSLint: контроль комментариев (выборочный игнорирование), но на него не ответил.
Ответы
Ответ 1
Я думаю, что это уже исправлено в JSHint некоторое время. Просто оберните свой код комментариями:
/* jshint ignore:start */
// Code here will be linted with ignored by JSHint.
/* jshint ignore:end */
Документацию можно найти здесь и прокрутите вниз до раздела "директивы".
Ответ 2
Вы можете добавить это самостоятельно в JSLint, если хотите, хотя это пограничное зло.
Здесь один быстрый и грязный способ с текущей версией:
Маршрут, который я собираюсь сделать, - захватить блок token
функции switch
для комментариев стиля /*
. Это в строке 1276 в настоящее время:
case '/*':
for (;;) {
i = source_row.search(lx);
...
Измените это, чтобы искать комментарии, которые выглядят как /*ignore:true */
по строке (хотя технически половина true
может быть в любом месте на линии в этом случае, хотя строка /*ignore:false */
должна быть на линия сама по себе, так что пусть притворяется, что имеет место для обоих).
Пример плохой, неудачный код:
function spam()
{
var sand = "sand";
/*ignore:true */
var spud = "spud";
/*ignore:false */
window.console.log(sand);
}
Если мы найдем /*ignore:true */
, пропустим строки, пока не найдем один с /*ignore:false */
с /*ignore:...
как самые первые символы в строке. До тех пор, пока это ложное утверждение на отдельной строке не будет проигнорировано.
case '/*':
// Opening /* has already been sliced.
if (source_row.startsWith("ignore:true")) {
do {
if (console.log) { console.log(source_row) };
} while (next_line() && !source_row.trim().startsWith("/*ignore:false"));
} else {
// Put in the code that was originally there
}
break;
Это уродливо, но, похоже, работает.
Теперь это может вызвать проблемы. Например, если у вас есть объявление var
в разделе, которое вы игнорируете и используете позже, JSLint_Hacked будет жаловаться, что myVar was used before it was defined.
Пример:
/*jslint white:true, sloppy:true, browser:true */
function spam()
{
var sand = "spam";
/*ignore:true */
var spud = "spud";
/*ignore:false */
window.console.log(sand + spud);
}
Так что этот материал может стать неприятным.
И я бы использовал это только в тех случаях, когда вы невольно вынуждены все набирать, но по какой-то причине у вас нет возможности исправить то, что в каждом файле, хотя у вас есть возможность редактировать его, странно, как в этом случае с запутанным кодом. Вся эта ignore
вещь беззвучна.
Мне нужно больше времени проводить в JSLint, чтобы знать, как это работает, но функция next_line()
кажется неразрушающей. То есть вы могли бы (и должны) обрабатывать это в функции do_jslint()
с помощью "реальных" /*jslint ignore:true */
директив стилей, но тогда вы должны обрабатывать побочные эффекты, когда вы вызываете функцию advance()
. Хак, который я использовал здесь, был намного проще, но также был намного.