11import type { ASTNode , Tree } from '#types'
2+ import { isNotOpeningParenToken } from '#utils/ast'
23import { createRule } from '#utils/create-rule'
34
45import {
@@ -165,8 +166,9 @@ export default createRule<Options, MessageIds>({
165166 function checkTypeAnnotationSpacing (
166167 typeAnnotation : Tree . TypeNode ,
167168 ) : void {
168- const nextNode = typeAnnotation
169- const punctuatorTokenEnd = sourceCode . getTokenBefore ( nextNode ) !
169+ /** :, => */
170+ const punctuatorTokenEnd = sourceCode . getTokenBefore ( typeAnnotation , isNotOpeningParenToken ) !
171+ /** :, =>, ?() */
170172 let punctuatorTokenStart = punctuatorTokenEnd
171173 let previousToken = sourceCode . getTokenBefore ( punctuatorTokenEnd ) !
172174 let type = punctuatorTokenEnd . value
@@ -177,9 +179,8 @@ export default createRule<Options, MessageIds>({
177179 const { before, after } = getRules ( ruleSet , typeAnnotation )
178180
179181 if ( type === ':' && previousToken . value === '?' ) {
180- if (
181- sourceCode . isSpaceBetween ( previousToken , punctuatorTokenStart )
182- ) {
182+ // space between ? and :
183+ if ( sourceCode . isSpaceBetween ( previousToken , punctuatorTokenStart ) ) {
183184 context . report ( {
184185 node : punctuatorTokenStart ,
185186 messageId : 'unexpectedSpaceBetween' ,
@@ -209,11 +210,9 @@ export default createRule<Options, MessageIds>({
209210 }
210211 }
211212
212- const previousDelta
213- = punctuatorTokenStart . range [ 0 ] - previousToken . range [ 1 ]
214- const nextDelta = nextNode . range [ 0 ] - punctuatorTokenEnd . range [ 1 ]
213+ const hasNextSpace = sourceCode . isSpaceBetween ( punctuatorTokenEnd , typeAnnotation )
215214
216- if ( after && nextDelta === 0 ) {
215+ if ( after && ! hasNextSpace ) {
217216 context . report ( {
218217 node : punctuatorTokenEnd ,
219218 messageId : 'expectedSpaceAfter' ,
@@ -225,7 +224,7 @@ export default createRule<Options, MessageIds>({
225224 } ,
226225 } )
227226 }
228- else if ( ! after && nextDelta > 0 ) {
227+ else if ( ! after && hasNextSpace ) {
229228 context . report ( {
230229 node : punctuatorTokenEnd ,
231230 messageId : 'unexpectedSpaceAfter' ,
@@ -235,13 +234,15 @@ export default createRule<Options, MessageIds>({
235234 fix ( fixer ) {
236235 return fixer . removeRange ( [
237236 punctuatorTokenEnd . range [ 1 ] ,
238- nextNode . range [ 0 ] ,
237+ typeAnnotation . range [ 0 ] ,
239238 ] )
240239 } ,
241240 } )
242241 }
243242
244- if ( before && previousDelta === 0 ) {
243+ const hasPrevSpace = sourceCode . isSpaceBetween ( previousToken , punctuatorTokenStart )
244+
245+ if ( before && ! hasPrevSpace ) {
245246 context . report ( {
246247 node : punctuatorTokenStart ,
247248 messageId : 'expectedSpaceBefore' ,
@@ -253,7 +254,7 @@ export default createRule<Options, MessageIds>({
253254 } ,
254255 } )
255256 }
256- else if ( ! before && previousDelta > 0 ) {
257+ else if ( ! before && hasPrevSpace ) {
257258 context . report ( {
258259 node : punctuatorTokenStart ,
259260 messageId : 'unexpectedSpaceBefore' ,
0 commit comments