2010-08-23 4 views
33

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

/*jlsint xxx:true/false*/ 

директив отключить конкретные предупреждения для некоторых маленьких участков кода, которые делают вещи, противоречащие интерпретации структуры.

Обфусканный код У меня есть конструкции, которые я не знаю, могут ли они быть отключены.

Например:

for(L=(117.> 

причины это сообщение:

Problem at line 1 character 57: A trailing decimal point can be confused with a dot '117. 

Конечно, я знаю, что я мог бы очистить код, но он выделяется из обфускатора, и я действительно не» t хочу, чтобы очистить запутанный код!

Итак, есть ли способ сказать JSLint полностью игнорировать код растяжения?

Мне известно об этом вопросе JSLint: control comments (selective ignore), но на него не было ответа.

+0

Проверить это [http://stackoverflow.com/questions/599859/jslint-control-comments-selective-ignore/13175495#13175495][1] [1]: HTTP://stackoverflow.com/questions/599859/jslint-control-comments-selective-ignore/13175495#13175495 – napoleonss

ответ

11

Я думаю, что это уже исправлено в JSHint некоторое время. Просто оберните код с комментариями:

/* jshint ignore:start */ 
// Code here will be linted with ignored by JSHint. 
/* jshint ignore:end */ 

Документация может быть найдена here и прокрутите вниз до раздела «директивы».

+16

Вопрос о jsLint, а не jsHint. –

+0

Мне потребовалось некоторое время, «почему это не работает», прежде чем осознать, что это было для намека, а не ворса ... -1 – Shadow

1

Вы можете добавить это самостоятельно в JSLint, если хотите, хотя это пограничное зло.

Вот один быстрый и грязный путь с текущей версией:

маршрутом я собираюсь сделать, это угон switch блока в token функции для /* комментариев стиля. Это at line 1276 currently:

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 вещь waaay захудалый.

Мне нужно больше времени проводить в JSLint, чтобы знать, как это работает, но функция next_line() кажется неразрушающей. То есть вы могли бы (и должны) обрабатывать это в функции do_jslint() с помощью «настоящих» директив стиля /*jslint ignore:true */, но тогда вы должны обрабатывать побочные эффекты, когда вы вызываете функцию advance(). Хак, который я использую здесь, был намного проще, но также был uglier.

Смежные вопросы