Scripts de vérification Linter avancés
Les scripts de vérification Linter vous aident à rédiger des vérifications qui recherchent des problèmes dans les scripts. Lorsqu’une vérification linter est exécutée sur un enregistrement, elle fournit une arborescence syntaxique abstraite pour son code. Vous pouvez utiliser cette arborescence de syntaxe abstraite pour analyser les problèmes liés au code, tels qu’un trop grand nombre d’instructions if imbriquées ou des utilisations d’API lentes dans une boucle while.
Utilisation de la vérification Linter
Les vérifications Linter ont un objet unique à utiliser appelé rootNode. Il s’agit du nœud racine de l’arborescence de syntaxe abstraite analysée (AST) pour le script de l’enregistrement actuel. Cet objet a de nombreuses fonctions, mais la fonction de visite est la plus importante. La fonction de visite prend une fonction de rappel comme paramètre qui est appelée sur chaque nœud de l’arborescence. La fonction de rappel prend alors un noeud comme paramètre qui représente le noeud actuel lors de son itération. Vous pouvez retourner false à partir de la fonction de rappel pour arrêter l’itération de l’arborescence plus tôt, sinon elle continue à visiter chaque sous-nœud de l’arborescence du nœud que vous avez appelé visit .
badFunction(). Vous pouvez écrire un Linter Check avec un script dans l’exemple suivant :(function(engine) {
engine.rootNode.visit(function(node) {
if (node.getTypeName() === "NAME" &&
node.getNameIdentifier() === "badFunction" &&
node.getParent().getTypeName() === "CALL") {
engine.finding.incrementWithNode(node);
}
});
})(engine);Lorsque vous exécutez une analyse avec cette vérification Linter, elle vérifie chaque enregistrement de l’analyse avec un champ de script. Par exemple, si un enregistrement de cette analyse a un script qui ressemble à ce qui suit, l’analyse récupère un résultat pour cet enregistrement./*
badFunction()
*/
// badFunction()
function badFunction() {
return;
}
var GoodClass = Class.create();
GoodClass.prototype = Object.extendsObject(Object, {
badFunction: function() {
// actually good
}
});
var badFunction = ["badFunction", "badFunction()"];
badFunctionButSometimesGood();
badFunction();
Fonctions des nœuds
getRootNode(): récupère le nœud racine de l’arborescence pour ce nœudgetParent(): récupère le parent de ce nœudgetLineNo(): obtenir l’emplacement du numéro de ligne de ce nœudgetColumnNo(): obtenir l’emplacement du numéro de colonne pour ce nœudtoSource(): récupère la source de ce nœud. La source est basée sur ce nœud et ses enfantsgetTypeName(): recherche le nom du type de nœud de ce nœud. Par exemple, un appel de fonction dans la source est tokenisé en tant que nœud avec le nom de type « CALL »Remarque :Les valeurs denode.getTypeName()proviennent de différents types de nœuds dans une arborescence de syntaxe abstraite (AST). Les valeurs possibles proviennent de l’analyseur AST de Rhino lui-même.getNameIdentifier(): si le type de nœud de ce nœud est « NAME », renvoyez l’identificateur, qui est la valeur de chaîne du nom lui-même. Un nœud « NAME » représente un nom simple qui n’est pas un mot-clé, comme un nom de fonction ou un nom de variable.Remarque :Si ce noeud n’est pas un noeud NAME, le résultat est nul.getAbsolutePosition(): obtient la position absolue de ce nœud. La position absolue est le nombre de caractères depuis le début du script jusqu’à ce nœudcompareTo(other): compare ce noeud avec un autre noeud. Le nœud avec une position absolue et une longueur plus grandes sera le plus grand en comparaison.autreest un nœud à comparer avec ce nœudvisit(callbackFunction): visitez chaque nœud de la sous-arborescence à partir de ce nœud et exécutez la fonction de rappel donnée sur chaque nœud.callbackFunctionest une fonction qui sera exécutée sur chaque nœud de la sous-arborescence de ce nœud. Cette fonction de rappel prend un LinterCheckAstNode comme paramètre qui sera le nœud visitédebugPrint(): Renvoie une représentation sous forme de chaîne de caractères de l’arborescence de syntaxe abstraite, à partir de ce nœud. Chaque ligne contient des informations sur un nœud, et l’indentation représente la relation hiérarchique entre les nœuds. Les informations contenues dans chaque ligne sont disposées comme suit- Position absolue
- Nom du type de nœud
- Position par rapport au parent
- Longueur
- Identificateur de nom (s’il s’agit d’un nœud NAME)