jslint - script - jsonlint
JSLint: ignorar secciones del código (2)
Tengo una secuencia de comandos 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 uso selectivo
/*jlsint xxx:true/false*/
directivas para desactivar advertencias particulares para ciertos pequeños tramos de código que hacen cosas contrarias a la interpretación de la estructura.
El código ofuscado que tengo usa construcciones que no sé si se pueden deshabilitar.
Por ejemplo:
for(L=(117.>
causa este mensaje:
Problem at line 1 character 57: A trailing decimal point can be confused with a dot ''117.
Claro, sé que podría limpiar el código, pero se emite desde un ofuscador, ¡y realmente no 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 de comentarios (ignorar selectivamente) pero no fue respondida.
Creo que esto ya se ha corregido en JSHint durante un tiempo. Simplemente envuelva su 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 desplácese hacia abajo a la sección "directivas".
Puede agregar esto usted mismo a JSLint si lo desea, aunque eso sea el límite del Mal.
Aquí hay una manera rápida y sucia con la versión actual:
La ruta que voy a seguir es secuestrar el bloque de switch
la función de token
para los comentarios de estilo /*
. Eso está en la línea 1276 actualmente :
case ''/*'':
for (;;) {
i = source_row.search(lx);
...
Cambiemos eso para buscar comentarios que parezcan /*ignore:true */
en una línea por sí mismos (aunque técnicamente la mitad true
puede estar en cualquier lugar de la línea en este caso, aunque el /*ignore:false */
línea tiene que estar en línea por sí mismo, así que pretendamos que eso es válido para ambos).
Ejemplo de código incorrecto, fallas en la pelusa:
function spam()
{
var sand = "sand";
/*ignore:true */
var spud = "spud";
/*ignore:false */
window.console.log(sand);
}
Si encontramos /*ignore:true */
, saltemos las líneas hasta que encontremos una 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;
- Pastee of JSLint hackear aquí (12 Mar 2015).
- El caso más simple JSLint HTML aquí .
Eso es feo, pero parece estar funcionando.
Ahora esto puede causar problemas. Por ejemplo, si tiene una declaración var
en una sección que ignora y la usa 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);
}
Entonces ese tipo de cosas podrían ponerse feas.
Y solo usaría esto en casos en los que estés forzosamente forzado a perder todo, pero por alguna razón no tienes el poder de arreglar lo que hay en cada archivo, aunque tienes la habilidad de editarlo, extrañamente, como en este caso con código ofuscado. Todo esto 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 las do_jslint()
"real" /*jslint ignore:true */
style, pero luego debe manejar los efectos secundarios cuando llama a la función advance()
. El truco que uso aquí fue mucho más fácil, pero también mucho más feo.