1+ import type * as babel from '@babel/core' ;
12import * as parser from '@babel/parser' ;
23import traverse from '@babel/traverse' ;
34
@@ -16,7 +17,6 @@ export type CompletionState = {
1617} ;
1718
1819export class Visitor {
19- _connection : any ;
2020 _state : CompletionState ;
2121 _position : { line : number ; character : number } ;
2222
@@ -25,7 +25,7 @@ export class Visitor {
2525 this . _position = { line : 0 , character : 0 } ;
2626 }
2727
28- _visitCallExpression ( node : any ) : void {
28+ _visitCallExpression ( node : babel . types . CallExpression ) : void {
2929 if ( this . _checkIsUseCall ( node ) ) {
3030 this . _state . isUseCallExpression = true ;
3131 }
@@ -35,11 +35,11 @@ export class Visitor {
3535 }
3636
3737 if ( this . _checkHasDatabaseName ( node ) ) {
38- this . _state . databaseName = node . arguments [ 0 ] . value ;
38+ this . _state . databaseName = ( node . arguments [ 0 ] as babel . types . StringLiteral ) . value ;
3939 }
4040 }
4141
42- _visitMemberExpression ( node : any ) : void {
42+ _visitMemberExpression ( node : babel . types . MemberExpression ) : void {
4343 if ( this . _checkHasAggregationCall ( node ) ) {
4444 this . _state . isAggregationCursor = true ;
4545 }
@@ -57,17 +57,17 @@ export class Visitor {
5757 }
5858
5959 if ( this . _checkHasCollectionName ( node ) ) {
60- this . _state . collectionName = node . object . property . name ;
60+ this . _state . collectionName = ( ( node . object as babel . types . MemberExpression ) . property as babel . types . Identifier ) . name ;
6161 }
6262 }
6363
64- _visitExpressionStatement ( node : any ) : void {
64+ _visitExpressionStatement ( node : babel . types . ExpressionStatement ) : void {
6565 if ( this . _checkIsDbCall ( node ) ) {
6666 this . _state . isDbCallExpression = true ;
6767 }
6868 }
6969
70- _visitObjectExpression ( node : any ) : void {
70+ _visitObjectExpression ( node : babel . types . ObjectExpression ) : void {
7171 if ( this . _checkIsObjectKey ( node ) ) {
7272 this . _state . isObjectKey = true ;
7373 }
@@ -120,7 +120,7 @@ export class Visitor {
120120 }
121121
122122 traverse ( ast , {
123- enter : ( path ) => {
123+ enter : ( path : babel . NodePath ) => {
124124 switch ( path . node . type ) {
125125 case 'CallExpression' :
126126 this . _visitCallExpression ( path . node ) ;
@@ -158,18 +158,16 @@ export class Visitor {
158158 }
159159
160160 // eslint-disable-next-line complexity
161- _checkIsUseCall ( node : any ) : boolean {
161+ _checkIsUseCall ( node : babel . types . CallExpression ) : boolean {
162162 if (
163- ( node . callee . name === 'use' &&
163+ ( node . callee . type === 'Identifier' &&
164+ node . callee . name === 'use' &&
164165 node . arguments &&
165166 node . arguments . length === 1 &&
166- node . arguments [ 0 ] &&
167167 node . arguments [ 0 ] . type === 'StringLiteral' &&
168- node . arguments [ 0 ] . value &&
169168 node . arguments [ 0 ] . value . includes ( PLACEHOLDER ) ) ||
170169 ( node . arguments &&
171170 node . arguments . length === 1 &&
172- node . arguments [ 0 ] &&
173171 node . arguments [ 0 ] . type === 'TemplateLiteral' &&
174172 node . arguments [ 0 ] . quasis &&
175173 node . arguments [ 0 ] . quasis . length === 1 &&
@@ -182,10 +180,10 @@ export class Visitor {
182180 return false ;
183181 }
184182
185- _checkIsDbCall ( node : any ) : boolean {
183+ _checkIsDbCall ( node : babel . types . ExpressionStatement ) : boolean {
186184 if (
187- node . expression &&
188- node . expression . object &&
185+ node . expression . type === 'MemberExpression' &&
186+ node . expression . object . type === 'Identifier' &&
189187 node . expression . object . name === 'db'
190188 ) {
191189 return true ;
@@ -194,7 +192,7 @@ export class Visitor {
194192 return false ;
195193 }
196194
197- _checkIsObjectKey ( node : any ) : boolean {
195+ _checkIsObjectKey ( node : babel . types . ObjectExpression ) : boolean {
198196 if (
199197 node . properties . find (
200198 ( item : any ) => ! ! ( item . key . name && item . key . name . includes ( PLACEHOLDER ) )
@@ -207,34 +205,31 @@ export class Visitor {
207205 }
208206
209207 // eslint-disable-next-line complexity
210- _checkIsCollectionName ( node : any ) : boolean {
208+ _checkIsCollectionName ( node : babel . types . CallExpression | babel . types . MemberExpression ) : boolean {
211209 if (
212- ( node . object &&
210+ ( node . type === 'MemberExpression' &&
211+ node . object . type === 'Identifier' &&
213212 node . object . name === 'db' &&
214- node . property &&
215- node . property . name &&
213+ node . property . type === 'Identifier' &&
216214 node . property . name . includes ( PLACEHOLDER ) ) ||
217- ( node . callee &&
218- node . callee . object &&
219- node . callee . object . object &&
220- node . callee . object . object . name === 'db' &&
221- node . callee . object . property . name &&
222- node . callee . object . property . name . includes ( PLACEHOLDER ) &&
223- node . callee . property )
215+ ( node . type === 'CallExpression' &&
216+ node . callee . type === 'MemberExpression' &&
217+ this . _checkIsCollectionName ( node . callee ) )
224218 ) {
225219 return true ;
226220 }
227221
228222 return false ;
229223 }
230224
231- _checkHasAggregationCall ( node : any ) : boolean {
225+ _checkHasAggregationCall ( node : babel . types . MemberExpression ) : boolean {
232226 if (
233- node . object &&
234227 node . object . type === 'CallExpression' &&
235- node . property . name &&
228+ node . property . type === 'Identifier' &&
236229 node . property . name . includes ( PLACEHOLDER ) &&
237- node . object . callee &&
230+ node . object . callee . type === 'MemberExpression' &&
231+ ! node . object . callee . computed &&
232+ node . object . callee . property . type === 'Identifier' &&
238233 node . object . callee . property . name === 'aggregate'
239234 ) {
240235 return true ;
@@ -243,13 +238,14 @@ export class Visitor {
243238 return false ;
244239 }
245240
246- _checkHasFindCall ( node : any ) : boolean {
241+ _checkHasFindCall ( node : babel . types . MemberExpression ) : boolean {
247242 if (
248- node . object &&
249243 node . object . type === 'CallExpression' &&
250- node . property . name &&
244+ node . property . type === 'Identifier' &&
251245 node . property . name . includes ( PLACEHOLDER ) &&
252- node . object . callee &&
246+ node . object . callee . type === 'MemberExpression' &&
247+ ! node . object . callee . computed &&
248+ node . object . callee . property . type === 'Identifier' &&
253249 node . object . callee . property . name === 'find'
254250 ) {
255251 return true ;
@@ -258,14 +254,14 @@ export class Visitor {
258254 return false ;
259255 }
260256
261- _checkHasDatabaseName ( node : any ) : boolean {
257+ _checkHasDatabaseName ( node : babel . types . CallExpression ) : boolean {
262258 if (
263- node . callee &&
259+ node . callee . type === 'Identifier' &&
264260 node . callee . name === 'use' &&
265261 node . arguments &&
266262 node . arguments . length === 1 &&
267- node . arguments [ 0 ] &&
268263 node . arguments [ 0 ] . type === 'StringLiteral' &&
264+ node . loc &&
269265 ( this . _position . line > node . loc . end . line - 1 ||
270266 ( this . _position . line === node . loc . end . line - 1 &&
271267 this . _position . character >= node . loc . end . column ) )
@@ -276,23 +272,24 @@ export class Visitor {
276272 return false ;
277273 }
278274
279- _checkHasCollectionName ( node : any ) : boolean {
275+ _checkHasCollectionName ( node : babel . types . MemberExpression ) : boolean {
280276 if (
281- node . object . object &&
282- node . object . object . name === 'db ' &&
283- node . object . property
277+ node . object . type === 'MemberExpression' &&
278+ node . object . object . type === 'Identifier ' &&
279+ node . object . object . name === 'db'
284280 ) {
285281 return true ;
286282 }
287283
288284 return false ;
289285 }
290286
291- _checkIsShellMethod ( node : any ) : boolean {
287+ _checkIsShellMethod ( node : babel . types . MemberExpression ) : boolean {
292288 if (
293- node . object . object &&
289+ node . object . type === 'MemberExpression' &&
290+ node . object . object . type === 'Identifier' &&
294291 node . object . object . name === 'db' &&
295- node . property . name &&
292+ node . property . type === 'Identifier' &&
296293 node . property . name . includes ( PLACEHOLDER )
297294 ) {
298295 return true ;
0 commit comments