Skip to content

Commit d1cbc05

Browse files
Potential autofix improvement for jsx-wrap-mulitlines
This change should remove the newline that comes before a parentheses, if "parens-new-line" is specified as option and the multiline jsx starts on a new line.
1 parent c7dd755 commit d1cbc05

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

lib/rules/jsx-wrap-multilines.js

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,21 @@ module.exports = {
104104
return node.loc.start.line !== node.loc.end.line;
105105
}
106106

107-
function report(node, message, fixerFn) {
107+
function report(node, message, fix) {
108108
context.report({
109-
node: node,
110-
message: message,
111-
fix: fixerFn
109+
node,
110+
message,
111+
fix
112112
});
113113
}
114114

115+
function trimTokenBeforeNewline(node, tokenBefore) {
116+
// if the token before the jsx is a bracket or curly brace
117+
// we don't want a space between the opening parentheses and the multiline jsx
118+
const isBracket = tokenBefore.value === '{' || tokenBefore.value === '[';
119+
return `${tokenBefore.value.trim()}${isBracket ? '' : ' '}`;
120+
}
121+
115122
function check(node, type) {
116123
if (!node || node.type !== 'JSXElement') {
117124
return;
@@ -125,7 +132,17 @@ module.exports = {
125132

126133
if (option === 'parens-new-line' && isMultilines(node)) {
127134
if (!isParenthesised(node)) {
128-
report(node, MISSING_PARENS, fixer => fixer.replaceText(node, `(\n${sourceCode.getText(node)}\n)`));
135+
const tokenBefore = sourceCode.getTokenBefore(node, {includeComments: true});
136+
if (tokenBefore.loc.end.line < node.loc.start.line) {
137+
// Strip newline after operator if parens newline is specified
138+
report(
139+
node,
140+
MISSING_PARENS,
141+
fixer => fixer.replaceTextRange([tokenBefore.range[0], node.range[1]], `${trimTokenBeforeNewline(node, tokenBefore)}(\n${sourceCode.getText(node)}\n)`)
142+
);
143+
} else {
144+
report(node, MISSING_PARENS, fixer => fixer.replaceText(node, `(\n${sourceCode.getText(node)}\n)`));
145+
}
129146
} else if (needsNewLines(node)) {
130147
report(node, PARENS_NEW_LINES, fixer => fixer.replaceText(node, `\n${sourceCode.getText(node)}\n`));
131148
}
@@ -135,7 +152,6 @@ module.exports = {
135152
// --------------------------------------------------------------------------
136153
// Public
137154
// --------------------------------------------------------------------------
138-
139155
return {
140156

141157
VariableDeclarator: function(node) {
@@ -171,7 +187,7 @@ module.exports = {
171187
}
172188
},
173189

174-
'ArrowFunctionExpression:exit': function (node) {
190+
'ArrowFunctionExpression:exit': function(node) {
175191
const arrowBody = node.body;
176192
const type = 'arrow';
177193

@@ -195,7 +211,7 @@ module.exports = {
195211
}
196212
},
197213

198-
JSXAttribute: function (node) {
214+
JSXAttribute: function(node) {
199215
const type = 'prop';
200216
if (isEnabled(type) && node.value && node.value.type === 'JSXExpressionContainer') {
201217
check(node.value.expression, type);

tests/lib/rules/jsx-wrap-multilines.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,15 @@ const LOGICAL_NO_PAREN = `
249249
</div>
250250
`;
251251

252+
const LOGICAL_PAREN_NEW_LINE_AUTOFIX = `
253+
<div>
254+
{foo && (\n<div>
255+
<p>Hello World</p>
256+
</div>\n)
257+
}
258+
</div>
259+
`;
260+
252261
const LOGICAL_PAREN_NEW_LINE = `
253262
<div>
254263
{foo && (
@@ -291,6 +300,15 @@ const ATTR_PAREN_NEW_LINE = `
291300
</div>
292301
`;
293302

303+
const ATTR_PAREN_NEW_LINE_AUTOFIX = `
304+
<div prop={(\n<div>
305+
<p>Hello</p>
306+
</div>\n)
307+
}>
308+
<p>Hello</p>
309+
</div>
310+
`;
311+
294312
function addNewLineSymbols(code) {
295313
return code.replace(/\(</g, '(\n<').replace(/>\)/g, '>\n)');
296314
}
@@ -640,7 +658,7 @@ ruleTester.run('jsx-wrap-multilines', rule, {
640658
errors: [{message: PARENS_NEW_LINES}]
641659
}, {
642660
code: LOGICAL_NO_PAREN,
643-
output: addNewLineSymbols(LOGICAL_PAREN),
661+
output: LOGICAL_PAREN_NEW_LINE_AUTOFIX,
644662
options: [{logical: 'parens-new-line'}],
645663
errors: [{message: MISSING_PARENS}]
646664
}, {
@@ -650,9 +668,8 @@ ruleTester.run('jsx-wrap-multilines', rule, {
650668
errors: [{message: PARENS_NEW_LINES}]
651669
}, {
652670
code: ATTR_NO_PAREN,
653-
output: addNewLineSymbols(ATTR_PAREN),
671+
output: ATTR_PAREN_NEW_LINE_AUTOFIX,
654672
options: [{prop: 'parens-new-line'}],
655673
errors: [{message: MISSING_PARENS}]
656-
}
657-
]
674+
}]
658675
});

0 commit comments

Comments
 (0)