2010-08-23 16 views
33

Tengo un script enorme que pasa JSLint (incluida la eliminación de todas las partes defectuosas). Excepto por un tramo, que es un código ofuscado muy intrincado que está incrustado dentro del contexto más amplio. JSLint genera bastantes quejas para esta sección, y me gustaría deshabilitarla selectivamente para ese tramo de código. Ya hago uso selectivoJSLint: ignorar secciones del código

/*jlsint xxx:true/false*/ 

directivas para desactivar las advertencias particulares para ciertos pequeños tramos de código que pueden hacer cosas contrarias a la interpretación estructura.

El código ofuscado que tengo usa construcciones que no sé si se pueden deshabilitar.

Por ejemplo:

for(L=(117.> 

hace que este mensaje:

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

Claro, yo sé que podría limpiar el código, pero se emite desde un ofuscador, y realmente don' ¡quiero tener que limpiar el código ofuscado!

Entonces, ¿hay alguna manera de decirle a JSLint que ignore por completo un código de estiramiento?

Soy consciente de esta consulta JSLint: control comments (selective ignore) pero no fue respondida.

+0

Marque esta [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

Respuesta

11

Creo que esto ya se ha solucionado en JSHint durante un tiempo. Simplemente envuelva el código con comentarios:

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

La documentación se puede encontrar here y vaya a la sección de "directivas".

+16

La pregunta es sobre jsLint, no jsHint. –

+0

Me tomó un tiempo de "¿por qué no funciona esto?" Antes de darme cuenta de que esto era por insinuación y no por pelusa ... -1 – Shadow

1

Puede agregarlo usted mismo a JSLint si lo desea, aunque ese límite es Evil.

Aquí hay una manera rápida y sucia con la versión actual:

La ruta que voy a tomar es secuestrar bloque de la función tokenswitch para /* comentarios de estilo. Eso es at line 1276 currently:

case '/*': 
    for (;;) { 
     i = source_row.search(lx); 
... 

cambio de dejar que eso para buscar los comentarios que se parecen a /*ignore:true */ en una línea por sí mismos (aunque técnicamente la true medio puede estar en cualquier lugar en la línea en este caso, aunque la línea /*ignore:false */ tiene a estar en línea por sí mismo, así que pretendamos que eso es válido para ambos).

Ejemplo mal, no pelusa-código:

function spam() 
{ 
    var sand = "sand"; 
/*ignore:true */ 
    var spud = "spud"; 
/*ignore:false */ 
    window.console.log(sand); 
} 

Si encontramos /*ignore:true */, Saltémonos líneas hasta que encontremos uno con /*ignore:false */con /*ignore:... como los primeros caracteres de la línea. Hasta esa declaración falsa en una línea en sí misma, ignoramos todo.

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; 

Eso es feo, pero parece estar funcionando.

Ahora esto puede causar problemas. Por ejemplo, si usted tiene una declaración var en una sección se ignora y utilizarlo más adelante, JSLint_Hacked se quejará de que myVar was used before it was defined. Ejemplo:

/*jslint white:true, sloppy:true, browser:true */ 
function spam() 
{ 
    var sand = "spam"; 
/*ignore:true */ 
    var spud = "spud"; 
/*ignore:false */ 
    window.console.log(sand + spud); 
} 

Así que ese tipo de cosas podría ser mala.

Y solo usaría esto en los casos en los que está forzosamente forzado a hilar todo, pero por alguna razón no tiene el poder de arreglar lo que está en cada archivo, aunque usted tiene la capacidad de editarlo , curiosamente, como en este caso con código ofuscado. Todo este asunto de ignore es waaay cutre.

Necesito pasar más tiempo dentro de JSLint para saber cómo funciona realmente, pero la función next_line() parece no ser destructiva. Es decir, podría (y debería) manejar esto en la función do_jslint() con directivas de estilo "reales" /*jslint ignore:true */, pero luego debe manejar los efectos secundarios cuando llama a la función advance(). El truco que estoy usando aquí fue mucho más fácil, pero también es mucho más más feo.