Skip to content

Commit

Permalink
update dot-location
Browse files Browse the repository at this point in the history
  • Loading branch information
mysticatea committed Jun 13, 2020
1 parent f2dc7f2 commit 33e4986
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 14 deletions.
33 changes: 19 additions & 14 deletions lib/rules/dot-location.js
Expand Up @@ -52,31 +52,36 @@ module.exports = {
*/
function checkDotLocation(node) {
const property = node.property;
const dot = sourceCode.getTokenBefore(property);

// `obj` expression can be parenthesized, but those paren tokens are not a part of the `obj` node.
const tokenBeforeDot = sourceCode.getTokenBefore(dot);

const textBeforeDot = sourceCode.getText().slice(tokenBeforeDot.range[1], dot.range[0]);
const textAfterDot = sourceCode.getText().slice(dot.range[1], property.range[0]);
const dotToken = sourceCode.getTokenBefore(property);

if (onObject) {
if (!astUtils.isTokenOnSameLine(tokenBeforeDot, dot)) {
const neededTextAfterToken = astUtils.isDecimalIntegerNumericToken(tokenBeforeDot) ? " " : "";

// `obj` expression can be parenthesized, but those paren tokens are not a part of the `obj` node.
const tokenBeforeDot = sourceCode.getTokenBefore(dotToken);

if (!astUtils.isTokenOnSameLine(tokenBeforeDot, dotToken)) {
context.report({
node,
loc: dot.loc,
loc: dotToken.loc,
messageId: "expectedDotAfterObject",
fix: fixer => fixer.replaceTextRange([tokenBeforeDot.range[1], property.range[0]], `${neededTextAfterToken}.${textBeforeDot}${textAfterDot}`)
*fix(fixer) {
if (astUtils.isDecimalIntegerNumericToken(tokenBeforeDot)) {
yield fixer.insertTextAfter(tokenBeforeDot, " ");
}
yield fixer.insertTextAfter(tokenBeforeDot, dotToken.value);
yield fixer.remove(dotToken);
}
});
}
} else if (!astUtils.isTokenOnSameLine(dot, property)) {
} else if (!astUtils.isTokenOnSameLine(dotToken, property)) {
context.report({
node,
loc: dot.loc,
loc: dotToken.loc,
messageId: "expectedDotBeforeProperty",
fix: fixer => fixer.replaceTextRange([tokenBeforeDot.range[1], property.range[0]], `${textBeforeDot}${textAfterDot}.`)
*fix(fixer) {
yield fixer.remove(dotToken);
yield fixer.insertTextBefore(property, dotToken.value);
}
});
}
}
Expand Down
78 changes: 78 additions & 0 deletions tests/lib/rules/dot-location.js
Expand Up @@ -136,6 +136,68 @@ ruleTester.run("dot-location", rule, {
{
code: "(\na &&\nb()\n).toString()",
options: ["object"]
},

// Optional chaining
{
code: "obj?.prop",
options: ["object"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.[key]",
options: ["object"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.\nprop",
options: ["object"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj\n?.[key]",
options: ["object"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.\n[key]",
options: ["object"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.[\nkey]",
options: ["object"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.prop",
options: ["property"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.[key]",
options: ["property"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj\n?.prop",
options: ["property"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj\n?.[key]",
options: ["property"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.\n[key]",
options: ["property"],
parserOptions: { ecmaVersion: 2020 }
},
{
code: "obj?.[\nkey]",
options: ["property"],
parserOptions: { ecmaVersion: 2020 }
}
],
invalid: [
Expand Down Expand Up @@ -255,6 +317,22 @@ ruleTester.run("dot-location", rule, {
output: "(5).\ntoExponential()",
options: ["object"],
errors: [{ messageId: "expectedDotAfterObject", type: "MemberExpression", line: 2, column: 1 }]
},

// Optional chaining
{
code: "obj\n?.prop",
output: "obj?.\nprop",
options: ["object"],
parserOptions: { ecmaVersion: 2020 },
errors: [{ messageId: "expectedDotAfterObject" }]
},
{
code: "obj?.\nprop",
output: "obj\n?.prop",
options: ["property"],
parserOptions: { ecmaVersion: 2020 },
errors: [{ messageId: "expectedDotBeforeProperty" }]
}
]
});

0 comments on commit 33e4986

Please sign in to comment.