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 l’utilisation 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 (AST) analysée 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 nœud comme paramètre qui représente le nœud 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 sur lequel vous avez appelé visite .
badFunction(). Vous pouvez écrire une vérification Linter 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 contient un script qui ressemble au suivant, l’analyse recherche 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 de nœud
getRootNode(): récupère le nœud racine de l’arborescence pour ce nœudgetParent(): récupère le parent de ce nœudgetLineNo(): récupère l’emplacement du numéro de ligne pour 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(): récupère le nom de 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 noeuds dans une arborescence syntaxique 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 nœud n’est pas un nœud NAME, le résultat est nul.getAbsolutePosition(): récupère la position absolue de ce nœud. La position absolue est le nombre de caractères entre le début du script et ce nœudcompareTo(other): compare ce noeud avec un autre noeud. Le nœud avec une position et une longueur absolues 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(): Retourne une représentation sous forme de chaîne de caractères de l’arbre syntaxique abstrait, à 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)