@@ -39,6 +39,132 @@ function getText(context, ...args) {
3939 return sourceCode . getText ? sourceCode . getText ( ...args ) : context . getSource ( ...args ) ;
4040}
4141
42+ function getFirstTokenOrSelf ( sourceCode , nodeOrToken ) {
43+ if ( ! nodeOrToken ) {
44+ return null ;
45+ }
46+
47+ try {
48+ return sourceCode . getFirstToken ( nodeOrToken ) || nodeOrToken ;
49+ } catch {
50+ return nodeOrToken ;
51+ }
52+ }
53+
54+ function getLastTokenOrSelf ( sourceCode , nodeOrToken ) {
55+ if ( ! nodeOrToken ) {
56+ return null ;
57+ }
58+
59+ try {
60+ return sourceCode . getLastToken ( nodeOrToken ) || nodeOrToken ;
61+ } catch {
62+ return nodeOrToken ;
63+ }
64+ }
65+
66+ function hasWhitespaceInToken ( token ) {
67+ return token
68+ && token . type === 'JSXText'
69+ && typeof token . value === 'string'
70+ && token . value . trim ( ) === ''
71+ && / \s / u. test ( token . value ) ;
72+ }
73+
74+ function hasWhitespaceTokenBetween ( sourceCode , firstNodeOrToken , secondNodeOrToken ) {
75+ const firstToken = getLastTokenOrSelf ( sourceCode , firstNodeOrToken ) ;
76+ const finalToken = getFirstTokenOrSelf ( sourceCode , secondNodeOrToken ) ;
77+
78+ let currentToken = firstToken ;
79+ while ( currentToken && currentToken !== finalToken ) {
80+ const nextToken = sourceCode . getTokenAfter ( currentToken , { includeComments : true } ) ;
81+
82+ if ( ! nextToken ) {
83+ return false ;
84+ }
85+
86+ if ( hasWhitespaceInToken ( nextToken ) ) {
87+ return true ;
88+ }
89+
90+ currentToken = nextToken ;
91+ }
92+
93+ return false ;
94+ }
95+
96+ function isSpaceBetweenTokens ( context , firstToken , secondToken ) {
97+ const sourceCode = getSourceCode ( context ) ;
98+
99+ if ( ! firstToken || ! secondToken ) {
100+ return false ;
101+ }
102+
103+ if (
104+ firstToken . range
105+ && secondToken . range
106+ && firstToken . range [ 0 ] < secondToken . range [ 1 ]
107+ && secondToken . range [ 0 ] < firstToken . range [ 1 ]
108+ ) {
109+ return false ;
110+ }
111+
112+ let first = firstToken ;
113+ let second = secondToken ;
114+
115+ // Order does not matter, but the SourceCode APIs generally assume it does.
116+ if ( first . range && second . range && first . range [ 1 ] > second . range [ 0 ] ) {
117+ [ first , second ] = [ second , first ] ;
118+ }
119+
120+ // ESLint v10+ provides `isSpaceBetween`. Older versions used `isSpaceBetweenTokens`.
121+ if ( typeof sourceCode . isSpaceBetweenTokens === 'function' ) {
122+ return sourceCode . isSpaceBetweenTokens ( first , second ) ;
123+ }
124+ if ( typeof sourceCode . isSpaceBetween === 'function' ) {
125+ return sourceCode . isSpaceBetween ( first , second ) || hasWhitespaceTokenBetween ( sourceCode , first , second ) ;
126+ }
127+
128+ if ( ! first . range || ! second . range ) {
129+ return false ;
130+ }
131+
132+ return / \s / u. test ( sourceCode . text . slice ( first . range [ 1 ] , second . range [ 0 ] ) ) ;
133+ }
134+
135+ function isSpaceBetween ( context , firstNodeOrToken , secondNodeOrToken ) {
136+ const sourceCode = getSourceCode ( context ) ;
137+
138+ if ( ! firstNodeOrToken || ! secondNodeOrToken ) {
139+ return false ;
140+ }
141+
142+ if (
143+ firstNodeOrToken . range
144+ && secondNodeOrToken . range
145+ && firstNodeOrToken . range [ 0 ] < secondNodeOrToken . range [ 1 ]
146+ && secondNodeOrToken . range [ 0 ] < firstNodeOrToken . range [ 1 ]
147+ ) {
148+ return false ;
149+ }
150+
151+ let first = firstNodeOrToken ;
152+ let second = secondNodeOrToken ;
153+
154+ // Order does not matter, but the SourceCode APIs generally assume it does.
155+ if ( first . range && second . range && first . range [ 1 ] > second . range [ 0 ] ) {
156+ [ first , second ] = [ second , first ] ;
157+ }
158+
159+ if ( typeof sourceCode . isSpaceBetween === 'function' ) {
160+ return sourceCode . isSpaceBetween ( first , second ) || hasWhitespaceTokenBetween ( sourceCode , first , second ) ;
161+ }
162+
163+ const firstToken = getLastTokenOrSelf ( sourceCode , first ) ;
164+ const secondToken = getFirstTokenOrSelf ( sourceCode , second ) ;
165+ return isSpaceBetweenTokens ( context , firstToken , secondToken ) ;
166+ }
167+
42168function getJSDocComment ( context , node ) {
43169 const sourceCode = getSourceCode ( context ) ;
44170
@@ -70,5 +196,7 @@ module.exports = {
70196 getScope,
71197 getSourceCode,
72198 getText,
199+ isSpaceBetween,
200+ isSpaceBetweenTokens,
73201 markVariableAsUsed,
74202} ;
0 commit comments