Skip to content

Commit 0af1e45

Browse files
authored
fix(editors): don't show connect code lens on regular js files VSCODE-538 (#789)
1 parent ee6132b commit 0af1e45

9 files changed

+60
-77
lines changed

src/connectionController.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,10 @@ export default class ConnectionController {
788788
this.eventEmitter.removeListener(eventType, listener);
789789
}
790790

791+
deactivate() {
792+
this.eventEmitter.removeAllListeners();
793+
}
794+
791795
closeConnectionStringInput() {
792796
this._connectionStringInputCancellationToken?.cancel();
793797
}

src/editors/activeConnectionCodeLensProvider.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,40 @@
11
import * as vscode from 'vscode';
2-
import type { TextEditor } from 'vscode';
2+
33
import EXTENSION_COMMANDS from '../commands';
44
import type ConnectionController from '../connectionController';
55
import { isPlayground } from '../utils/playground';
66
import { getDBFromConnectionString } from '../utils/connection-string-db';
7+
import { DataServiceEventTypes } from '../connectionController';
78

89
export default class ActiveConnectionCodeLensProvider
910
implements vscode.CodeLensProvider
1011
{
1112
_connectionController: ConnectionController;
1213
_onDidChangeCodeLenses: vscode.EventEmitter<void> =
1314
new vscode.EventEmitter<void>();
14-
activeTextEditor?: TextEditor;
15+
_activeConnectionChangedHandler: () => void;
1516

1617
readonly onDidChangeCodeLenses: vscode.Event<void> =
1718
this._onDidChangeCodeLenses.event;
1819

1920
constructor(connectionController: ConnectionController) {
2021
this._connectionController = connectionController;
21-
this.activeTextEditor = vscode.window.activeTextEditor;
2222

2323
vscode.workspace.onDidChangeConfiguration(() => {
2424
this._onDidChangeCodeLenses.fire();
2525
});
26-
}
27-
28-
setActiveTextEditor(activeTextEditor?: TextEditor) {
29-
this.activeTextEditor = activeTextEditor;
30-
this._onDidChangeCodeLenses.fire();
31-
}
32-
33-
refresh(): void {
34-
this._onDidChangeCodeLenses.fire();
35-
}
3626

37-
isPlayground(): boolean {
38-
return isPlayground(this.activeTextEditor?.document.uri);
27+
this._activeConnectionChangedHandler = () => {
28+
this._onDidChangeCodeLenses.fire();
29+
};
30+
this._connectionController.addEventListener(
31+
DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED,
32+
this._activeConnectionChangedHandler
33+
);
3934
}
4035

41-
provideCodeLenses(): vscode.CodeLens[] {
42-
if (!this.isPlayground()) {
36+
provideCodeLenses(document: vscode.TextDocument): vscode.CodeLens[] {
37+
if (!isPlayground(document.uri)) {
4338
return [];
4439
}
4540

@@ -69,4 +64,11 @@ export default class ActiveConnectionCodeLensProvider
6964

7065
return [codeLens];
7166
}
67+
68+
deactivate() {
69+
this._connectionController.removeEventListener(
70+
DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED,
71+
this._activeConnectionChangedHandler
72+
);
73+
}
7274
}

src/editors/playgroundController.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import vm from 'vm';
66
import os from 'os';
77
import transpiler from 'bson-transpilers';
88

9-
import type ActiveConnectionCodeLensProvider from './activeConnectionCodeLensProvider';
109
import type PlaygroundSelectedCodeActionProvider from './playgroundSelectedCodeActionProvider';
1110
import type ConnectionController from '../connectionController';
1211
import { DataServiceEventTypes } from '../connectionController';
@@ -127,11 +126,11 @@ export default class PlaygroundController {
127126

128127
_isPartialRun = false;
129128

130-
private _activeConnectionCodeLensProvider: ActiveConnectionCodeLensProvider;
131129
private _playgroundResultViewColumn?: vscode.ViewColumn;
132130
private _playgroundResultTextDocument?: vscode.TextDocument;
133131
private _statusView: StatusView;
134132
private _playgroundResultViewProvider: PlaygroundResultProvider;
133+
private _activeConnectionChangedHandler: () => void;
135134

136135
private _codeToEvaluate = '';
137136

@@ -141,7 +140,6 @@ export default class PlaygroundController {
141140
telemetryService,
142141
statusView,
143142
playgroundResultViewProvider,
144-
activeConnectionCodeLensProvider,
145143
exportToLanguageCodeLensProvider,
146144
playgroundSelectedCodeActionProvider,
147145
}: {
@@ -150,7 +148,6 @@ export default class PlaygroundController {
150148
telemetryService: TelemetryService;
151149
statusView: StatusView;
152150
playgroundResultViewProvider: PlaygroundResultProvider;
153-
activeConnectionCodeLensProvider: ActiveConnectionCodeLensProvider;
154151
exportToLanguageCodeLensProvider: ExportToLanguageCodeLensProvider;
155152
playgroundSelectedCodeActionProvider: PlaygroundSelectedCodeActionProvider;
156153
}) {
@@ -160,16 +157,16 @@ export default class PlaygroundController {
160157
this._telemetryService = telemetryService;
161158
this._statusView = statusView;
162159
this._playgroundResultViewProvider = playgroundResultViewProvider;
163-
this._activeConnectionCodeLensProvider = activeConnectionCodeLensProvider;
164160
this._exportToLanguageCodeLensProvider = exportToLanguageCodeLensProvider;
165161
this._playgroundSelectedCodeActionProvider =
166162
playgroundSelectedCodeActionProvider;
167163

164+
this._activeConnectionChangedHandler = () => {
165+
void this._activeConnectionChanged();
166+
};
168167
this._connectionController.addEventListener(
169168
DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED,
170-
() => {
171-
void this._activeConnectionChanged();
172-
}
169+
this._activeConnectionChangedHandler
173170
);
174171

175172
const onDidChangeActiveTextEditor = (
@@ -189,9 +186,6 @@ export default class PlaygroundController {
189186

190187
if (isPlaygroundEditor) {
191188
this._activeTextEditor = editor;
192-
this._activeConnectionCodeLensProvider.setActiveTextEditor(
193-
this._activeTextEditor
194-
);
195189
this._playgroundSelectedCodeActionProvider.setActiveTextEditor(
196190
this._activeTextEditor
197191
);
@@ -270,8 +264,6 @@ export default class PlaygroundController {
270264
const connectionId = this._connectionController.getActiveConnectionId();
271265
let mongoClientOption;
272266

273-
this._activeConnectionCodeLensProvider.refresh();
274-
275267
if (dataService && connectionId) {
276268
mongoClientOption =
277269
this._connectionController.getMongoClientConnectionOptions();
@@ -893,9 +885,7 @@ export default class PlaygroundController {
893885
deactivate(): void {
894886
this._connectionController.removeEventListener(
895887
DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED,
896-
() => {
897-
// No action is required after removing the listener.
898-
}
888+
this._activeConnectionChangedHandler
899889
);
900890
}
901891
}

src/mdbExtensionController.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ export default class MDBExtensionController implements vscode.Disposable {
113113
telemetryService: this._telemetryService,
114114
statusView: this._statusView,
115115
playgroundResultViewProvider: this._playgroundResultViewProvider,
116-
activeConnectionCodeLensProvider: this._activeConnectionCodeLensProvider,
117116
exportToLanguageCodeLensProvider: this._exportToLanguageCodeLensProvider,
118117
playgroundSelectedCodeActionProvider:
119118
this._playgroundSelectedCodeActionProvider,
@@ -878,5 +877,7 @@ export default class MDBExtensionController implements vscode.Disposable {
878877
this._telemetryService.deactivate();
879878
this._editorsController.deactivate();
880879
this._webviewController.deactivate();
880+
this._activeConnectionCodeLensProvider.deactivate();
881+
this._connectionController.deactivate();
881882
}
882883
}

src/test/suite/editors/activeConnectionCodeLensProvider.test.ts

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import * as vscode from 'vscode';
22
import { beforeEach, afterEach } from 'mocha';
3-
import chai from 'chai';
3+
import { expect } from 'chai';
44
import sinon from 'sinon';
55
import type { DataService } from 'mongodb-data-service';
6+
import path from 'path';
67

78
import ActiveConnectionCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider';
89
import ConnectionController from '../../../connectionController';
@@ -12,8 +13,6 @@ import { ExtensionContextStub } from '../stubs';
1213
import TelemetryService from '../../../telemetry/telemetryService';
1314
import { TEST_DATABASE_URI } from '../dbTestHelper';
1415

15-
const expect = chai.expect;
16-
1716
suite('Active Connection CodeLens Provider Test Suite', () => {
1817
const extensionContextStub = new ExtensionContextStub();
1918
const testStorageController = new StorageController(extensionContextStub);
@@ -42,19 +41,23 @@ suite('Active Connection CodeLens Provider Test Suite', () => {
4241
});
4342

4443
suite('the MongoDB playground in JS', () => {
44+
const mockFileName = path.join('nonexistent', 'playground-test.mongodb.js');
45+
const mockDocumentUri = vscode.Uri.from({
46+
path: mockFileName,
47+
scheme: 'untitled',
48+
});
49+
const mockTextDoc: vscode.TextDocument = {
50+
uri: mockDocumentUri,
51+
} as Pick<vscode.TextDocument, 'uri'> as vscode.TextDocument;
52+
4553
suite('user is not connected', () => {
4654
beforeEach(() => {
47-
testCodeLensProvider.setActiveTextEditor(
48-
vscode.window.activeTextEditor
49-
);
5055
const fakeShowQuickPick = sandbox.fake();
5156
sandbox.replace(vscode.window, 'showQuickPick', fakeShowQuickPick);
52-
const fakeIsPlayground = sandbox.fake.returns(true);
53-
sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground);
5457
});
5558

5659
test('show disconnected message in code lenses', () => {
57-
const codeLens = testCodeLensProvider.provideCodeLenses();
60+
const codeLens = testCodeLensProvider.provideCodeLenses(mockTextDoc);
5861

5962
expect(codeLens).to.be.an('array');
6063
expect(codeLens.length).to.be.equal(1);
@@ -89,16 +92,11 @@ suite('Active Connection CodeLens Provider Test Suite', () => {
8992
} as unknown as DataService;
9093

9194
testConnectionController.setActiveDataService(activeDataServiceStub);
92-
testCodeLensProvider.setActiveTextEditor(
93-
vscode.window.activeTextEditor
94-
);
9595
sandbox.replace(
9696
testConnectionController,
9797
'getActiveConnectionName',
9898
sandbox.fake.returns('fakeName')
9999
);
100-
const fakeIsPlayground = sandbox.fake.returns(true);
101-
sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground);
102100
});
103101

104102
test('show active connection in code lenses', () => {
@@ -109,7 +107,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => {
109107
url: TEST_DATABASE_URI,
110108
})
111109
);
112-
const codeLens = testCodeLensProvider.provideCodeLenses();
110+
const codeLens = testCodeLensProvider.provideCodeLenses(mockTextDoc);
113111

114112
expect(codeLens).to.be.an('array');
115113
expect(codeLens.length).to.be.equal(1);
@@ -131,7 +129,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => {
131129
url: `${TEST_DATABASE_URI}/fakeDBName`,
132130
})
133131
);
134-
const codeLens = testCodeLensProvider.provideCodeLenses();
132+
const codeLens = testCodeLensProvider.provideCodeLenses(mockTextDoc);
135133
expect(codeLens).to.be.an('array');
136134
expect(codeLens.length).to.be.equal(1);
137135
expect(codeLens[0].command?.title).to.be.equal(
@@ -147,16 +145,23 @@ suite('Active Connection CodeLens Provider Test Suite', () => {
147145
});
148146

149147
suite('the regular JS file', () => {
148+
const mockFileName = path.join('nonexistent', 'playground-test.js');
149+
const mockDocumentUri = vscode.Uri.from({
150+
path: mockFileName,
151+
scheme: 'untitled',
152+
});
153+
const mockTextDoc: vscode.TextDocument = {
154+
uri: mockDocumentUri,
155+
} as Pick<vscode.TextDocument, 'uri'> as vscode.TextDocument;
156+
150157
suite('user is not connected', () => {
151158
beforeEach(() => {
152159
const fakeShowQuickPick = sandbox.fake();
153160
sandbox.replace(vscode.window, 'showQuickPick', fakeShowQuickPick);
154-
const fakeIsPlayground = sandbox.fake.returns(false);
155-
sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground);
156161
});
157162

158163
test('show not show the active connection code lenses', () => {
159-
const codeLens = testCodeLensProvider.provideCodeLenses();
164+
const codeLens = testCodeLensProvider.provideCodeLenses(mockTextDoc);
160165

161166
expect(codeLens).to.be.an('array');
162167
expect(codeLens.length).to.be.equal(0);
@@ -191,12 +196,10 @@ suite('Active Connection CodeLens Provider Test Suite', () => {
191196
'getActiveConnectionName',
192197
sandbox.fake.returns('fakeName')
193198
);
194-
const fakeIsPlayground = sandbox.fake.returns(false);
195-
sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground);
196199
});
197200

198-
test('show not show the active connection code lensess', () => {
199-
const codeLens = testCodeLensProvider.provideCodeLenses();
201+
test('show not show the active connection code lenses', () => {
202+
const codeLens = testCodeLensProvider.provideCodeLenses(mockTextDoc);
200203

201204
expect(codeLens).to.be.an('array');
202205
expect(codeLens.length).to.be.equal(0);

src/test/suite/editors/playgroundController.test.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { v4 as uuidv4 } from 'uuid';
88
import path from 'path';
99
import chaiAsPromised from 'chai-as-promised';
1010

11-
import ActiveDBCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider';
1211
import PlaygroundSelectedCodeActionProvider from '../../../editors/playgroundSelectedCodeActionProvider';
1312
import ConnectionController from '../../../connectionController';
1413
import EditDocumentCodeLensProvider from '../../../editors/editDocumentCodeLensProvider';
@@ -50,7 +49,6 @@ suite('Playground Controller Test Suite', function () {
5049
let testConnectionController: ConnectionController;
5150
let testEditDocumentCodeLensProvider: EditDocumentCodeLensProvider;
5251
let testPlaygroundResultProvider: PlaygroundResultProvider;
53-
let testActiveDBCodeLensProvider: ActiveDBCodeLensProvider;
5452
let testExportToLanguageCodeLensProvider: ExportToLanguageCodeLensProvider;
5553
let testCodeActionProvider: PlaygroundSelectedCodeActionProvider;
5654
let languageServerControllerStub: LanguageServerController;
@@ -78,9 +76,6 @@ suite('Playground Controller Test Suite', function () {
7876
testConnectionController,
7977
testEditDocumentCodeLensProvider
8078
);
81-
testActiveDBCodeLensProvider = new ActiveDBCodeLensProvider(
82-
testConnectionController
83-
);
8479
testExportToLanguageCodeLensProvider =
8580
new ExportToLanguageCodeLensProvider();
8681
testCodeActionProvider = new PlaygroundSelectedCodeActionProvider();
@@ -95,7 +90,6 @@ suite('Playground Controller Test Suite', function () {
9590
telemetryService: testTelemetryService,
9691
statusView: testStatusView,
9792
playgroundResultViewProvider: testPlaygroundResultProvider,
98-
activeConnectionCodeLensProvider: testActiveDBCodeLensProvider,
9993
exportToLanguageCodeLensProvider: testExportToLanguageCodeLensProvider,
10094
playgroundSelectedCodeActionProvider: testCodeActionProvider,
10195
});
@@ -350,7 +344,6 @@ suite('Playground Controller Test Suite', function () {
350344
telemetryService: testTelemetryService,
351345
statusView: testStatusView,
352346
playgroundResultViewProvider: testPlaygroundResultProvider,
353-
activeConnectionCodeLensProvider: testActiveDBCodeLensProvider,
354347
exportToLanguageCodeLensProvider:
355348
testExportToLanguageCodeLensProvider,
356349
playgroundSelectedCodeActionProvider: testCodeActionProvider,
@@ -368,7 +361,6 @@ suite('Playground Controller Test Suite', function () {
368361
telemetryService: testTelemetryService,
369362
statusView: testStatusView,
370363
playgroundResultViewProvider: testPlaygroundResultProvider,
371-
activeConnectionCodeLensProvider: testActiveDBCodeLensProvider,
372364
exportToLanguageCodeLensProvider:
373365
testExportToLanguageCodeLensProvider,
374366
playgroundSelectedCodeActionProvider: testCodeActionProvider,

src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { beforeEach, afterEach } from 'mocha';
33
import chai from 'chai';
44
import sinon from 'sinon';
55

6-
import ActiveConnectionCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider';
76
import ExportToLanguageCodeLensProvider from '../../../editors/exportToLanguageCodeLensProvider';
87
import PlaygroundSelectedCodeActionProvider from '../../../editors/playgroundSelectedCodeActionProvider';
98
import { LanguageServerController } from '../../../language';
@@ -50,10 +49,6 @@ suite('Playground Selected CodeAction Provider Test Suite', function () {
5049
TEST_DATABASE_URI
5150
);
5251

53-
const activeConnectionCodeLensProvider =
54-
new ActiveConnectionCodeLensProvider(
55-
mdbTestExtension.testExtensionController._connectionController
56-
);
5752
const testExportToLanguageCodeLensProvider =
5853
new ExportToLanguageCodeLensProvider();
5954

@@ -69,7 +64,6 @@ suite('Playground Selected CodeAction Provider Test Suite', function () {
6964
playgroundResultViewProvider:
7065
mdbTestExtension.testExtensionController
7166
._playgroundResultViewProvider,
72-
activeConnectionCodeLensProvider,
7367
exportToLanguageCodeLensProvider:
7468
testExportToLanguageCodeLensProvider,
7569
playgroundSelectedCodeActionProvider: testCodeActionProvider,

0 commit comments

Comments
 (0)