Можете сами да добавите това към JSLint, ако искате, въпреки че това е гранично зло.
Ето един бърз и мръсен начин с текущата версия:
Маршрутът, който ще поема, е да открадна switch
блока на функцията token
за коментари в стил /*
. Това е на ред 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()
. Хакът, който използвам тук, беше много по-лесен, но е и много по-грозен.
person
ruffin
schedule
12.03.2015