@@ -148,7 +148,33 @@ module.exports = {
148148 * @returns {boolean } Whether or not there is a newline between the tokens.
149149 */
150150 function isMultiline ( left , right ) {
151- return left . loc . start . line !== right . loc . start . line ;
151+ return left . loc . end . line !== right . loc . start . line ;
152+ }
153+
154+ /**
155+ * Trims text of whitespace between two ranges
156+ * @param {Fixer } fixer - the eslint fixer object
157+ * @param {Location } fromLoc - the start location
158+ * @param {Location } toLoc - the end location
159+ * @param {string } mode - either 'start' or 'end'
160+ * @param {string= } spacing - a spacing value that will optionally add a space to the removed text
161+ * @returns {Object|*|{range, text} }
162+ */
163+ function fixByTrimmingWhitespace ( fixer , fromLoc , toLoc , mode , spacing ) {
164+ let replacementText = sourceCode . text . slice ( fromLoc , toLoc ) ;
165+ if ( mode === 'start' ) {
166+ replacementText = replacementText . replace ( / ^ \s + / gm, '' ) ;
167+ } else {
168+ replacementText = replacementText . replace ( / \s + $ / gm, '' ) ;
169+ }
170+ if ( spacing === SPACING . always ) {
171+ if ( mode === 'start' ) {
172+ replacementText += ' ' ;
173+ } else {
174+ replacementText = ` ${ replacementText } ` ;
175+ }
176+ }
177+ return fixer . replaceTextRange ( [ fromLoc , toLoc ] , replacementText ) ;
152178 }
153179
154180 /**
@@ -164,7 +190,7 @@ module.exports = {
164190 message : `There should be no newline after '${ token . value } '` ,
165191 fix : function ( fixer ) {
166192 const nextToken = sourceCode . getTokenAfter ( token ) ;
167- return fixer . replaceTextRange ( [ token . range [ 1 ] , nextToken . range [ 0 ] ] , spacing === SPACING . always ? ' ' : '' ) ;
193+ return fixByTrimmingWhitespace ( fixer , token . range [ 1 ] , nextToken . range [ 0 ] , 'start' , spacing ) ;
168194 }
169195 } ) ;
170196 }
@@ -182,7 +208,7 @@ module.exports = {
182208 message : `There should be no newline before '${ token . value } '` ,
183209 fix : function ( fixer ) {
184210 const previousToken = sourceCode . getTokenBefore ( token ) ;
185- return fixer . replaceTextRange ( [ previousToken . range [ 1 ] , token . range [ 0 ] ] , spacing === SPACING . always ? ' ' : '' ) ;
211+ return fixByTrimmingWhitespace ( fixer , previousToken . range [ 1 ] , token . range [ 0 ] , 'end' , spacing ) ;
186212 }
187213 } ) ;
188214 }
@@ -200,10 +226,7 @@ module.exports = {
200226 message : `There should be no space after '${ token . value } '` ,
201227 fix : function ( fixer ) {
202228 const nextToken = sourceCode . getTokenAfter ( token ) ;
203- const nextNode = sourceCode . getNodeByRangeIndex ( nextToken . range [ 0 ] ) ;
204- const leadingComments = sourceCode . getComments ( nextNode ) . leading ;
205- const rangeEndRef = leadingComments . length ? leadingComments [ 0 ] : nextToken ;
206- return fixer . removeRange ( [ token . range [ 1 ] , rangeEndRef . range [ 0 ] ] ) ;
229+ return fixByTrimmingWhitespace ( fixer , token . range [ 1 ] , nextToken . range [ 0 ] , 'start' ) ;
207230 }
208231 } ) ;
209232 }
@@ -221,10 +244,7 @@ module.exports = {
221244 message : `There should be no space before '${ token . value } '` ,
222245 fix : function ( fixer ) {
223246 const previousToken = sourceCode . getTokenBefore ( token ) ;
224- const previousNode = sourceCode . getNodeByRangeIndex ( previousToken . range [ 0 ] ) ;
225- const trailingComments = sourceCode . getComments ( previousNode ) . trailing ;
226- const rangeStartRef = trailingComments . length ? trailingComments [ trailingComments . length - 1 ] : previousToken ;
227- return fixer . removeRange ( [ rangeStartRef . range [ 1 ] , token . range [ 0 ] ] ) ;
247+ return fixByTrimmingWhitespace ( fixer , previousToken . range [ 1 ] , token . range [ 0 ] , 'end' ) ;
228248 }
229249 } ) ;
230250 }
0 commit comments