Merge pull request babel/eslint-plugin-babel#39 from zaygraveyard/issue37

Update: Implement auto fix for object-curly-spacing (fixes babel/eslint-plugin-babel#37)
This commit is contained in:
Jason Quense 2015-12-20 17:14:32 -05:00
parent 9eebd7b057
commit b5cdcbe06e
2 changed files with 72 additions and 17 deletions

View File

@ -67,8 +67,15 @@ module.exports = function(context) {
* @returns {void} * @returns {void}
*/ */
function reportNoBeginningSpace(node, token) { function reportNoBeginningSpace(node, token) {
context.report(node, token.loc.end, context.report({
"There should be no space after '" + token.value + "'"); node: node,
loc: token.loc.end,
message: "There should be no space after '" + token.value + "'",
fix: function(fixer) {
var nextToken = sourceCode.getTokenAfter(token);
return fixer.removeRange([token.range[1], nextToken.range[0]]);
}
});
} }
/** /**
@ -78,8 +85,15 @@ module.exports = function(context) {
* @returns {void} * @returns {void}
*/ */
function reportNoEndingSpace(node, token) { function reportNoEndingSpace(node, token) {
context.report(node, token.loc.start, context.report({
"There should be no space before '" + token.value + "'"); node: node,
loc: token.loc.start,
message: "There should be no space before '" + token.value + "'",
fix: function(fixer) {
var previousToken = sourceCode.getTokenBefore(token);
return fixer.removeRange([previousToken.range[1], token.range[0]]);
}
});
} }
/** /**
@ -89,8 +103,14 @@ module.exports = function(context) {
* @returns {void} * @returns {void}
*/ */
function reportRequiredBeginningSpace(node, token) { function reportRequiredBeginningSpace(node, token) {
context.report(node, token.loc.end, context.report({
"A space is required after '" + token.value + "'"); node: node,
loc: token.loc.end,
message: "A space is required after '" + token.value + "'",
fix: function(fixer) {
return fixer.insertTextAfter(token, " ");
}
});
} }
/** /**
@ -100,8 +120,14 @@ module.exports = function(context) {
* @returns {void} * @returns {void}
*/ */
function reportRequiredEndingSpace(node, token) { function reportRequiredEndingSpace(node, token) {
context.report(node, token.loc.start, context.report({
"A space is required before '" + token.value + "'"); node: node,
loc: token.loc.start,
message: "A space is required before '" + token.value + "'",
fix: function(fixer) {
return fixer.insertTextBefore(token, " ");
}
});
} }
/** /**

View File

@ -143,17 +143,12 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// Babel test cases. // Babel test cases.
{ code: "export * as x from \"mod\";", parser: "babel-eslint", ecmaFeatures: { modules: true } }, { code: "export * as x from \"mod\";", parser: "babel-eslint", ecmaFeatures: { modules: true } },
{ code: "export x from \"mod\";", parser: "babel-eslint", ecmaFeatures: { modules: true } }, { code: "export x from \"mod\";", parser: "babel-eslint", ecmaFeatures: { modules: true } },
// always - destructuring typed object param
{ code: "function fn({ a,b }:Object){}", options: ["always"], parser: "babel-eslint", ecmaFeatures: { destructuring: true } },
// never - destructuring typed object param
{ code: "function fn({a,b}: Object){}", options: ["never"], parser: "babel-eslint", ecmaFeatures: { destructuring: true } },
], ],
invalid: [ invalid: [
{ {
code: "import {bar} from 'foo.js';", code: "import {bar} from 'foo.js';",
output: "import { bar } from 'foo.js';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -175,6 +170,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import { bar as y} from 'foo.js';", code: "import { bar as y} from 'foo.js';",
output: "import { bar as y } from 'foo.js';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -190,6 +186,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import {bar as y} from 'foo.js';", code: "import {bar as y} from 'foo.js';",
output: "import { bar as y } from 'foo.js';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -211,6 +208,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import { bar} from 'foo.js';", code: "import { bar} from 'foo.js';",
output: "import { bar } from 'foo.js';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -226,6 +224,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import x, { bar} from 'foo';", code: "import x, { bar} from 'foo';",
output: "import x, { bar } from 'foo';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -242,6 +241,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import x, { bar, baz} from 'foo';", code: "import x, { bar, baz} from 'foo';",
output: "import x, { bar, baz } from 'foo';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -258,6 +258,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import x, {bar} from 'foo';", code: "import x, {bar} from 'foo';",
output: "import x, { bar } from 'foo';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -280,6 +281,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import x, {bar, baz} from 'foo';", code: "import x, {bar, baz} from 'foo';",
output: "import x, { bar, baz } from 'foo';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -301,6 +303,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import {bar,} from 'foo';", code: "import {bar,} from 'foo';",
output: "import { bar, } from 'foo';",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -323,6 +326,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "import { bar, } from 'foo';", code: "import { bar, } from 'foo';",
output: "import {bar,} from 'foo';",
options: ["never"], options: ["never"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -344,6 +348,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "export {bar};", code: "export {bar};",
output: "export { bar };",
options: ["always"], options: ["always"],
ecmaFeatures: { ecmaFeatures: {
modules: true modules: true
@ -367,6 +372,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// always - arraysInObjects // always - arraysInObjects
{ {
code: "var obj = { 'foo': [ 1, 2 ] };", code: "var obj = { 'foo': [ 1, 2 ] };",
output: "var obj = { 'foo': [ 1, 2 ]};",
options: ["always", {"arraysInObjects": false}], options: ["always", {"arraysInObjects": false}],
errors: [ errors: [
{ {
@ -377,6 +383,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = { 'foo': [ 1, 2 ] , 'bar': [ 'baz', 'qux' ] };", code: "var obj = { 'foo': [ 1, 2 ] , 'bar': [ 'baz', 'qux' ] };",
output: "var obj = { 'foo': [ 1, 2 ] , 'bar': [ 'baz', 'qux' ]};",
options: ["always", {"arraysInObjects": false}], options: ["always", {"arraysInObjects": false}],
errors: [ errors: [
{ {
@ -389,6 +396,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// always-objectsInObjects // always-objectsInObjects
{ {
code: "var obj = { 'foo': { 'bar': 1, 'baz': 2 } };", code: "var obj = { 'foo': { 'bar': 1, 'baz': 2 } };",
output: "var obj = { 'foo': { 'bar': 1, 'baz': 2 }};",
options: ["always", {"objectsInObjects": false}], options: ["always", {"objectsInObjects": false}],
errors: [ errors: [
{ {
@ -401,6 +409,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = { 'foo': [ 1, 2 ] , 'bar': { 'baz': 1, 'qux': 2 } };", code: "var obj = { 'foo': [ 1, 2 ] , 'bar': { 'baz': 1, 'qux': 2 } };",
output: "var obj = { 'foo': [ 1, 2 ] , 'bar': { 'baz': 1, 'qux': 2 }};",
options: ["always", {"objectsInObjects": false}], options: ["always", {"objectsInObjects": false}],
errors: [ errors: [
{ {
@ -415,6 +424,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// always-destructuring trailing comma // always-destructuring trailing comma
{ {
code: "var { a,} = x;", code: "var { a,} = x;",
output: "var { a, } = x;",
options: ["always"], options: ["always"],
ecmaFeatures: { destructuring: true }, ecmaFeatures: { destructuring: true },
errors: [ errors: [
@ -428,6 +438,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var {a, } = x;", code: "var {a, } = x;",
output: "var {a,} = x;",
options: ["never"], options: ["never"],
ecmaFeatures: { destructuring: true }, ecmaFeatures: { destructuring: true },
errors: [ errors: [
@ -441,6 +452,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var {a:b } = x;", code: "var {a:b } = x;",
output: "var {a:b} = x;",
options: ["never"], options: ["never"],
ecmaFeatures: { destructuring: true }, ecmaFeatures: { destructuring: true },
errors: [ errors: [
@ -454,6 +466,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var { a:b } = x;", code: "var { a:b } = x;",
output: "var {a:b} = x;",
options: ["never"], options: ["never"],
ecmaFeatures: { destructuring: true }, ecmaFeatures: { destructuring: true },
errors: [ errors: [
@ -475,6 +488,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// never-objectsInObjects // never-objectsInObjects
{ {
code: "var obj = {'foo': {'bar': 1, 'baz': 2}};", code: "var obj = {'foo': {'bar': 1, 'baz': 2}};",
output: "var obj = {'foo': {'bar': 1, 'baz': 2} };",
options: ["never", {"objectsInObjects": true}], options: ["never", {"objectsInObjects": true}],
errors: [ errors: [
{ {
@ -487,6 +501,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = {'foo': [1, 2] , 'bar': {'baz': 1, 'qux': 2}};", code: "var obj = {'foo': [1, 2] , 'bar': {'baz': 1, 'qux': 2}};",
output: "var obj = {'foo': [1, 2] , 'bar': {'baz': 1, 'qux': 2} };",
options: ["never", {"objectsInObjects": true}], options: ["never", {"objectsInObjects": true}],
errors: [ errors: [
{ {
@ -501,6 +516,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// always & never // always & never
{ {
code: "var obj = {foo: bar, baz: qux};", code: "var obj = {foo: bar, baz: qux};",
output: "var obj = { foo: bar, baz: qux };",
options: ["always"], options: ["always"],
errors: [ errors: [
{ {
@ -519,6 +535,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = {foo: bar, baz: qux };", code: "var obj = {foo: bar, baz: qux };",
output: "var obj = { foo: bar, baz: qux };",
options: ["always"], options: ["always"],
errors: [ errors: [
{ {
@ -531,6 +548,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = { foo: bar, baz: qux};", code: "var obj = { foo: bar, baz: qux};",
output: "var obj = { foo: bar, baz: qux };",
options: ["always"], options: ["always"],
errors: [ errors: [
{ {
@ -543,6 +561,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = { foo: bar, baz: qux };", code: "var obj = { foo: bar, baz: qux };",
output: "var obj = {foo: bar, baz: qux};",
options: ["never"], options: ["never"],
errors: [ errors: [
{ {
@ -561,6 +580,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = {foo: bar, baz: qux };", code: "var obj = {foo: bar, baz: qux };",
output: "var obj = {foo: bar, baz: qux};",
options: ["never"], options: ["never"],
errors: [ errors: [
{ {
@ -573,6 +593,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = { foo: bar, baz: qux};", code: "var obj = { foo: bar, baz: qux};",
output: "var obj = {foo: bar, baz: qux};",
options: ["never"], options: ["never"],
errors: [ errors: [
{ {
@ -585,6 +606,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = { foo: { bar: quxx}, baz: qux};", code: "var obj = { foo: { bar: quxx}, baz: qux};",
output: "var obj = {foo: {bar: quxx}, baz: qux};",
options: ["never"], options: ["never"],
errors: [ errors: [
{ {
@ -603,6 +625,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = {foo: {bar: quxx }, baz: qux };", code: "var obj = {foo: {bar: quxx }, baz: qux };",
output: "var obj = {foo: {bar: quxx}, baz: qux};",
options: ["never"], options: ["never"],
errors: [ errors: [
{ {
@ -621,6 +644,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "export const thing = {value: 1 };", code: "export const thing = {value: 1 };",
output: "export const thing = { value: 1 };",
ecmaFeatures: { ecmaFeatures: {
modules: true, modules: true,
blockBindings: true blockBindings: true
@ -639,7 +663,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// destructuring // destructuring
{ {
code: "var {x, y} = y", code: "var {x, y} = y",
utput: "var { x, y = y", output: "var { x, y } = y",
ecmaFeatures: {destructuring: true}, ecmaFeatures: {destructuring: true},
options: ["always"], options: ["always"],
errors: [ errors: [
@ -659,7 +683,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var { x, y} = y", code: "var { x, y} = y",
ouput: "var { x, y } y", output: "var { x, y } = y",
ecmaFeatures: {destructuring: true}, ecmaFeatures: {destructuring: true},
options: ["always"], options: ["always"],
errors: [ errors: [
@ -673,7 +697,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var { x, y } = y", code: "var { x, y } = y",
ouput: "var {x, y} = ", output: "var {x, y} = y",
ecmaFeatures: {destructuring: true}, ecmaFeatures: {destructuring: true},
options: ["never"], options: ["never"],
errors: [ errors: [
@ -693,6 +717,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var {x, y } = y", code: "var {x, y } = y",
output: "var {x, y} = y",
ecmaFeatures: {destructuring: true}, ecmaFeatures: {destructuring: true},
options: ["never"], options: ["never"],
errors: [ errors: [
@ -706,6 +731,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var { x=10} = y", code: "var { x=10} = y",
output: "var { x=10 } = y",
ecmaFeatures: {destructuring: true}, ecmaFeatures: {destructuring: true},
options: ["always"], options: ["always"],
errors: [ errors: [
@ -719,6 +745,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var {x=10 } = y", code: "var {x=10 } = y",
output: "var { x=10 } = y",
ecmaFeatures: {destructuring: true}, ecmaFeatures: {destructuring: true},
options: ["always"], options: ["always"],
errors: [ errors: [
@ -734,6 +761,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
// never - arraysInObjects // never - arraysInObjects
{ {
code: "var obj = {'foo': [1, 2]};", code: "var obj = {'foo': [1, 2]};",
output: "var obj = {'foo': [1, 2] };",
options: ["never", {"arraysInObjects": true}], options: ["never", {"arraysInObjects": true}],
errors: [ errors: [
{ {
@ -744,6 +772,7 @@ ruleTester.run('babel/object-curly-spacing', rule, {
}, },
{ {
code: "var obj = {'foo': [1, 2] , 'bar': ['baz', 'qux']};", code: "var obj = {'foo': [1, 2] , 'bar': ['baz', 'qux']};",
output: "var obj = {'foo': [1, 2] , 'bar': ['baz', 'qux'] };",
options: ["never", {"arraysInObjects": true}], options: ["never", {"arraysInObjects": true}],
errors: [ errors: [
{ {