Skip to content

Commit e82d9ab

Browse files
authored
fix: remove any usage and fix invalid accesses in autocompletion (#303)
1 parent 2bc0957 commit e82d9ab

File tree

4 files changed

+96
-95
lines changed

4 files changed

+96
-95
lines changed

package-lock.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
"posttest": "mongodb-runner stop --port=27018",
5555
"vscode:prepublish": "npm run clean && npm run compile:keyfile && npm run compile:resources && webpack --mode production",
5656
"check": "npm run lint && npm run check-dependencies",
57-
"check-dependencies": "depcheck --ignores='vscode,keytar,@types/jest,mocha-junit-reporter,mocha-multi,pre-commit,webpack-cli,vscode-languageserver-textdocument'",
57+
"check-dependencies": "depcheck --ignores='vscode,keytar,@types/jest,mocha-junit-reporter,mocha-multi,pre-commit,webpack-cli,vscode-languageserver-textdocument,@babel/core'",
5858
"package": "npm list --production --parseable --depth=99999 --loglevel=info || true && cross-env NODE_OPTIONS=\"--require ./scripts/no-npm-list-fail.js\" vsce package",
5959
"local-install": "npm run package && code --install-extension ./mongodb-vscode-*.vsix"
6060
},
@@ -897,6 +897,8 @@
897897
},
898898
"devDependencies": {
899899
"@types/analytics-node": "^3.1.4",
900+
"@types/babel__core": "^7.1.6",
901+
"@types/babel__traverse": "^7.0.9",
900902
"@types/chai": "^4.2.14",
901903
"@types/chai-fs": "^2.0.2",
902904
"@types/chai-json-schema": "^1.4.6",

src/language/visitor.ts

Lines changed: 43 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type * as babel from '@babel/core';
12
import * as parser from '@babel/parser';
23
import traverse from '@babel/traverse';
34

@@ -16,7 +17,6 @@ export type CompletionState = {
1617
};
1718

1819
export 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

Comments
 (0)