@@ -63,6 +63,24 @@ function buildProjectSymbolTable(files, scriptOrder) {
63
63
return symbolTable ;
64
64
}
65
65
66
+ const jumpToLineChAfterLoad = ( targetFileId , pos ) => {
67
+ let tries = 10 ;
68
+ const tryJump = ( ) => {
69
+ const stateNow = store . getState ( ) ;
70
+ const filesNow = selectFiles ( stateNow ) ;
71
+ const freshTarget = filesNow . find ( ( f ) => f . id === targetFileId ) ; // get fresh copy
72
+ const cm = freshTarget ?. cmInstance ;
73
+
74
+ if ( cm ) {
75
+ cm . setCursor ( pos ) ;
76
+ cm . focus ( ) ;
77
+ } else if ( tries -- > 0 ) {
78
+ setTimeout ( tryJump , 30 ) ;
79
+ }
80
+ } ;
81
+ tryJump ( ) ;
82
+ } ;
83
+
66
84
export function jumpToDefinition ( pos ) {
67
85
const state = store . getState ( ) ;
68
86
const files = selectFiles ( state ) ;
@@ -113,6 +131,80 @@ export function jumpToDefinition(pos) {
113
131
114
132
let found = false ;
115
133
134
+ if ( ! found ) {
135
+ const scriptOrder = getScriptLoadOrder ( files ) ;
136
+
137
+ if ( scriptOrder . length ) {
138
+ const projectSymbolTable =
139
+ buildProjectSymbolTable ( files , scriptOrder ) || { } ;
140
+ const globalSymbol = projectSymbolTable [ varName ] ;
141
+
142
+ if ( globalSymbol ) {
143
+ for ( let i = scriptOrder . length - 1 ; i >= 0 ; i -- ) {
144
+ const scriptName = scriptOrder [ i ] ;
145
+ const file = files . find ( ( f ) => f . name . endsWith ( scriptName ) ) ;
146
+ if ( ! file ) continue ;
147
+
148
+ let ast ;
149
+ try {
150
+ ast = parser . parse ( file . content , {
151
+ sourceType : 'script' ,
152
+ plugins : [ 'jsx' , 'typescript' ]
153
+ } ) ;
154
+ } catch {
155
+ continue ;
156
+ }
157
+
158
+ let foundInThisFile = false ;
159
+ traverse ( ast , {
160
+ FunctionDeclaration ( path ) {
161
+ if ( path . node . id ?. name === varName ) {
162
+ const targetFileObj = file ;
163
+
164
+ const fileContent = targetFileObj . content ;
165
+ const beforeText = fileContent . slice ( 0 , path . node . start ) ;
166
+ const line = beforeText . split ( '\n' ) . length - 1 ;
167
+ const ch = beforeText . split ( '\n' ) . pop ( ) . length ;
168
+
169
+ store . dispatch ( setSelectedFile ( targetFileObj . id ) ) ;
170
+ pos = { line, ch } ;
171
+ cm . setCursor ( pos ) ;
172
+
173
+ announceToScreenReader (
174
+ `Jumped to definition of ${ varName } in ${ file . name } `
175
+ ) ;
176
+ foundInThisFile = true ;
177
+ path . stop ( ) ;
178
+ }
179
+ } ,
180
+ VariableDeclarator ( path ) {
181
+ if ( path . node . id ?. name === varName ) {
182
+ const targetFileObj = file ;
183
+
184
+ const fileContent = targetFileObj . content ;
185
+ const beforeText = fileContent . slice ( 0 , path . node . start ) ;
186
+ const line = beforeText . split ( '\n' ) . length - 1 ;
187
+ const ch = beforeText . split ( '\n' ) . pop ( ) . length ;
188
+
189
+ store . dispatch ( setSelectedFile ( targetFileObj . id ) ) ;
190
+ pos = { line, ch } ;
191
+ cm . setCursor ( pos ) ;
192
+
193
+ announceToScreenReader (
194
+ `Jumped to definition of ${ varName } in ${ file . name } `
195
+ ) ;
196
+ foundInThisFile = true ;
197
+ path . stop ( ) ;
198
+ }
199
+ }
200
+ } ) ;
201
+
202
+ if ( foundInThisFile ) break ;
203
+ }
204
+ }
205
+ }
206
+ }
207
+
116
208
traverse ( ast , {
117
209
VariableDeclarator ( path ) {
118
210
if ( found ) return ;
@@ -216,36 +308,6 @@ export function jumpToDefinition(pos) {
216
308
}
217
309
} ) ;
218
310
}
219
- if ( ! found ) {
220
- const scriptOrder = getScriptLoadOrder ( files ) ;
221
-
222
- const projectSymbolTable =
223
- buildProjectSymbolTable ( files , scriptOrder ) || { } ;
224
- const globalSymbol = projectSymbolTable [ varName ] ;
225
-
226
- if ( globalSymbol ) {
227
- const targetFileObj = files . find ( ( f ) => f . name === globalSymbol . file ) ;
228
- if ( ! targetFileObj ) {
229
- return ;
230
- }
231
-
232
- store . dispatch ( setSelectedFile ( targetFileObj . id ) ) ;
233
-
234
- if ( ! targetFileObj . cmInstance ) {
235
- return ;
236
- }
237
-
238
- const targetFileCM = targetFileObj . cmInstance ;
239
- const defPos = targetFileCM . posFromIndex ( globalSymbol . pos ) ;
240
- targetFileCM . setCursor ( defPos ) ;
241
- targetFileCM . focus ( ) ;
242
-
243
- announceToScreenReader (
244
- `Jumped to definition of ${ varName } in ${ globalSymbol . file } `
245
- ) ;
246
- found = true ;
247
- }
248
- }
249
311
250
312
if ( ! found ) {
251
313
announceToScreenReader ( `No definition found for ${ varName } ` , true ) ;
0 commit comments