2010-08-23 3 views
33

J'ai un énorme script qui passe JSLint (y compris l'évitement de toutes les parties défectueuses). Sauf pour un tronçon, qui est un code obscurci très alambiqué qui est intégré dans le contexte plus large. JSLint génère pas mal de plaintes pour cette section, et j'aimerais la désactiver de manière sélective pour cette partie du code. Je fais déjà l'utilisation sélectiveJSLint - ignorer les sections de code

/*jlsint xxx:true/false*/ 

directives pour désactiver les avertissements spécifiques pour certains petits tronçons de code qui font des choses contraires à l'interprétation struct.

Le code obfusqué que j'ai utilise des constructions que je ne sais pas si elles peuvent être désactivées.

Par exemple:

for(L=(117.> 

cause ce message:

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

Bien sûr, je sais que je pourrais nettoyer le code, mais il est émis par un obfuscateur, et je ne vraiment » Je ne veux pas avoir à nettoyer le code obfusqué! Donc, y a-t-il un moyen de dire à JSLint d'ignorer complètement un code d'étirement?

Je suis conscient de cette requête JSLint: control comments (selective ignore) mais il n'a pas été répondu.

+0

Cocher cette [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

Répondre

11

Je pense que cela a déjà été corrigé dans JSHint depuis un certain temps. Enroulez votre code avec des commentaires:

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

La documentation se trouve here et faites défiler jusqu'à la section « directives ».

+16

La question concerne jsLint, pas jsHint. –

+0

Il m'a fallu un moment de "pourquoi ça ne marche pas" avant de réaliser que c'était pour un indice et pas de peluches ... -1 – Shadow

1

Vous pouvez l'ajouter vous-même à JSLint si vous le souhaitez, bien que ce soit un maléfique.

est ici un moyen rapide et sale avec la version actuelle:

La route que je vais prendre est de détourner le bloc de fonction tokenswitch pour /* commentaires de style. C'est at line 1276 currently:

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

changement de Let que chercher des commentaires qui ressemblent à /*ignore:true */ sur une ligne par eux-mêmes (bien que techniquement la true moitié peut être n'importe où sur la ligne dans ce cas, bien que la ligne /*ignore:false */a à être sur une ligne par lui-même, alors faisons semblant que cela vaut pour les deux).

mauvais exemple, le code non pelucheux défaut:

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

Si nous trouvons /*ignore:true */, nous allons sauter des lignes jusqu'à ce qu'on trouve un avec /*ignore:false */avec /*ignore:... comme les caractères premiers sur la ligne. Jusqu'à cette fausse déclaration sur une ligne en elle-même, nous ignorons tout.

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; 

C'est moche, mais semble fonctionner.

Maintenant, cela peut causer des problèmes. Par exemple, si vous avez une déclaration var dans une section que vous ignorez et l'utiliser plus tard, JSLint_Hacked se plaindra que myVar was used before it was defined. Exemple:

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

Donc ce genre de choses pourraient se gâter.

Et je ne l'utiliserais que dans les cas où vous seriez obligé de tout peloter, mais pour une raison inconnue, vous n'avez pas le pouvoir de corriger ce qu'il y a dans chaque fichier, même si vous avez la possibilité de le modifier , étrangement, comme dans ce cas avec le code obfusqué. Toute cette chose ignore est waaay minable.

Je dois passer plus de temps à l'intérieur de JSLint pour savoir comment cela fonctionne vraiment, mais la fonction next_line() semble être non destructive. C'est, pourrait (et devrait) gérer cela dans la fonction do_jslint() avec "réel" /*jslint ignore:true */ directives de style, mais alors vous devez gérer les effets secondaires lorsque vous appelez la fonction advance(). Le hack que j'utilise ici était beaucoup plus facile, mais il est aussi beaucoup plus laid.

Questions connexes