Erweiterte Linter-Prüfskripts

  • Freigeben Version: Washingtondc
  • Aktualisiert 1. Februar 2024
  • 3 Minuten Lesedauer
  • 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 while-Schleife.

    Linter-Überprüfungsnutzung

    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 Visit -Funktion verwendet eine Rückruffunktion als Parameter, der für jeden 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 die Iteration der Struktur vorzeitig zu beenden. Andernfalls wird weiterhin jeder Unterknoten in der Struktur des Knotens besucht, für den Sie „ visit “ aufgerufen haben.

    Zum Beispiel, wenn Sie nach einer veralteten API mit der Bezeichnung „ badFunction()“ suchen möchten. Im folgenden Beispiel können Sie eine Linter-Prüfung 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. Beispiel: Wenn ein Datensatz in diesem Scan ein Skript enthält, das wie folgt aussieht, wird beim Scan ein Ergebnis für diesen Datensatz erfasst.
    /*
    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

    Im Folgenden finden Sie eine Liste der verfügbaren Funktionen, die für das Knotenobjekt aufgerufen werden können.
    • getRootNode(): Ruft den Stammknoten der Struktur für diesen Knoten ab
    • getParent(): Übergeordnetes Element dieses Knotens abrufen
    • getLineNo(): Ruft die Position der Zeilennummer für diesen Knoten ab
    • getColumnNo(): Ruft den Speicherort der Spaltennummer für diesen Knoten ab
    • toSource(): Quelle für diesen Knoten abrufen. Die Quelle basiert auf diesem Knoten und seinen untergeordneten Elementen
    • getTypeName(): Ruft den Knotentypnamen dieses Knotens ab. Beispielsweise wird ein Funktionsaufruf in der Quelle als Knoten mit dem Typnamen „CALL“ tokenisiert.
      Hinweis:
      Die Werte von node.getTypeName() stammen aus verschiedenen Knotentypen in einer abstrakten Syntaxstruktur (AST). Die möglichen Werte stammen aus dem AST-Parser von Rhino.
    • getNameIdentifier(): Wenn der Knotentyp dieses Knotens „NAME“ ist, wird der Bezeichner zurückgegeben, der der Zeichenfolgenwert des Namens selbst ist. Ein Knoten vom Typ „NAME“ stellt einen einfachen Namen dar, der kein Stichwort ist, z. B. 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 Anfang des Skripts bis zu diesem Knoten
    • compareTo(other): 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, der mit diesem Knoten verglichen werden soll
    • Visit(CallbackFunction): Besuchen Sie jeden Knoten in der Unterstruktur, beginnend mit 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 handelt
    • debugPrint(): Gibt eine Zeichenfolgendarstellung des abstrakten Syntaxbaums 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
      1. Absolute Position
      2. Knotentypname
      3. Position relativ zum übergeordneten Element
      4. Länge
      5. Namensbezeichner (wenn ein NAME-Knoten)
    Weitere Informationen finden Sie unter LinterCheckAstNode-API – Scoped, Global.