Erweiterte Skripts zur Linter-Prüfung
Linter-Prüfskripts 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, wird eine abstrakte Syntaxstruktur für den Code bereitgestellt. Sie können diese abstrakte Syntaxstruktur verwenden, um Probleme mit dem Code zu analysieren, z. B. zu viele verschachtelte if-Anweisungen oder Verwendungen einer langsamen API in einer während-Schleife.
Linter-Überprüfung der Nutzung
Linter-Prüfungen haben ein eindeutiges Objekt namens rootNode. Dies ist der Stammknoten der analysierten abstrakten Syntaxstruktur (AST) für das Skript des aktuellen Datensatzes. Dieses Objekt hat viele Funktionen, aber die Besuchsfunktion ist die wichtigste. Die Besuchsfunktion verwendet eine Rückruffunktion als Parameter, die 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 von der Rückruffunktion „false“ zurückgeben, um das Iterieren der Struktur vorzeitig zu beenden. Andernfalls wird weiterhin jeder Unterknoten in der Struktur des Knotens besucht, für den Sie „visit“ aufgerufen haben.
„badFunction()“suchen möchten. 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 dieser Prüfung ein Skript enthält, das wie folgt aussieht, nimmt die Prüfung ein Ergebnis für diesen Datensatz vor./*
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 die Position der Zeilennummer für diesen Knoten abgetColumnNo(): Ruft die Position der Spaltennummer für diesen Knoten abtoSource(): 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 vom AST-Parser von Nashörn.getNameIdentifier(): Wenn der Knotentyp dieses Knotens „NAME“ ist, wird der Bezeichner zurückgegeben, der der Zeichenfolgenwert des Namens selbst ist. Ein „NAME“-Knoten stellt einen einfachen Namen dar, der kein Stichwort ist, wie ein Funktionsname oder ein Variablenname.Hinweis:Wenn dieser Knoten kein NAME-Knoten 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 KnotenvergleichenMit (Andere): Vergleicht diesen Knoten mit einem anderen Knoten. Der Knoten mit einer größeren absoluten Position und Länge ist im Vergleich größer.„other“ist ein Knoten zum Vergleich mit diesem Knotenvisit(callbackFunction): Besuchen Sie jeden Knoten im Unterbaum ab diesem Knoten und führen Sie die angegebene Rückruffunktion auf jedem Knoten aus.„callbackFunction“ist eine Funktion, die auf jedem Knoten in der Unterstruktur dieses Knotens ausgeführt wird. Diese Rückruffunktion verwendet einen LinterCheckAstNode als Parameter, bei dem es sich um den besuchten Knoten handeltdebugPrint(): Gibt eine Zeichenfolgendarstellung der abstrakten Syntaxstruktur zurück, beginnend mit diesem Knoten. Jede Zeile enthält Informationen zu einem Knoten, und der Einzug stellt die Hierarchiebeziehung zwischen den Knoten dar. Die Informationen in jeder Zeile sind wie folgt angeordnet- Absolute Position
- Name des Knotentyps
- Position relativ zum übergeordneten Element
- Länge
- Namensbezeichner (bei einem NAME-Knoten)