Skip to content

Commit 1fe106b

Browse files
author
Kartik Raj
committed
Move getActiveResource to a common place
1 parent 85755b1 commit 1fe106b

File tree

5 files changed

+42
-185
lines changed

5 files changed

+42
-185
lines changed

src/client/activation/activationManager.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
'use strict';
55

66
import { inject, injectable, multiInject } from 'inversify';
7-
import { TextDocument, workspace } from 'vscode';
7+
import { TextDocument } from 'vscode';
88
import { IApplicationDiagnostics } from '../application/types';
99
import { IDocumentManager, IWorkspaceService } from '../common/application/types';
1010
import { PYTHON_LANGUAGE } from '../common/constants';
1111
import { traceDecorators } from '../common/logger';
1212
import { IDisposable, Resource } from '../common/types';
1313
import { IInterpreterAutoSelectionService } from '../interpreter/autoSelection/types';
1414
import { IInterpreterService } from '../interpreter/contracts';
15-
import { IExtensionActivationManager, IExtensionActivationService, IExtensionSingleActivationService } from './types';
15+
import { IActiveResourceService, IExtensionActivationManager, IExtensionActivationService, IExtensionSingleActivationService } from './types';
1616

1717
@injectable()
1818
export class ExtensionActivationManager implements IExtensionActivationManager {
@@ -26,7 +26,8 @@ export class ExtensionActivationManager implements IExtensionActivationManager {
2626
@inject(IInterpreterService) private readonly interpreterService: IInterpreterService,
2727
@inject(IInterpreterAutoSelectionService) private readonly autoSelection: IInterpreterAutoSelectionService,
2828
@inject(IApplicationDiagnostics) private readonly appDiagnostics: IApplicationDiagnostics,
29-
@inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService
29+
@inject(IWorkspaceService) private readonly workspaceService: IWorkspaceService,
30+
@inject(IActiveResourceService) private readonly activeResourceService: IActiveResourceService
3031
) { }
3132

3233
public dispose() {
@@ -44,7 +45,7 @@ export class ExtensionActivationManager implements IExtensionActivationManager {
4445
// Activate all activation services together.
4546
await Promise.all([
4647
Promise.all(this.singleActivationServices.map(item => item.activate())),
47-
this.activateWorkspace(this.getActiveResource())
48+
this.activateWorkspace(this.activeResourceService.getActiveResource())
4849
]);
4950
await this.autoSelection.autoSelectInterpreter(undefined);
5051
}
@@ -114,12 +115,4 @@ export class ExtensionActivationManager implements IExtensionActivationManager {
114115
protected getWorkspaceKey(resource: Resource) {
115116
return this.workspaceService.getWorkspaceFolderIdentifier(resource, '');
116117
}
117-
private getActiveResource(): Resource {
118-
if (this.documentManager.activeTextEditor && !this.documentManager.activeTextEditor.document.isUntitled) {
119-
return this.documentManager.activeTextEditor.document.uri;
120-
}
121-
return Array.isArray(this.workspaceService.workspaceFolders) && workspace.workspaceFolders!.length > 0
122-
? workspace.workspaceFolders![0].uri
123-
: undefined;
124-
}
125118
}

src/client/providers/replProvider.ts

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { Disposable, Uri } from 'vscode';
2-
import { ICommandManager, IDocumentManager, IWorkspaceService } from '../common/application/types';
1+
import { Disposable } from 'vscode';
2+
import { IActiveResourceService } from '../activation/types';
3+
import { ICommandManager } from '../common/application/types';
34
import { Commands } from '../common/constants';
45
import { IServiceContainer } from '../ioc/types';
56
import { captureTelemetry } from '../telemetry';
@@ -8,7 +9,9 @@ import { ICodeExecutionService } from '../terminals/types';
89

910
export class ReplProvider implements Disposable {
1011
private readonly disposables: Disposable[] = [];
12+
private activeResourceService: IActiveResourceService;
1113
constructor(private serviceContainer: IServiceContainer) {
14+
this.activeResourceService = this.serviceContainer.get<IActiveResourceService>(IActiveResourceService);
1215
this.registerCommand();
1316
}
1417
public dispose() {
@@ -21,18 +24,8 @@ export class ReplProvider implements Disposable {
2124
}
2225
@captureTelemetry(EventName.REPL)
2326
private async commandHandler() {
24-
const resource = this.getActiveResourceUri();
27+
const resource = this.activeResourceService.getActiveResource();
2528
const replProvider = this.serviceContainer.get<ICodeExecutionService>(ICodeExecutionService, 'repl');
2629
await replProvider.initializeRepl(resource);
2730
}
28-
private getActiveResourceUri(): Uri | undefined {
29-
const documentManager = this.serviceContainer.get<IDocumentManager>(IDocumentManager);
30-
if (documentManager.activeTextEditor && !documentManager.activeTextEditor!.document.isUntitled) {
31-
return documentManager.activeTextEditor!.document.uri;
32-
}
33-
const workspace = this.serviceContainer.get<IWorkspaceService>(IWorkspaceService);
34-
if (Array.isArray(workspace.workspaceFolders) && workspace.workspaceFolders.length > 0) {
35-
return workspace.workspaceFolders[0].uri;
36-
}
37-
}
3831
}

src/test/activation/activationManager.unit.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import * as typemoq from 'typemoq';
99
import { TextDocument, Uri } from 'vscode';
1010
import { ExtensionActivationManager } from '../../client/activation/activationManager';
1111
import { LanguageServerExtensionActivationService } from '../../client/activation/activationService';
12-
import { IExtensionActivationService } from '../../client/activation/types';
12+
import { ActiveResourceService } from '../../client/activation/activeResource';
13+
import { IActiveResourceService, IExtensionActivationService } from '../../client/activation/types';
1314
import { IApplicationDiagnostics } from '../../client/application/types';
1415
import { IDocumentManager, IWorkspaceService } from '../../client/common/application/types';
1516
import { WorkspaceService } from '../../client/common/application/workspace';
@@ -41,11 +42,13 @@ suite('Activation - ActivationManager', () => {
4142
let appDiagnostics: typemoq.IMock<IApplicationDiagnostics>;
4243
let autoSelection: typemoq.IMock<IInterpreterAutoSelectionService>;
4344
let interpreterService: IInterpreterService;
45+
let activeResourceService: IActiveResourceService;
4446
let documentManager: typemoq.IMock<IDocumentManager>;
4547
let activationService1: IExtensionActivationService;
4648
let activationService2: IExtensionActivationService;
4749
setup(() => {
4850
workspaceService = mock(WorkspaceService);
51+
activeResourceService = mock(ActiveResourceService);
4952
appDiagnostics = typemoq.Mock.ofType<IApplicationDiagnostics>();
5053
autoSelection = typemoq.Mock.ofType<IInterpreterAutoSelectionService>();
5154
interpreterService = mock(InterpreterService);
@@ -58,7 +61,8 @@ suite('Activation - ActivationManager', () => {
5861
instance(interpreterService),
5962
autoSelection.object,
6063
appDiagnostics.object,
61-
instance(workspaceService)
64+
instance(workspaceService),
65+
instance(activeResourceService)
6266
);
6367
});
6468
test('Initialize will add event handlers and will dispose them when running dispose', async () => {

src/test/providers/repl.unit.test.ts

Lines changed: 12 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
import { expect } from 'chai';
55
import * as TypeMoq from 'typemoq';
6-
import { Disposable, TextDocument, TextEditor, Uri, WorkspaceFolder } from 'vscode';
6+
import { Disposable, Uri } from 'vscode';
7+
import { IActiveResourceService } from '../../client/activation/types';
78
import { ICommandManager, IDocumentManager, IWorkspaceService } from '../../client/common/application/types';
89
import { Commands } from '../../client/common/constants';
910
import { IServiceContainer } from '../../client/ioc/types';
@@ -17,17 +18,20 @@ suite('REPL Provider', () => {
1718
let workspace: TypeMoq.IMock<IWorkspaceService>;
1819
let codeExecutionService: TypeMoq.IMock<ICodeExecutionService>;
1920
let documentManager: TypeMoq.IMock<IDocumentManager>;
21+
let activeResourceService: TypeMoq.IMock<IActiveResourceService>;
2022
let replProvider: ReplProvider;
2123
setup(() => {
2224
serviceContainer = TypeMoq.Mock.ofType<IServiceContainer>();
2325
commandManager = TypeMoq.Mock.ofType<ICommandManager>();
2426
workspace = TypeMoq.Mock.ofType<IWorkspaceService>();
2527
codeExecutionService = TypeMoq.Mock.ofType<ICodeExecutionService>();
2628
documentManager = TypeMoq.Mock.ofType<IDocumentManager>();
29+
activeResourceService = TypeMoq.Mock.ofType<IActiveResourceService>();
2730
serviceContainer.setup(c => c.get(ICommandManager)).returns(() => commandManager.object);
2831
serviceContainer.setup(c => c.get(IWorkspaceService)).returns(() => workspace.object);
2932
serviceContainer.setup(c => c.get(ICodeExecutionService, TypeMoq.It.isValue('repl'))).returns(() => codeExecutionService.object);
3033
serviceContainer.setup(c => c.get(IDocumentManager)).returns(() => documentManager.object);
34+
serviceContainer.setup(c => c.get(IActiveResourceService)).returns(() => activeResourceService.object);
3135
});
3236
teardown(() => {
3337
try {
@@ -51,86 +55,24 @@ suite('REPL Provider', () => {
5155
disposable.verify(d => d.dispose(), TypeMoq.Times.once());
5256
});
5357

54-
test('Ensure resource is \'undefined\' if there\s no active document nor a workspace', () => {
58+
test('Ensure execution is carried smoothly in the handler if there are no errors', () => {
59+
const resource = Uri.parse('a');
5560
const disposable = TypeMoq.Mock.ofType<Disposable>();
5661
let commandHandler: undefined | (() => void);
5762
commandManager.setup(c => c.registerCommand(TypeMoq.It.isValue(Commands.Start_REPL), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns((_cmd, callback) => {
5863
commandHandler = callback;
5964
return disposable.object;
6065
});
61-
documentManager.setup(d => d.activeTextEditor).returns(() => undefined);
66+
activeResourceService
67+
.setup(a => a.getActiveResource())
68+
.returns(() => resource)
69+
.verifiable(TypeMoq.Times.once());
6270

6371
replProvider = new ReplProvider(serviceContainer.object);
6472
expect(commandHandler).not.to.be.equal(undefined, 'Handler not set');
6573
commandHandler!.call(replProvider);
6674

6775
serviceContainer.verify(c => c.get(TypeMoq.It.isValue(ICodeExecutionService), TypeMoq.It.isValue('repl')), TypeMoq.Times.once());
68-
codeExecutionService.verify(c => c.initializeRepl(TypeMoq.It.isValue(undefined)), TypeMoq.Times.once());
69-
});
70-
71-
test('Ensure resource is uri of the active document', () => {
72-
const disposable = TypeMoq.Mock.ofType<Disposable>();
73-
let commandHandler: undefined | (() => void);
74-
commandManager.setup(c => c.registerCommand(TypeMoq.It.isValue(Commands.Start_REPL), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns((_cmd, callback) => {
75-
commandHandler = callback;
76-
return disposable.object;
77-
});
78-
const documentUri = Uri.file('a');
79-
const editor = TypeMoq.Mock.ofType<TextEditor>();
80-
const document = TypeMoq.Mock.ofType<TextDocument>();
81-
document.setup(d => d.uri).returns(() => documentUri);
82-
document.setup(d => d.isUntitled).returns(() => false);
83-
editor.setup(e => e.document).returns(() => document.object);
84-
documentManager.setup(d => d.activeTextEditor).returns(() => editor.object);
85-
86-
replProvider = new ReplProvider(serviceContainer.object);
87-
expect(commandHandler).not.to.be.equal(undefined, 'Handler not set');
88-
commandHandler!.call(replProvider);
89-
90-
serviceContainer.verify(c => c.get(TypeMoq.It.isValue(ICodeExecutionService), TypeMoq.It.isValue('repl')), TypeMoq.Times.once());
91-
codeExecutionService.verify(c => c.initializeRepl(TypeMoq.It.isValue(documentUri)), TypeMoq.Times.once());
92-
});
93-
94-
test('Ensure resource is \'undefined\' if the active document is not used if it is untitled (new document)', () => {
95-
const disposable = TypeMoq.Mock.ofType<Disposable>();
96-
let commandHandler: undefined | (() => void);
97-
commandManager.setup(c => c.registerCommand(TypeMoq.It.isValue(Commands.Start_REPL), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns((_cmd, callback) => {
98-
commandHandler = callback;
99-
return disposable.object;
100-
});
101-
const editor = TypeMoq.Mock.ofType<TextEditor>();
102-
const document = TypeMoq.Mock.ofType<TextDocument>();
103-
document.setup(d => d.isUntitled).returns(() => true);
104-
editor.setup(e => e.document).returns(() => document.object);
105-
documentManager.setup(d => d.activeTextEditor).returns(() => editor.object);
106-
107-
replProvider = new ReplProvider(serviceContainer.object);
108-
expect(commandHandler).not.to.be.equal(undefined, 'Handler not set');
109-
commandHandler!.call(replProvider);
110-
111-
serviceContainer.verify(c => c.get(TypeMoq.It.isValue(ICodeExecutionService), TypeMoq.It.isValue('repl')), TypeMoq.Times.once());
112-
codeExecutionService.verify(c => c.initializeRepl(TypeMoq.It.isValue(undefined)), TypeMoq.Times.once());
113-
});
114-
115-
test('Ensure first available workspace folder is used if there no document', () => {
116-
const disposable = TypeMoq.Mock.ofType<Disposable>();
117-
let commandHandler: undefined | (() => void);
118-
commandManager.setup(c => c.registerCommand(TypeMoq.It.isValue(Commands.Start_REPL), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns((_cmd, callback) => {
119-
commandHandler = callback;
120-
return disposable.object;
121-
});
122-
documentManager.setup(d => d.activeTextEditor).returns(() => undefined);
123-
124-
const workspaceUri = Uri.file('a');
125-
const workspaceFolder = TypeMoq.Mock.ofType<WorkspaceFolder>();
126-
workspaceFolder.setup(w => w.uri).returns(() => workspaceUri);
127-
workspace.setup(w => w.workspaceFolders).returns(() => [workspaceFolder.object]);
128-
129-
replProvider = new ReplProvider(serviceContainer.object);
130-
expect(commandHandler).not.to.be.equal(undefined, 'Handler not set');
131-
commandHandler!.call(replProvider);
132-
133-
serviceContainer.verify(c => c.get(TypeMoq.It.isValue(ICodeExecutionService), TypeMoq.It.isValue('repl')), TypeMoq.Times.once());
134-
codeExecutionService.verify(c => c.initializeRepl(TypeMoq.It.isValue(workspaceUri)), TypeMoq.Times.once());
76+
codeExecutionService.verify(c => c.initializeRepl(TypeMoq.It.isValue(resource)), TypeMoq.Times.once());
13577
});
13678
});

0 commit comments

Comments
 (0)