詳細リンターチェックスクリプト
リンターチェックスクリプトは、スクリプトの問題を探すチェックを記述するために役立ちます。リンターチェックがレコードで実行されると、そのコードの抽象構文ツリーが提供されます。この抽象構文ツリーを使用すると、ネストされた if ステートメントが多すぎる場合や、while ループの低速な API の使用状況など、コードに関する問題を分析できます。
リンターチェックの使用方法
リンターチェックには、rootNode と呼ばれる一意のオブジェクトがあります。これは、現在のレコードのスクリプトに対する解析済みの抽象構文ツリー (AST) のルートノードです。このオブジェクトには多くの関数がありますが、最も重要なのは visit 関数です。visit 関数は、ツリーのすべてのノードで呼び出されるパラメーターとしてコールバック関数を取ります。次にコールバック関数は、反復中の現在のノードを表すパラメーターとしてノードを取ります。コールバック関数から false を返してツリーの反復を早期に停止できます。それ以外の場合、visit を呼び出したノードのツリー内のすべてのサブノードにアクセスし続けます。
たとえば、廃止された API が呼び出した
badFunction() をスキャンする場合、次の例のように、スクリプトを使用してリンターチェックを記述できます。(function(engine) {
engine.rootNode.visit(function(node) {
if (node.getTypeName() === "NAME" &&
node.getNameIdentifier() === "badFunction" &&
node.getParent().getTypeName() === "CALL") {
engine.finding.incrementWithNode(node);
}
});
})(engine);このリンターチェックを使用してスキャンを実行すると、スキャンのすべてのレコードがスクリプトフィールドでチェックされます。たとえば、そのスキャンのレコードに次のようなスクリプトが含まれている場合、スキャンはこのレコードの検出結果を選択します。/*
badFunction()
*/
// badFunction()
function badFunction() {
return;
}
var GoodClass = Class.create();
GoodClass.prototype = Object.extendsObject(Object, {
badFunction: function() {
// actually good
}
});
var badFunction = ["badFunction", "badFunction()"];
badFunctionButSometimesGood();
badFunction();
ノード関数
以下に、ノードオブジェクトで呼び出すことができる関数のリストを示します。
getRootNode():このノードのツリーのルートノードを取得します。getParent():このノードの親を取得します。getLineNo():このノードの行番号の位置を取得します。getColumnNo():このノードの列番号の位置を取得します。toSource():このノードのソースを取得します。ソースはこのノードとその子に基づいています。getTypeName():このノードのノードタイプ名を取得します。たとえば、ソースの関数呼び出しは、タイプ名「CALL」のノードとしてトークン化されます。注:node.getTypeName()の値は、抽象構文ツリー (AST) のさまざまなタイプのノードから取得されます。可能な値は、Rhino の AST パーサー自体から取得されます。getNameIdentifier():このノードのノードタイプが「NAME」の場合、名前自体の文字列値である識別子を返します。「NAME」ノードは、関数名や変数名など、キーワードではない単純な名前を表します。注:このノードが NAME ノードでない場合、結果は null になります。getAbsolutePosition():このノードの絶対位置を取得します。絶対位置は、スクリプトの先頭からこのノードまでの文字数ですcompareTo(other):このノードを別のノードと比較します。ノードの絶対位置と長さが大きいほど比較での差が大きくなります。otherはこのノードと比較するノードですvisit(callbackFunction):このノードから始まるサブツリー内の各ノードにアクセスし、各ノードで指定されたコールバック関数を実行します。callbackFunctionは、このノードのサブツリー内の各ノードで実行される関数です。このコールバック関数は、アクセス先ノードとなるパラメーターとして LinterCheckAstNode を取ります。debugPrint():このノードから始まる抽象構文ツリーの文字列表現を返します。各行にはノードに関する情報が含まれ、インデントはノード間の階層関係を表します。各行の情報は次のように配置されます。- 絶対位置
- ノードタイプ名
- 親を基準とした位置
- 長さ
- 名前識別子 (NAME ノードの場合)