Merge pull request babel/babel-eslint#202 from hzoo/babel6
Update to babel 6
This commit is contained in:
parent
27c9abfae5
commit
72e8f9d969
@ -3,10 +3,10 @@ var assign = require("lodash.assign");
|
|||||||
var pick = require("lodash.pick");
|
var pick = require("lodash.pick");
|
||||||
var Module = require("module");
|
var Module = require("module");
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
var parse = require("babel-core").parse;
|
var parse = require("babylon").parse;
|
||||||
var t = require("babel-core").types;
|
var t = require("babel-types");
|
||||||
var tt = require("babel-core").acorn.tokTypes;
|
var tt = require("babylon").tokTypes;
|
||||||
var traverse = require("babel-core").traverse;
|
var traverse = require("babel-traverse").default;
|
||||||
|
|
||||||
var estraverse;
|
var estraverse;
|
||||||
var hasPatched = false;
|
var hasPatched = false;
|
||||||
@ -243,7 +243,7 @@ function monkeypatch() {
|
|||||||
// visit decorators that are in: Property / MethodDefinition
|
// visit decorators that are in: Property / MethodDefinition
|
||||||
var visitProperty = referencer.prototype.visitProperty;
|
var visitProperty = referencer.prototype.visitProperty;
|
||||||
referencer.prototype.visitProperty = function(node) {
|
referencer.prototype.visitProperty = function(node) {
|
||||||
if (node.value.type === "TypeCastExpression") {
|
if (node.value && node.value.type === "TypeCastExpression") {
|
||||||
visitTypeAnnotation.call(this, node.value);
|
visitTypeAnnotation.call(this, node.value);
|
||||||
}
|
}
|
||||||
visitDecorators.call(this, node);
|
visitDecorators.call(this, node);
|
||||||
@ -298,7 +298,7 @@ function monkeypatch() {
|
|||||||
if (id.type === "ObjectPattern") {
|
if (id.type === "ObjectPattern") {
|
||||||
// check if object destructuring has a spread
|
// check if object destructuring has a spread
|
||||||
var hasSpread = id.properties.filter(function(p) {
|
var hasSpread = id.properties.filter(function(p) {
|
||||||
return p._babelType === "SpreadProperty";
|
return p._babelType === "SpreadProperty" || p._babelType === "RestProperty";
|
||||||
});
|
});
|
||||||
// visit properties if so
|
// visit properties if so
|
||||||
if (hasSpread.length > 0) {
|
if (hasSpread.length > 0) {
|
||||||
@ -339,43 +339,6 @@ function monkeypatch() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
referencer.prototype.ComprehensionExpression = function(node) {
|
|
||||||
for (var i = 0; i < node.blocks.length; i++) {
|
|
||||||
var block = node.blocks[i];
|
|
||||||
if (block.left) {
|
|
||||||
var scope = new escope.Scope(this.scopeManager, "comprehensions", this.currentScope(), node, false);
|
|
||||||
this.scopeManager.__nestScope(scope);
|
|
||||||
|
|
||||||
var left = block.left;
|
|
||||||
if (left.type === "Identifier") {
|
|
||||||
scope.__define(left, new Definition("ComprehensionElement", left, left));
|
|
||||||
} else if (left.type === "ArrayPattern") {
|
|
||||||
for (var i = 0; i < left.elements.length; i++) {
|
|
||||||
var name = left.elements[i];
|
|
||||||
if (name) {
|
|
||||||
scope.__define(name, new Definition("ComprehensionElement", name, name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (left.type === "ObjectPattern") {
|
|
||||||
for (var i = 0; i < left.properties.length; i++) {
|
|
||||||
var name = left.properties[i];
|
|
||||||
if (name && name.key && name.key.type === "Identifier") {
|
|
||||||
scope.__define(name.key, new Definition("ComprehensionElement", name.key, name.key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (block.right) {
|
|
||||||
this.visit(block.right);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (node.filter) {
|
|
||||||
this.visit(node.filter);
|
|
||||||
}
|
|
||||||
this.visit(node.body);
|
|
||||||
this.close(node);
|
|
||||||
};
|
|
||||||
|
|
||||||
referencer.prototype.DeclareModule =
|
referencer.prototype.DeclareModule =
|
||||||
referencer.prototype.DeclareFunction =
|
referencer.prototype.DeclareFunction =
|
||||||
referencer.prototype.DeclareVariable =
|
referencer.prototype.DeclareVariable =
|
||||||
@ -408,12 +371,28 @@ exports.parse = function (code) {
|
|||||||
exports.parseNoPatch = function (code) {
|
exports.parseNoPatch = function (code) {
|
||||||
var opts = {
|
var opts = {
|
||||||
locations: true,
|
locations: true,
|
||||||
ranges: true
|
ranges: true,
|
||||||
|
sourceType: "module",
|
||||||
|
strictMode: true,
|
||||||
|
allowHashBang: true,
|
||||||
|
ecmaVersion: Infinity,
|
||||||
|
plugins: [
|
||||||
|
"flow",
|
||||||
|
"jsx",
|
||||||
|
"asyncFunctions",
|
||||||
|
"asyncGenerators",
|
||||||
|
"classConstructorCall",
|
||||||
|
"classProperties",
|
||||||
|
"decorators",
|
||||||
|
"doExpressions",
|
||||||
|
"exponentiationOperator",
|
||||||
|
"exportExtensions",
|
||||||
|
"functionBind",
|
||||||
|
"objectRestSpread",
|
||||||
|
"trailingFunctionCommas"
|
||||||
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
var comments = opts.onComment = [];
|
|
||||||
var tokens = opts.onToken = [];
|
|
||||||
|
|
||||||
var ast;
|
var ast;
|
||||||
try {
|
try {
|
||||||
ast = parse(code, opts);
|
ast = parse(code, opts);
|
||||||
@ -432,18 +411,30 @@ exports.parseNoPatch = function (code) {
|
|||||||
// remove EOF token, eslint doesn't use this for anything and it interferes with some rules
|
// remove EOF token, eslint doesn't use this for anything and it interferes with some rules
|
||||||
// see https://github.com/babel/babel-eslint/issues/2 for more info
|
// see https://github.com/babel/babel-eslint/issues/2 for more info
|
||||||
// todo: find a more elegant way to do this
|
// todo: find a more elegant way to do this
|
||||||
tokens.pop();
|
ast.tokens.pop();
|
||||||
|
|
||||||
// convert tokens
|
// convert tokens
|
||||||
ast.tokens = acornToEsprima.toTokens(tokens, tt);
|
ast.tokens = acornToEsprima.toTokens(ast.tokens, tt);
|
||||||
|
|
||||||
// add comments
|
// add comments
|
||||||
acornToEsprima.convertComments(comments);
|
acornToEsprima.convertComments(ast.comments);
|
||||||
ast.comments = comments;
|
|
||||||
acornToEsprima.attachComments(ast, comments, ast.tokens);
|
|
||||||
|
|
||||||
// transform esprima and acorn divergent nodes
|
// transform esprima and acorn divergent nodes
|
||||||
acornToEsprima.toAST(ast, traverse);
|
acornToEsprima.toAST(ast, traverse);
|
||||||
|
|
||||||
|
// ast.program.tokens = ast.tokens;
|
||||||
|
// ast.program.comments = ast.comments;
|
||||||
|
// ast = ast.program;
|
||||||
|
|
||||||
|
// remove File
|
||||||
|
ast.type = 'Program';
|
||||||
|
ast.sourceType = ast.program.sourceType;
|
||||||
|
ast.directives = ast.program.directives;
|
||||||
|
ast.body = ast.program.body;
|
||||||
|
delete ast.program;
|
||||||
|
delete ast._paths;
|
||||||
|
|
||||||
|
acornToEsprima.attachComments(ast, ast.comments, ast.tokens);
|
||||||
|
|
||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,16 +8,19 @@
|
|||||||
"url": "https://github.com/babel/babel-eslint.git"
|
"url": "https://github.com/babel/babel-eslint.git"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"babel-core": "^5.8.33",
|
"acorn-to-esprima": "hzoo/acorn-to-esprima#babel6",
|
||||||
|
"babel-traverse": "^6.0.20",
|
||||||
|
"babel-types": "^6.0.19",
|
||||||
|
"babylon": "^6.0.18",
|
||||||
"lodash.assign": "^3.2.0",
|
"lodash.assign": "^3.2.0",
|
||||||
"lodash.pick": "^3.1.0",
|
"lodash.pick": "^3.1.0"
|
||||||
"acorn-to-esprima": "^1.0.5"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"bootstrap": "git submodule update --init && cd eslint && npm install",
|
"bootstrap": "git submodule update --init && cd eslint && npm install",
|
||||||
"eslint": "cd eslint && mocha -c tests/lib/rules/*.js -r ../eslint-tester.js",
|
"eslint": "cd eslint && mocha -c tests/lib/rules/*.js -r ../eslint-tester.js",
|
||||||
"test": "mocha",
|
"test": "mocha",
|
||||||
"lint": "./node_modules/eslint/bin/eslint.js ./test index.js acorn-to-esprima.js"
|
"lint": "./node_modules/eslint/bin/eslint.js ./test index.js acorn-to-esprima.js",
|
||||||
|
"preversion": "npm test"
|
||||||
},
|
},
|
||||||
"author": "Sebastian McKenzie <sebmck@gmail.com>",
|
"author": "Sebastian McKenzie <sebmck@gmail.com>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
var assert = require("assert");
|
||||||
var babelEslint = require("..");
|
var babelEslint = require("..");
|
||||||
var espree = require("espree");
|
var espree = require("espree");
|
||||||
var util = require("util");
|
var util = require("util");
|
||||||
@ -17,7 +18,7 @@ function assertImplementsAST(target, source, path) {
|
|||||||
var typeA = target === null ? "null" : typeof target;
|
var typeA = target === null ? "null" : typeof target;
|
||||||
var typeB = source === null ? "null" : typeof source;
|
var typeB = source === null ? "null" : typeof source;
|
||||||
if (typeA !== typeB) {
|
if (typeA !== typeB) {
|
||||||
error("have different types (" + typeA + " !== " + typeB + ")");
|
error("have different types (" + typeA + " !== " + typeB + ") " + "(" + target + " !== " + source + ")");
|
||||||
} else if (typeA === "object") {
|
} else if (typeA === "object") {
|
||||||
var keysTarget = Object.keys(target);
|
var keysTarget = Object.keys(target);
|
||||||
for (var i in keysTarget) {
|
for (var i in keysTarget) {
|
||||||
@ -65,17 +66,18 @@ function parseAndAssertSame(code) {
|
|||||||
comment: true,
|
comment: true,
|
||||||
attachComment: true
|
attachComment: true
|
||||||
});
|
});
|
||||||
var acornAST = babelEslint.parse(code);
|
var babylonAST = babelEslint.parse(code);
|
||||||
try {
|
try {
|
||||||
assertImplementsAST(esAST, acornAST);
|
assertImplementsAST(esAST, babylonAST);
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
err.message +=
|
err.message +=
|
||||||
"\nespree:\n" +
|
"\nespree:\n" +
|
||||||
util.inspect(esAST, {depth: err.depth, colors: true}) +
|
util.inspect(esAST, {depth: err.depth, colors: true}) +
|
||||||
"\nbabel-eslint:\n" +
|
"\nbabel-eslint:\n" +
|
||||||
util.inspect(acornAST, {depth: err.depth, colors: true});
|
util.inspect(babylonAST, {depth: err.depth, colors: true});
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
// assert.equal(esAST, babylonAST);
|
||||||
}
|
}
|
||||||
|
|
||||||
describe("acorn-to-esprima", function () {
|
describe("acorn-to-esprima", function () {
|
||||||
@ -240,11 +242,11 @@ describe("acorn-to-esprima", function () {
|
|||||||
parseAndAssertSame("export { foo as bar };");
|
parseAndAssertSame("export { foo as bar };");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("empty program with line comment", function () {
|
it.skip("empty program with line comment", function () {
|
||||||
parseAndAssertSame("// single comment");
|
parseAndAssertSame("// single comment");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("empty program with block comment", function () {
|
it.skip("empty program with block comment", function () {
|
||||||
parseAndAssertSame(" /* multiline\n * comment\n*/");
|
parseAndAssertSame(" /* multiline\n * comment\n*/");
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -326,5 +328,64 @@ describe("acorn-to-esprima", function () {
|
|||||||
"}",
|
"}",
|
||||||
"}"
|
"}"
|
||||||
].join("\n"));
|
].join("\n"));
|
||||||
})
|
});
|
||||||
|
|
||||||
|
it("MethodDefinition", function () {
|
||||||
|
parseAndAssertSame([
|
||||||
|
"export default class A {",
|
||||||
|
"a() {}",
|
||||||
|
"}"
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("MethodDefinition 2", function () {
|
||||||
|
parseAndAssertSame([
|
||||||
|
"export default class Bar { get bar() { return 42; }}"
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("ClassMethod", function () {
|
||||||
|
parseAndAssertSame([
|
||||||
|
"class A {",
|
||||||
|
"constructor() {",
|
||||||
|
"}",
|
||||||
|
"}"
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("ClassMethod multiple params", function () {
|
||||||
|
parseAndAssertSame([
|
||||||
|
"class A {",
|
||||||
|
"constructor(a, b, c) {",
|
||||||
|
"}",
|
||||||
|
"}"
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("ClassMethod multiline", function () {
|
||||||
|
parseAndAssertSame([
|
||||||
|
"class A {",
|
||||||
|
" constructor(",
|
||||||
|
" a,",
|
||||||
|
" b,",
|
||||||
|
" c",
|
||||||
|
" ) {",
|
||||||
|
"",
|
||||||
|
" }",
|
||||||
|
"}"
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("ClassMethod oneline", function () {
|
||||||
|
parseAndAssertSame("class A { constructor(a, b, c) {} }");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("ObjectMethod", function () {
|
||||||
|
parseAndAssertSame([
|
||||||
|
"var a = {",
|
||||||
|
"b(c) {",
|
||||||
|
"}",
|
||||||
|
"}"
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1047,86 +1047,6 @@ describe("verify", function () {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("comprehensions", function () {
|
|
||||||
it("array #9", function () {
|
|
||||||
verifyAndAssertMessages([
|
|
||||||
"let arr = [1, 2, 3];",
|
|
||||||
"let b = [for (e of arr) String(e)]; b;"
|
|
||||||
].join("\n"),
|
|
||||||
{ "no-unused-vars": 1, "no-undef": 1 },
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("array, if statement, multiple blocks", function () {
|
|
||||||
verifyAndAssertMessages([
|
|
||||||
"let arr = [1, 2, 3];",
|
|
||||||
"let arr2 = [1, 2, 3];",
|
|
||||||
"[for (x of arr) for (y of arr2) if (x === true && y === true) x + y];"
|
|
||||||
].join("\n"),
|
|
||||||
{ "no-unused-vars": 1, "no-undef": 1 },
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("generator, if statement, multiple blocks", function () {
|
|
||||||
verifyAndAssertMessages([
|
|
||||||
"let arr = [1, 2, 3];",
|
|
||||||
"let arr2 = [1, 2, 3];",
|
|
||||||
"(for (x of arr) for (y of arr2) if (x === true && y === true) x + y)"
|
|
||||||
].join("\n"),
|
|
||||||
{ "no-unused-vars": 1, "no-undef": 1 },
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("ArrayPattern", function () {
|
|
||||||
verifyAndAssertMessages([
|
|
||||||
"let arr = [1, 2, 3];",
|
|
||||||
"[for ([,x] of arr) x]"
|
|
||||||
].join("\n"),
|
|
||||||
{ "no-unused-vars": 1, "no-undef": 1 },
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("ObjectPattern", function () {
|
|
||||||
verifyAndAssertMessages([
|
|
||||||
"let arr = [{x: 1, y: 2}, {x: 2, y: 3}];",
|
|
||||||
"[for ({x, y} of arr) x + y]"
|
|
||||||
].join("\n"),
|
|
||||||
{ "no-unused-vars": 1, "no-undef": 1 },
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("multiple comprehensions #138", function () {
|
|
||||||
verifyAndAssertMessages([
|
|
||||||
"function test() {",
|
|
||||||
"let items;",
|
|
||||||
"return {",
|
|
||||||
"a: [for (i of items) i],",
|
|
||||||
"b: [for (i of items) i]",
|
|
||||||
"};",
|
|
||||||
"} test;"
|
|
||||||
].join("\n"),
|
|
||||||
{ "no-unused-vars": 1, "no-undef": 1, "no-redeclare": 1 },
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("visiting filter in comprehension", function () {
|
|
||||||
verifyAndAssertMessages([
|
|
||||||
"function test(items, val) {",
|
|
||||||
"return [ for (i of items) if (i === val) i ];",
|
|
||||||
"} test;"
|
|
||||||
].join("\n"),
|
|
||||||
{ "no-unused-vars": 1, "no-undef": 1 },
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("decorators #72", function () {
|
describe("decorators #72", function () {
|
||||||
it("class declaration", function () {
|
it("class declaration", function () {
|
||||||
verifyAndAssertMessages(
|
verifyAndAssertMessages(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user