From 37e5193102d7544f155cdcb09c7c50dc602914d4 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Mon, 3 Jun 2019 06:32:50 +0800 Subject: [PATCH] Update: add `endColumn` to no-useless-escape (fixes #11629) (#11790) --- lib/rules/no-useless-escape.js | 7 +- tests/lib/rules/no-useless-escape.js | 98 ++++++++++++++-------------- 2 files changed, 55 insertions(+), 50 deletions(-) diff --git a/lib/rules/no-useless-escape.js b/lib/rules/no-useless-escape.js index f3764ce91e5..e161e4acedf 100644 --- a/lib/rules/no-useless-escape.js +++ b/lib/rules/no-useless-escape.js @@ -102,9 +102,14 @@ module.exports = { * @returns {void} */ function report(node, startOffset, character) { + const start = sourceCode.getLocFromIndex(sourceCode.getIndexFromLoc(node.loc.start) + startOffset); + context.report({ node, - loc: sourceCode.getLocFromIndex(sourceCode.getIndexFromLoc(node.loc.start) + startOffset), + loc: { + start, + end: { line: start.line, column: start.column + 1 } + }, message: "Unnecessary escape character: \\{{character}}.", data: { character } }); diff --git a/tests/lib/rules/no-useless-escape.js b/tests/lib/rules/no-useless-escape.js index 0acb1be668d..31f8969d3ef 100644 --- a/tests/lib/rules/no-useless-escape.js +++ b/tests/lib/rules/no-useless-escape.js @@ -127,163 +127,163 @@ ruleTester.run("no-useless-escape", rule, { ], invalid: [ - { code: "var foo = /\\#/;", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\#.", type: "Literal" }] }, - { code: "var foo = /\\;/;", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\;.", type: "Literal" }] }, - { code: "var foo = \"\\'\";", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\'.", type: "Literal" }] }, - { code: "var foo = \"\\#/\";", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\#.", type: "Literal" }] }, - { code: "var foo = \"\\a\"", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\a.", type: "Literal" }] }, - { code: "var foo = \"\\B\";", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\B.", type: "Literal" }] }, - { code: "var foo = \"\\@\";", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\@.", type: "Literal" }] }, - { code: "var foo = \"foo \\a bar\";", errors: [{ line: 1, column: 16, message: "Unnecessary escape character: \\a.", type: "Literal" }] }, - { code: "var foo = '\\\"';", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\\".", type: "Literal" }] }, - { code: "var foo = '\\#';", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\#.", type: "Literal" }] }, - { code: "var foo = '\\$';", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\$.", type: "Literal" }] }, - { code: "var foo = '\\p';", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\p.", type: "Literal" }] }, + { code: "var foo = /\\#/;", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\#.", type: "Literal" }] }, + { code: "var foo = /\\;/;", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\;.", type: "Literal" }] }, + { code: "var foo = \"\\'\";", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\'.", type: "Literal" }] }, + { code: "var foo = \"\\#/\";", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\#.", type: "Literal" }] }, + { code: "var foo = \"\\a\"", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\a.", type: "Literal" }] }, + { code: "var foo = \"\\B\";", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\B.", type: "Literal" }] }, + { code: "var foo = \"\\@\";", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\@.", type: "Literal" }] }, + { code: "var foo = \"foo \\a bar\";", errors: [{ line: 1, column: 16, endColumn: 17, message: "Unnecessary escape character: \\a.", type: "Literal" }] }, + { code: "var foo = '\\\"';", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\\".", type: "Literal" }] }, + { code: "var foo = '\\#';", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\#.", type: "Literal" }] }, + { code: "var foo = '\\$';", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\$.", type: "Literal" }] }, + { code: "var foo = '\\p';", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\p.", type: "Literal" }] }, { code: "var foo = '\\p\\a\\@';", errors: [ - { line: 1, column: 12, message: "Unnecessary escape character: \\p.", type: "Literal" }, - { line: 1, column: 14, message: "Unnecessary escape character: \\a.", type: "Literal" }, - { line: 1, column: 16, message: "Unnecessary escape character: \\@.", type: "Literal" } + { line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\p.", type: "Literal" }, + { line: 1, column: 14, endColumn: 15, message: "Unnecessary escape character: \\a.", type: "Literal" }, + { line: 1, column: 16, endColumn: 17, message: "Unnecessary escape character: \\@.", type: "Literal" } ] }, { code: "", parserOptions: { ecmaFeatures: { jsx: true } }, - errors: [{ line: 1, column: 13, message: "Unnecessary escape character: \\d.", type: "Literal" }] + errors: [{ line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\d.", type: "Literal" }] }, - { code: "var foo = '\\`';", errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\`.", type: "Literal" }] }, - { code: "var foo = `\\\"`;", parserOptions: { ecmaVersion: 6 }, errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\\".", type: "TemplateElement" }] }, - { code: "var foo = `\\'`;", parserOptions: { ecmaVersion: 6 }, errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\'.", type: "TemplateElement" }] }, - { code: "var foo = `\\#`;", parserOptions: { ecmaVersion: 6 }, errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\#.", type: "TemplateElement" }] }, + { code: "var foo = '\\`';", errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\`.", type: "Literal" }] }, + { code: "var foo = `\\\"`;", parserOptions: { ecmaVersion: 6 }, errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\\".", type: "TemplateElement" }] }, + { code: "var foo = `\\'`;", parserOptions: { ecmaVersion: 6 }, errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\'.", type: "TemplateElement" }] }, + { code: "var foo = `\\#`;", parserOptions: { ecmaVersion: 6 }, errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\#.", type: "TemplateElement" }] }, { code: "var foo = '\\`foo\\`';", errors: [ - { line: 1, column: 12, message: "Unnecessary escape character: \\`.", type: "Literal" }, - { line: 1, column: 17, message: "Unnecessary escape character: \\`.", type: "Literal" } + { line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\`.", type: "Literal" }, + { line: 1, column: 17, endColumn: 18, message: "Unnecessary escape character: \\`.", type: "Literal" } ] }, { code: "var foo = `\\\"${foo}\\\"`;", parserOptions: { ecmaVersion: 6 }, errors: [ - { line: 1, column: 12, message: "Unnecessary escape character: \\\".", type: "TemplateElement" }, - { line: 1, column: 20, message: "Unnecessary escape character: \\\".", type: "TemplateElement" } + { line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\\".", type: "TemplateElement" }, + { line: 1, column: 20, endColumn: 21, message: "Unnecessary escape character: \\\".", type: "TemplateElement" } ] }, { code: "var foo = `\\'${foo}\\'`;", parserOptions: { ecmaVersion: 6 }, errors: [ - { line: 1, column: 12, message: "Unnecessary escape character: \\'.", type: "TemplateElement" }, - { line: 1, column: 20, message: "Unnecessary escape character: \\'.", type: "TemplateElement" } + { line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\'.", type: "TemplateElement" }, + { line: 1, column: 20, endColumn: 21, message: "Unnecessary escape character: \\'.", type: "TemplateElement" } ] }, { code: "var foo = `\\#${foo}`;", parserOptions: { ecmaVersion: 6 }, - errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\#.", type: "TemplateElement" }] + errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\#.", type: "TemplateElement" }] }, { code: "let foo = '\\ ';", parserOptions: { ecmaVersion: 6 }, - errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\ .", type: "Literal" }] + errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\ .", type: "Literal" }] }, { code: "let foo = /\\ /;", parserOptions: { ecmaVersion: 6 }, - errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\ .", type: "Literal" }] + errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\ .", type: "Literal" }] }, { code: "var foo = `\\$\\{{${foo}`;", parserOptions: { ecmaVersion: 6 }, errors: [ - { line: 1, column: 12, message: "Unnecessary escape character: \\$.", type: "TemplateElement" } + { line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\$.", type: "TemplateElement" } ] }, { code: "var foo = `\\$a${foo}`;", parserOptions: { ecmaVersion: 6 }, errors: [ - { line: 1, column: 12, message: "Unnecessary escape character: \\$.", type: "TemplateElement" } + { line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\$.", type: "TemplateElement" } ] }, { code: "var foo = `a\\{{${foo}`;", parserOptions: { ecmaVersion: 6 }, errors: [ - { line: 1, column: 13, message: "Unnecessary escape character: \\{.", type: "TemplateElement" } + { line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\{.", type: "TemplateElement" } ] }, { code: String.raw`var foo = /[ab\-]/`, - errors: [{ line: 1, column: 15, message: "Unnecessary escape character: \\-.", type: "Literal" }] + errors: [{ line: 1, column: 15, endColumn: 16, message: "Unnecessary escape character: \\-.", type: "Literal" }] }, { code: String.raw`var foo = /[\-ab]/`, - errors: [{ line: 1, column: 13, message: "Unnecessary escape character: \\-.", type: "Literal" }] + errors: [{ line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\-.", type: "Literal" }] }, { code: String.raw`var foo = /[ab\?]/`, - errors: [{ line: 1, column: 15, message: "Unnecessary escape character: \\?.", type: "Literal" }] + errors: [{ line: 1, column: 15, endColumn: 16, message: "Unnecessary escape character: \\?.", type: "Literal" }] }, { code: String.raw`var foo = /[ab\.]/`, - errors: [{ line: 1, column: 15, message: "Unnecessary escape character: \\..", type: "Literal" }] + errors: [{ line: 1, column: 15, endColumn: 16, message: "Unnecessary escape character: \\..", type: "Literal" }] }, { code: String.raw`var foo = /[a\|b]/`, - errors: [{ line: 1, column: 14, message: "Unnecessary escape character: \\|.", type: "Literal" }] + errors: [{ line: 1, column: 14, endColumn: 15, message: "Unnecessary escape character: \\|.", type: "Literal" }] }, { code: String.raw`var foo = /\-/`, - errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\-.", type: "Literal" }] + errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\-.", type: "Literal" }] }, { code: String.raw`var foo = /[\-]/`, - errors: [{ line: 1, column: 13, message: "Unnecessary escape character: \\-.", type: "Literal" }] + errors: [{ line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\-.", type: "Literal" }] }, { code: String.raw`var foo = /[ab\$]/`, - errors: [{ line: 1, column: 15, message: "Unnecessary escape character: \\$.", type: "Literal" }] + errors: [{ line: 1, column: 15, endColumn: 16, message: "Unnecessary escape character: \\$.", type: "Literal" }] }, { code: String.raw`var foo = /[\(paren]/`, - errors: [{ line: 1, column: 13, message: "Unnecessary escape character: \\(.", type: "Literal" }] + errors: [{ line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\(.", type: "Literal" }] }, { code: String.raw`var foo = /[\[]/`, - errors: [{ line: 1, column: 13, message: "Unnecessary escape character: \\[.", type: "Literal" }] + errors: [{ line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\[.", type: "Literal" }] }, { code: String.raw`var foo = /[\/]/`, // A character class containing '/' - errors: [{ line: 1, column: 13, message: "Unnecessary escape character: \\/.", type: "Literal" }] + errors: [{ line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\/.", type: "Literal" }] }, { code: String.raw`var foo = /[\B]/`, - errors: [{ line: 1, column: 13, message: "Unnecessary escape character: \\B.", type: "Literal" }] + errors: [{ line: 1, column: 13, endColumn: 14, message: "Unnecessary escape character: \\B.", type: "Literal" }] }, { code: String.raw`var foo = /[a][\-b]/`, - errors: [{ line: 1, column: 16, message: "Unnecessary escape character: \\-.", type: "Literal" }] + errors: [{ line: 1, column: 16, endColumn: 17, message: "Unnecessary escape character: \\-.", type: "Literal" }] }, { code: String.raw`var foo = /\-[]/`, - errors: [{ line: 1, column: 12, message: "Unnecessary escape character: \\-.", type: "Literal" }] + errors: [{ line: 1, column: 12, endColumn: 13, message: "Unnecessary escape character: \\-.", type: "Literal" }] }, { code: String.raw`var foo = /[a\^]/`, - errors: [{ line: 1, column: 14, message: "Unnecessary escape character: \\^.", type: "Literal" }] + errors: [{ line: 1, column: 14, endColumn: 15, message: "Unnecessary escape character: \\^.", type: "Literal" }] }, { code: "`multiline template\nliteral with useless \\escape`", parserOptions: { ecmaVersion: 6 }, - errors: [{ line: 2, column: 22, message: "Unnecessary escape character: \\e.", type: "TemplateElement" }] + errors: [{ line: 2, column: 22, endColumn: 23, message: "Unnecessary escape character: \\e.", type: "TemplateElement" }] }, { code: "`\\a```", parserOptions: { ecmaVersion: 6 }, - errors: [{ line: 1, column: 2, message: "Unnecessary escape character: \\a.", type: "TemplateElement" }] + errors: [{ line: 1, column: 2, endColumn: 3, message: "Unnecessary escape character: \\a.", type: "TemplateElement" }] } ] });