是否JSLint的,JSHint,或代码遵守其他一些开源静态代码分析工具,支持添加自定义的规则,还是有,我可以用得到的结果尽可能接近在下面的代码段看到的那些部分的ECMAScript标准的解析器?
例如,我想看看JavaScript代码,并列出哪些功能是所谓的,如果它调用库(或通过智能手机对HTML5的部件提供的API),该API的命名空间下注册所有那年秋天,做一棵树该对象及其属性,看看功能是从什么对象可以追溯到叫出来,也许在XML,JSON或其他结构化格式的输出。
例如说我有这样的JavaScript代码(它什么都不是只是为参数的缘故):
jobs = mylibrary.getJobs();
found = jobs.find("Python");
list = found.convert("html");
我希望我的分析工具来得到这样的:
{
"mylibrary": {
"jobs": {"maker":"getJobs", "parent": "mylibrary"},
"found": {"maker": "find", "parent": "jobs", "parameters": "Python"},
"list": {"maker": "convert", "parent": "found"}
}
}
你应该能够建立这样的使用亚组的卷饼 ,它使用从解析器丑化-JS并给出了,我想,你所有你需要的。 快速示例:
src.js:
var jobs, found, list;
jobs = mylibrary.getJobs();
found = jobs.find("Python");
list = found.convert("html");
ast.js:
var fs = require('fs'),
burrito = require('burrito');
var src = fs.readFileSync('./src.js', 'utf8');
burrito(src, function (node) {
console.log(node.name, node.value);
});
正是你将如何建立你的要求的结构,我也不太清楚(我不是很精通AST解析自己),但我敢肯定,这将需要你做一些努力。 也许你不会需要在两者之间的结构,可以这么说,但可能只是验证每个节点从卷饼,其中每个call
节点会反对它被验证的值(函数名,对象名等),与它是否警告募集不验证。
下面是从输出burrito
呼叫以上(注意:单[Object]
或例如已经通过的node.js'截断console.log
。值实际上在从卷饼分析树节点,所以每个值已它相关的状态等) 。
var [ [ [ 'jobs' ], [ 'found' ], [ 'list' ] ] ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'jobs' ],
[ [Object], [Object], [] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'jobs' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'getJobs' ],
[] ] ]
name [ 'jobs' ]
call [ [ 'dot', [ 'name', 'mylibrary' ], 'getJobs' ], [] ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'found' ],
[ [Object], [Object], [Object] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'found' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'find' ],
[ [Object] ] ] ]
name [ 'found' ]
call [ [ 'dot', [ 'name', 'jobs' ], 'find' ],
[ [ [Object], 'Python' ] ] ]
string [ 'Python' ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'list' ],
[ [Object], [Object], [Object] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'list' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'convert' ],
[ [Object] ] ] ]
name [ 'list' ]
call [ [ 'dot', [ 'name', 'found' ], 'convert' ],
[ [ [Object], 'html' ] ] ]
string [ 'html' ]
更新:
另一种选择是较新的(?)ES解析器Esprima ,这似乎是双方更加积极地开发更好的记录。 它也比据说快丑化。 你可以尝试一下在如解析解析演示页 。 您是前人的精力能够建立使用这种一个很好的解决方案,记错。
我试着用,可以从代码中访问(在我的情况Python)的JavaScript解释的东西。 所以像口译pynoceros
, pynarcissus
或pyv8
可能会帮助我。
有一个答案在这里如何安装py8: https://stackoverflow.com/a/11879224/1577343
由于上述办法我也没有太多的成功,我更喜欢使用的ECMAScript的解析器的静态分析解决方案。
静态分析,据我可以得到使用JSLint的解析器( 运行JSLint的上.js文件从调试的Chrome或Firefox控制台 ):但我不知道如何进一步使用。
{
"string": "(begin)",
"first": [
{
"string": "var",
"arity": "statement",
"first": [
{
"string": "jobs"
},
{
"string": "found"
},
{
"string": "list"
}
]
},
{
"string": "=",
"arity": "infix",
"first": {
"string": "jobs"
},
"second": {
"string": "(",
"arity": "infix",
"first": {
"string": ".",
"arity": "infix",
"first": {
"string": "mylibrary"
},
"second": {
"string": "getJobs"
}
},
"second": []
}
},
{
"string": "=",
"arity": "infix",
"first": {
"string": "found"
},
"second": {
"string": "(",
"arity": "infix",
"first": {
"string": ".",
"arity": "infix",
"first": {
"string": "jobs"
},
"second": {
"string": "find"
}
},
"second": [
{
"string": "Python",
"arity": "string"
}
]
}
},
{
"string": "=",
"arity": "infix",
"first": {
"string": "list"
},
"second": {
"string": "(",
"arity": "infix",
"first": {
"string": ".",
"arity": "infix",
"first": {
"string": "found"
},
"second": {
"string": "convert"
}
},
"second": [
{
"string": "html",
"arity": "string"
}
]
}
}
]
}
PMD支持ECMAScript中使用自定义规则的静态分析:
使用当前的规则集作为例子之一。 复制并粘贴到新的文件,从中删除所有旧的规则,并更改名称和描述。
请注意,您可以自定义个人引用规则。 一切,但该类规则的可自定义的规则集覆盖。
您也可以通过使用排除模式的规则集进行处理,使用可选的首要排除某些文件包括模式。 甲文件将从处理时,有一个匹配的排除模式,但没有匹配的图案包括被排除。
在源文件路径的路径分隔符被归一化成为“/”字符,所以相同的规则集可以在多个平台上透明地使用。
另外,该排除/包括技术的原理,无论PMD是如何使用的(如命令行,IDE,蚂蚁),使其更容易让你的PMD应用程序规则在整个环境保持一致。
您可以指定到您的自定义规则集名称的完整路径的旁边内置的PMD规则集
要看到它在你的IDE,它添加到规则集/ rulesets.properties
参考