ある開発者が非常に単純なプログラムを作成しました:
var a = 6;
var b = 7
console.log(a * b);
すべての開発者がすべてのASIルールを知っているとは限らないため、開発者がセミコロンを使用するようにしたいと考えています。他のコード品質チェックを追加する予定なので、Esprimaを使用して、チェック対象のコードのASTを生成したいと考えています。上記の単純なプログラムをEsprima オンライン パーサー([行と列ベース] オプションをオンにして) で解析すると、次の構造が作成されます。
{
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 19
}
},
"type": "Program",
"body": [
{
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 10
}
},
"type": "VariableDeclaration",
"declarations": [
{
"loc": {
"start": {
"line": 1,
"column": 4
},
"end": {
"line": 1,
"column": 9
}
},
"type": "VariableDeclarator",
"id": {
"loc": {
"start": {
"line": 1,
"column": 4
},
"end": {
"line": 1,
"column": 5
}
},
"type": "Identifier",
"name": "a"
},
"init": {
"loc": {
"start": {
"line": 1,
"column": 8
},
"end": {
"line": 1,
"column": 9
}
},
"type": "Literal",
"value": 6,
"raw": "6"
}
}
],
"kind": "var"
},
{
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 3,
"column": 0
}
},
"type": "VariableDeclaration",
"declarations": [
{
"loc": {
"start": {
"line": 2,
"column": 4
},
"end": {
"line": 2,
"column": 9
}
},
"type": "VariableDeclarator",
"id": {
"loc": {
"start": {
"line": 2,
"column": 4
},
"end": {
"line": 2,
"column": 5
}
},
"type": "Identifier",
"name": "b"
},
"init": {
"loc": {
"start": {
"line": 2,
"column": 8
},
"end": {
"line": 2,
"column": 9
}
},
"type": "Literal",
"value": 7,
"raw": "7"
}
}
],
"kind": "var"
},
{
"loc": {
"start": {
"line": 3,
"column": 0
},
"end": {
"line": 3,
"column": 19
}
},
"type": "ExpressionStatement",
"expression": {
"loc": {
"start": {
"line": 3,
"column": 0
},
"end": {
"line": 3,
"column": 18
}
},
"type": "CallExpression",
"callee": {
"loc": {
"start": {
"line": 3,
"column": 0
},
"end": {
"line": 3,
"column": 11
}
},
"type": "MemberExpression",
"computed": false,
"object": {
"loc": {
"start": {
"line": 3,
"column": 0
},
"end": {
"line": 3,
"column": 7
}
},
"type": "Identifier",
"name": "console"
},
"property": {
"loc": {
"start": {
"line": 3,
"column": 8
},
"end": {
"line": 3,
"column": 11
}
},
"type": "Identifier",
"name": "log"
}
},
"arguments": [
{
"loc": {
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 17
}
},
"type": "BinaryExpression",
"operator": "*",
"left": {
"loc": {
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
},
"type": "Identifier",
"name": "a"
},
"right": {
"loc": {
"start": {
"line": 3,
"column": 16
},
"end": {
"line": 3,
"column": 17
}
},
"type": "Identifier",
"name": "b"
}
}
]
}
}
]
}
セミコロンが使用されているか使用されていないかを確認するにはどうすればよいですか? VariableDeclaration
ASTの 2 番目は、以下に示すように で終了することを示しているため、おそらく 2 行目では 1 つは使用されていないと推測でき{line: 3, column: 0}
ます。
これは、Esprima を使用する他のツールが行う方法ですか? \r\n
vs\n
行末をチェックするのはどうですか?Esprima は、このタスクに適したツールではありませんか?
編集
この質問を共有した同僚は、トークンのリストを取得できるように、「おそらく解析ツリーが必要になるだろう」と言っていました。それで、私の問題の一部が解決します。Esprima が提供するトークンは次のとおりです。
[
{
"type": "Keyword",
"value": "var"
},
{
"type": "Identifier",
"value": "a"
},
{
"type": "Punctuator",
"value": "="
},
{
"type": "Numeric",
"value": "6"
},
{
"type": "Punctuator",
"value": ";"
},
{
"type": "Keyword",
"value": "var"
},
{
"type": "Identifier",
"value": "b"
},
{
"type": "Punctuator",
"value": "="
},
{
"type": "Numeric",
"value": "7"
},
{
"type": "Identifier",
"value": "console"
},
{
"type": "Punctuator",
"value": "."
},
{
"type": "Identifier",
"value": "log"
},
{
"type": "Punctuator",
"value": "("
},
{
"type": "Identifier",
"value": "a"
},
{
"type": "Punctuator",
"value": "*"
},
{
"type": "Identifier",
"value": "b"
},
{
"type": "Punctuator",
"value": ")"
},
{
"type": "Punctuator",
"value": ";"
}
]
ここで、このトークン リストを AST と組み合わせて使用し、行番号 2 にセミコロンが必要であることを伝える方法を理解する必要があります。