Erweiterte Skripts zur Linter-Prüfung

  • Freigeben Version: Yokohama
  • Aktualisiert 30. Januar 2025
  • 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 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.

    Zum Beispiel, wenn Sie nach einer veralteten API namens „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

    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 die Position der Spaltennummer für diesen Knoten ab
    • toSource(): Ruft die Quelle für diesen Knoten ab. 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 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 Knoten
    • vergleichenMit (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 Knoten
    • visit(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 handelt
    • debugPrint(): 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
      1. Absolute Position
      2. Name des Knotentyps
      3. Position relativ zum übergeordneten Element
      4. Länge
      5. Namensbezeichner (bei einem NAME-Knoten)
    Weitere Informationen finden Sie unter LinterCheckAstNode-API – bereichsbezogen, global.