Skip to content

Commit d14ffb4

Browse files
author
Yannick Croissant
committed
Fix comment deletion in jsx-curly-spacing autofix (fixes #648)
1 parent e1abec9 commit d14ffb4

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

lib/rules/jsx-curly-spacing.js

+16-6
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ module.exports = {
8585
loc: token.loc.start,
8686
message: 'There should be no newline after \'' + token.value + '\'',
8787
fix: function(fixer) {
88-
var nextToken = context.getSourceCode().getTokenAfter(token);
88+
var nextToken = sourceCode.getTokenAfter(token);
8989
return fixer.replaceTextRange([token.range[1], nextToken.range[0]], spaced ? ' ' : '');
9090
}
9191
});
@@ -103,7 +103,7 @@ module.exports = {
103103
loc: token.loc.start,
104104
message: 'There should be no newline before \'' + token.value + '\'',
105105
fix: function(fixer) {
106-
var previousToken = context.getSourceCode().getTokenBefore(token);
106+
var previousToken = sourceCode.getTokenBefore(token);
107107
return fixer.replaceTextRange([previousToken.range[1], token.range[0]], spaced ? ' ' : '');
108108
}
109109
});
@@ -121,8 +121,10 @@ module.exports = {
121121
loc: token.loc.start,
122122
message: 'There should be no space after \'' + token.value + '\'',
123123
fix: function(fixer) {
124-
var nextToken = context.getSourceCode().getTokenAfter(token);
125-
return fixer.removeRange([token.range[1], nextToken.range[0]]);
124+
var nextToken = sourceCode.getTokenAfter(token);
125+
var leadingComments = sourceCode.getNodeByRangeIndex(nextToken.range[0]).leadingComments;
126+
var rangeEndRef = leadingComments ? leadingComments[0] : nextToken;
127+
return fixer.removeRange([token.range[1], rangeEndRef.range[0]]);
126128
}
127129
});
128130
}
@@ -139,8 +141,10 @@ module.exports = {
139141
loc: token.loc.start,
140142
message: 'There should be no space before \'' + token.value + '\'',
141143
fix: function(fixer) {
142-
var previousToken = context.getSourceCode().getTokenBefore(token);
143-
return fixer.removeRange([previousToken.range[1], token.range[0]]);
144+
var previousToken = sourceCode.getTokenBefore(token);
145+
var trailingComments = sourceCode.getNodeByRangeIndex(previousToken.range[0]).trailingComments;
146+
var rangeStartRef = trailingComments ? trailingComments[trailingComments.length - 1] : previousToken;
147+
return fixer.removeRange([rangeStartRef.range[1], token.range[0]]);
144148
}
145149
});
146150
}
@@ -194,6 +198,12 @@ module.exports = {
194198
var second = context.getTokenAfter(first);
195199
var penultimate = sourceCode.getTokenBefore(last);
196200

201+
var leadingComments = sourceCode.getNodeByRangeIndex(second.range[0]).leadingComments;
202+
second = leadingComments ? leadingComments[0] : second;
203+
204+
var trailingComments = sourceCode.getNodeByRangeIndex(penultimate.range[0]).trailingComments;
205+
penultimate = trailingComments ? trailingComments[trailingComments.length - 1] : penultimate;
206+
197207
var isObjectLiteral = first.value === second.value;
198208
if (isObjectLiteral) {
199209
if (objectLiteralSpacing === SPACING.never) {

tests/lib/rules/jsx-curly-spacing.js

+38
Original file line numberDiff line numberDiff line change
@@ -574,5 +574,43 @@ ruleTester.run('jsx-curly-spacing', rule, {
574574
message: 'A space is required before \'}\''
575575
}],
576576
parserOptions: parserOptions
577+
}, {
578+
code: '<div foo={ foo /* comment */ } />',
579+
output: '<div foo={foo /* comment */} />',
580+
errors: [{
581+
message: 'There should be no space after \'{\''
582+
}, {
583+
message: 'There should be no space before \'}\''
584+
}],
585+
parserOptions: parserOptions
586+
}, {
587+
code: '<div foo={foo /* comment */} />',
588+
output: '<div foo={ foo /* comment */ } />',
589+
options: ['always'],
590+
errors: [{
591+
message: 'A space is required after \'{\''
592+
}, {
593+
message: 'A space is required before \'}\''
594+
}],
595+
parserOptions: parserOptions
596+
}, {
597+
code: '<div foo={ /* comment */ foo } />',
598+
output: '<div foo={/* comment */ foo} />',
599+
errors: [{
600+
message: 'There should be no space after \'{\''
601+
}, {
602+
message: 'There should be no space before \'}\''
603+
}],
604+
parserOptions: parserOptions
605+
}, {
606+
code: '<div foo={/* comment */ foo} />',
607+
output: '<div foo={ /* comment */ foo } />',
608+
options: ['always'],
609+
errors: [{
610+
message: 'A space is required after \'{\''
611+
}, {
612+
message: 'A space is required before \'}\''
613+
}],
614+
parserOptions: parserOptions
577615
}]
578616
});

0 commit comments

Comments
 (0)