Подтвердить что ты не робот

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: контроль комментариев (выборочный игнорирование), но на него не ответил.

4b9b3361

Ответ 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(). Хак, который я использовал здесь, был намного проще, но также был намного.