Skripts für erweiterte Linter-Prüfung
Linter-Prüfungsskripts helfen Ihnen beim Schreiben von Prüfungen, die nach Problemen in Skripts suchen. Wenn eine Linter-Prüfung für einen Datensatz ausgeführt wird, stellt sie eine abstrakte Syntaxstruktur für seinen Code bereit. Sie können diese abstrakte Syntaxstruktur verwenden, um Probleme mit dem Code zu analysieren, z. B. zu viele geschachtelte IF-Anweisungen oder Verwendungen der langsamen API in einer while-Schleife.
Linter-Überprüfungsnutzung
Linter-Prüfungen haben ein eindeutiges Objekt namens Rootknoten . Dies ist der Stammknoten der analysierten abstrakten Syntaxstruktur (AST) für das Skript des aktuellen Datensatzes. Dieses Objekt hat viele Funktionen, aber die Besuchen Funktion ist am wichtigsten. Die Besuchen Die Funktion verwendet eine Rückruffunktion als Parameter, der auf jedem Knoten der Struktur aufgerufen wird. Die Rückruffunktion verwendet dann einen Knoten als Parameter, der den aktuellen Knoten während der Iteration darstellt. Sie können „falsch“ von der Rückruffunktion zurückgeben, um die Iteration der Struktur vorzeitig zu beenden, andernfalls wird jeder Unterknoten in der Struktur des von Ihnen angerufenen Knotens besucht Besuchen Ein.
BadFunction() . Im folgenden Beispiel können Sie einen Linter-Check mit einem Skript schreiben:(function(engine) {
engine.rootNode.visit(function(node) {
if (node.getTypeName() === "NAME" &&
node.getNameIdentifier() === "badFunction" &&
node.getParent().getTypeName() === "CALL") {
engine.finding.incrementWithNode(node);
}
});
})(engine);Wenn Sie einen Scan mit dieser Linter-Prüfung ausführen, wird jeder Datensatz im Scan mit einem Skriptfeld überprüft. Wenn beispielsweise ein Datensatz in diesem Scan ein Skript hat, das wie folgt aussieht, greift der Scan ein Ergebnis für diesen Datensatz auf./*
badFunction()
*/
// badFunction()
function badFunction() {
return;
}
var GoodClass = Class.create();
GoodClass.prototype = Object.extendsObject(Object, {
badFunction: function() {
// actually good
}
});
var badFunction = ["badFunction", "badFunction()"];
badFunctionButSometimesGood();
badFunction();
Knotenfunktionen
GetRootNode(): Ruft den Stammknoten der Struktur für diesen Knoten abGetParent(): Übergeordnetes Element dieses Knotens abrufenGetLineNo(): Ruft den Standort der Leitungsnummer für diesen Knoten abGetColumnNo(): Ruft die Position der Spaltennummer für diesen Knoten abZu Quelle (): Ruft die Quelle für diesen Knoten ab. Die Quelle basiert auf diesem Knoten und seinen untergeordneten ElementenGetTypeName(): Ruft den Knotentypnamen dieses Knotens ab. Beispielsweise wird ein Funktionsaufruf in der Quelle als Knoten mit dem Typnamen „CALL“ tokenisiert.Hinweis:Die Werte vonNode.getTypeName()Stammen aus verschiedenen Arten von Knoten in einer abstrakten Syntaxstruktur (AST). Die möglichen Werte stammen aus dem AST-Parser von Rhino selbst.GetNameIdentifier(): Wenn der Knotentyp dieses Knotens „NAME“ ist, geben Sie den Bezeichner zurück, der der Zeichenfolgenwert des Namens selbst ist. Ein „NAME“-Knoten stellt einen einfachen Namen dar, der kein Stichwort ist, z. B. ein Funktionsname oder ein Variablenname.Hinweis:Wenn dieser Knoten kein NAMENKNOTEN ist, ist das Ergebnis null.GetAbsolutePosition(): Ruft die absolute Position dieses Knotens ab. Die absolute Position ist die Anzahl der Zeichen vom Beginn des Skripts bis zu diesem KnotenCompareTo(Sonstiges): Vergleichen Sie diesen Knoten mit einem anderen Knoten. Der Knoten mit einer größeren absoluten Position und Länge ist im Vergleich größer.SonstigesIst ein Knoten, der mit diesem Knoten verglichen werden sollBesuch (callbackFunction): Besuchen Sie jeden Knoten in der Unterstruktur ab diesem Knoten, und führen Sie die angegebene Rückruffunktion auf jedem Knoten aus.CallbackFunctionIst eine Funktion, die auf jedem Knoten in der Unterstruktur dieses Knotens ausgeführt wird. Diese Rückruffunktion verwendet einen LinterCheckAstNode als Parameter, der der aufgerufene Knoten istDebugPrint(): Gibt eine Zeichenfolgendarstellung der abstrakten Syntaxstruktur ab diesem Knoten zurück. Jede Zeile enthält Informationen zu einem Knoten, und die Einrückung stellt die Hierarchiebeziehung zwischen den Knoten dar. Die Informationen in jeder Zeile sind wie folgt angeordnet- Absolute Position
- Knotentypname
- Position relativ zum übergeordneten Element
- Länge
- Namensbezeichner (wenn ein NAMENSKNOTEN)