From ba3e667868ca789a11ee7e812bbe20a4da77eb09 Mon Sep 17 00:00:00 2001 From: Brian Schemp Date: Wed, 12 Jul 2017 17:38:44 -1000 Subject: [PATCH] Fix: Handle fixing objects containing comments (fixes #8484) References rule object-curly-newline. Avoid fixing line breaks when the token after opening brace is a comment or token before closing brace is a comment. --- lib/rules/object-curly-newline.js | 18 +++ tests/lib/rules/object-curly-newline.js | 139 ++++++++++++++++++++++++ 2 files changed, 157 insertions(+) diff --git a/lib/rules/object-curly-newline.js b/lib/rules/object-curly-newline.js index b78cb9cfce4..42f2778739d 100644 --- a/lib/rules/object-curly-newline.js +++ b/lib/rules/object-curly-newline.js @@ -143,6 +143,8 @@ module.exports = { first.loc.start.line !== last.loc.end.line ) ); + const hasCommentsFirstToken = astUtils.isCommentToken(first); + const hasCommentsLastToken = astUtils.isCommentToken(last); /* * Use tokens or comments to check multiline or not. @@ -162,6 +164,10 @@ module.exports = { node, loc: openBrace.loc.start, fix(fixer) { + if (hasCommentsFirstToken) { + return null; + } + return fixer.insertTextAfter(openBrace, "\n"); } }); @@ -172,6 +178,10 @@ module.exports = { node, loc: closeBrace.loc.start, fix(fixer) { + if (hasCommentsLastToken) { + return null; + } + return fixer.insertTextBefore(closeBrace, "\n"); } }); @@ -190,6 +200,10 @@ module.exports = { node, loc: openBrace.loc.start, fix(fixer) { + if (hasCommentsFirstToken) { + return null; + } + return fixer.removeRange([ openBrace.range[1], first.range[0] @@ -206,6 +220,10 @@ module.exports = { node, loc: closeBrace.loc.start, fix(fixer) { + if (hasCommentsLastToken) { + return null; + } + return fixer.removeRange([ last.range[1], closeBrace.range[0] diff --git a/tests/lib/rules/object-curly-newline.js b/tests/lib/rules/object-curly-newline.js index 05376e0d4a2..ce8f8716565 100644 --- a/tests/lib/rules/object-curly-newline.js +++ b/tests/lib/rules/object-curly-newline.js @@ -584,6 +584,31 @@ ruleTester.run("object-curly-newline", rule, { { line: 2, column: 1, message: "Unexpected line break before this closing brace." } ] }, + { + code: [ + "var a = {", + " /* comment */ ", + "};" + ].join("\n"), + output: null, + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Unexpected line break after this opening brace." }, + { line: 3, column: 1, message: "Unexpected line break before this closing brace." } + ] + }, + { + code: [ + "var a = { // comment", + "};" + ].join("\n"), + output: null, + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Unexpected line break after this opening brace." }, + { line: 2, column: 1, message: "Unexpected line break before this closing brace." } + ] + }, { code: [ "var b = {", @@ -599,6 +624,22 @@ ruleTester.run("object-curly-newline", rule, { { line: 3, column: 1, message: "Unexpected line break before this closing brace." } ] }, + { + code: [ + "var b = {", + " a: 1 // comment", + "};" + ].join("\n"), + output: [ + "var b = {a: 1 // comment", + "};" + ].join("\n"), + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Unexpected line break after this opening brace." }, + { line: 3, column: 1, message: "Unexpected line break before this closing brace." } + ] + }, { code: [ "var c = {", @@ -614,6 +655,22 @@ ruleTester.run("object-curly-newline", rule, { { line: 3, column: 1, message: "Unexpected line break before this closing brace." } ] }, + { + code: [ + "var c = {", + " a: 1, b: 2 // comment", + "};" + ].join("\n"), + output: [ + "var c = {a: 1, b: 2 // comment", + "};" + ].join("\n"), + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Unexpected line break after this opening brace." }, + { line: 3, column: 1, message: "Unexpected line break before this closing brace." } + ] + }, { code: [ "var d = {a: 1,", @@ -631,6 +688,23 @@ ruleTester.run("object-curly-newline", rule, { { line: 2, column: 9, message: "Expected a line break before this closing brace." } ] }, + { + code: [ + "var d = {a: 1, // comment", + " b: 2};" + ].join("\n"), + output: [ + "var d = {", + "a: 1, // comment", + " b: 2", + "};" + ].join("\n"), + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Expected a line break after this opening brace." }, + { line: 2, column: 9, message: "Expected a line break before this closing brace." } + ] + }, { code: [ "var e = {a: function foo() {", @@ -650,6 +724,71 @@ ruleTester.run("object-curly-newline", rule, { { line: 3, column: 2, message: "Expected a line break before this closing brace." } ] }, + { + code: [ + "var e = {a: function foo() { // comment", + " dosomething();", + "}};" + ].join("\n"), + output: [ + "var e = {", + "a: function foo() { // comment", + " dosomething();", + "}", + "};" + ].join("\n"), + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Expected a line break after this opening brace." }, + { line: 3, column: 2, message: "Expected a line break before this closing brace." } + ] + }, + { + code: [ + "var e = {a: 1, /* comment */", + " b: 2, // another comment", + "};" + ].join("\n"), + output: [ + "var e = {", + "a: 1, /* comment */", + " b: 2, // another comment", + "};" + ].join("\n"), + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Expected a line break after this opening brace." } + ] + }, + { + code: [ + "var f = { /* comment */ a:", + "2", + "};" + ].join("\n"), + output: null, + options: [{ multiline: true }], + errors: [ + { line: 1, column: 9, message: "Expected a line break after this opening brace." } + ] + }, + { + code: [ + "var f = {", + "/* comment */", + "a: 1};" + ].join("\n"), + output: [ + "var f = {", + "/* comment */", + "a: 1", + "};" + ].join("\n"), + options: [{ multiline: true }], + errors: [ + { line: 3, column: 5, message: "Expected a line break before this closing brace." } + ] + }, // "minProperties" ---------------------------------------------------------- {