Skip to content

Commit efe0286

Browse files
author
Kartik Raj
committed
Add pinning behind experiment
1 parent 01065aa commit efe0286

File tree

4 files changed

+72
-15
lines changed

4 files changed

+72
-15
lines changed

src/client/common/experiments/groups.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@
22
export enum ShowExtensionSurveyPrompt {
33
experiment = 'pythonSurveyNotification',
44
}
5+
export enum InterpreterStatusBarPosition {
6+
Pinned = 'pythonInterpreterInfoPinned',
7+
Unpinned = 'pythonInterpreterInfoUnpinned',
8+
}

src/client/interpreter/display/index.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { inject, injectable } from 'inversify';
22
import { Disposable, StatusBarAlignment, StatusBarItem, Uri } from 'vscode';
3+
import { IExtensionSingleActivationService } from '../../activation/types';
34
import { IApplicationShell, IWorkspaceService } from '../../common/application/types';
5+
import { Commands } from '../../common/constants';
6+
import { InterpreterStatusBarPosition } from '../../common/experiments/groups';
47
import '../../common/extensions';
5-
import { IDisposableRegistry, IPathUtils, Resource } from '../../common/types';
8+
import { IDisposableRegistry, IExperimentService, IPathUtils, Resource } from '../../common/types';
69
import { Interpreters } from '../../common/utils/localize';
710
import { IServiceContainer } from '../../ioc/types';
811
import { traceLog } from '../../logging';
@@ -20,8 +23,12 @@ import {
2023
*/
2124
const STATUS_BAR_ITEM_PRIORITY = 100.09999;
2225
@injectable()
23-
export class InterpreterDisplay implements IInterpreterDisplay {
24-
private readonly statusBar: StatusBarItem;
26+
export class InterpreterDisplay implements IInterpreterDisplay, IExtensionSingleActivationService {
27+
public supportedWorkspaceTypes: { untrustedWorkspace: boolean; virtualWorkspace: boolean } = {
28+
untrustedWorkspace: false,
29+
virtualWorkspace: true,
30+
};
31+
private statusBar!: StatusBarItem;
2532
private readonly helper: IInterpreterHelper;
2633
private readonly workspaceService: IWorkspaceService;
2734
private readonly pathUtils: IPathUtils;
@@ -31,26 +38,36 @@ export class InterpreterDisplay implements IInterpreterDisplay {
3138
private interpreterPath: string | undefined;
3239
private statusBarCanBeDisplayed?: boolean;
3340
private visibilityFilters: IInterpreterStatusbarVisibilityFilter[] = [];
41+
private disposableRegistry: Disposable[];
42+
private experiments: IExperimentService;
3443

3544
constructor(@inject(IServiceContainer) private readonly serviceContainer: IServiceContainer) {
3645
this.helper = serviceContainer.get<IInterpreterHelper>(IInterpreterHelper);
3746
this.workspaceService = serviceContainer.get<IWorkspaceService>(IWorkspaceService);
3847
this.pathUtils = serviceContainer.get<IPathUtils>(IPathUtils);
3948
this.interpreterService = serviceContainer.get<IInterpreterService>(IInterpreterService);
4049

41-
const application = serviceContainer.get<IApplicationShell>(IApplicationShell);
42-
const disposableRegistry = serviceContainer.get<Disposable[]>(IDisposableRegistry);
43-
44-
this.statusBar = application.createStatusBarItem(StatusBarAlignment.Right, STATUS_BAR_ITEM_PRIORITY);
45-
this.statusBar.command = 'python.setInterpreter';
46-
disposableRegistry.push(this.statusBar);
50+
this.disposableRegistry = serviceContainer.get<Disposable[]>(IDisposableRegistry);
4751

4852
this.interpreterService.onDidChangeInterpreterInformation(
4953
this.onDidChangeInterpreterInformation,
5054
this,
51-
disposableRegistry,
55+
this.disposableRegistry,
5256
);
57+
this.experiments = this.serviceContainer.get<IExperimentService>(IExperimentService);
58+
}
59+
60+
public async activate(): Promise<void> {
61+
let [alignment, priority] = [StatusBarAlignment.Left, <number | undefined>undefined];
62+
if (this.experiments.inExperimentSync(InterpreterStatusBarPosition.Pinned)) {
63+
[alignment, priority] = [StatusBarAlignment.Right, STATUS_BAR_ITEM_PRIORITY];
64+
}
65+
const application = this.serviceContainer.get<IApplicationShell>(IApplicationShell);
66+
this.statusBar = application.createStatusBarItem(alignment, priority);
67+
this.statusBar.command = Commands.Set_Interpreter;
68+
this.disposableRegistry.push(this.statusBar);
5369
}
70+
5471
public async refresh(resource?: Uri) {
5572
// Use the workspace Uri if available
5673
if (resource && this.workspaceService.getWorkspaceFolder(resource)) {
@@ -88,7 +105,11 @@ export class InterpreterDisplay implements IInterpreterDisplay {
88105
);
89106
this.interpreterPath = interpreter.path;
90107
}
91-
this.statusBar.text = interpreter.displayName!.substring('Python '.length);
108+
let text = interpreter.displayName!;
109+
if (this.experiments.inExperimentSync(InterpreterStatusBarPosition.Pinned)) {
110+
text = text.substring('Python '.length);
111+
}
112+
this.statusBar.text = text;
92113
this.currentlySelectedInterpreterPath = interpreter.path;
93114
} else {
94115
this.statusBar.tooltip = '';

src/client/interpreter/interpreterService.ts

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
1+
// eslint-disable-next-line max-classes-per-file
12
import { inject, injectable } from 'inversify';
23
import { Disposable, Event, EventEmitter, Uri } from 'vscode';
34
import '../common/extensions';
45
import { IDocumentManager } from '../common/application/types';
56
import { IPythonExecutionFactory } from '../common/process/types';
6-
import { IConfigurationService, IDisposableRegistry, IInterpreterPathService } from '../common/types';
7+
import {
8+
IConfigurationService,
9+
IDisposableRegistry,
10+
IExperimentService,
11+
IInterpreterPathService,
12+
} from '../common/types';
713
import { IServiceContainer } from '../ioc/types';
814
import { PythonEnvironment } from '../pythonEnvironments/info';
915
import {
1016
IComponentAdapter,
1117
IInterpreterDisplay,
1218
IInterpreterService,
19+
IInterpreterStatusbarVisibilityFilter,
1320
PythonEnvironmentsChangedEvent,
1421
} from './contracts';
1522
import { PythonLocatorQuery } from '../pythonEnvironments/base/locator';
1623
import { traceError } from '../logging';
24+
import { PYTHON_LANGUAGE } from '../common/constants';
25+
import { InterpreterStatusBarPosition } from '../common/experiments/groups';
1726

1827
type StoredPythonEnvironment = PythonEnvironment & { store?: boolean };
1928

@@ -80,6 +89,22 @@ export class InterpreterService implements Disposable, IInterpreterService {
8089
public initialize(): void {
8190
const disposables = this.serviceContainer.get<Disposable[]>(IDisposableRegistry);
8291
const documentManager = this.serviceContainer.get<IDocumentManager>(IDocumentManager);
92+
const interpreterDisplay = this.serviceContainer.get<IInterpreterDisplay>(IInterpreterDisplay);
93+
const filter = new (class implements IInterpreterStatusbarVisibilityFilter {
94+
constructor(private readonly docManager: IDocumentManager) {}
95+
96+
public readonly interpreterVisibilityEmitter = new EventEmitter<void>();
97+
98+
public readonly changed = this.interpreterVisibilityEmitter.event;
99+
100+
get hidden() {
101+
return this.docManager.activeTextEditor?.document.languageId !== PYTHON_LANGUAGE;
102+
}
103+
})(documentManager);
104+
const experiments = this.serviceContainer.get<IExperimentService>(IExperimentService);
105+
if (experiments.inExperimentSync(InterpreterStatusBarPosition.Pinned)) {
106+
interpreterDisplay.registerVisibilityFilter(filter);
107+
}
83108
disposables.push(
84109
this.onDidChangeInterpreters((e) => {
85110
const interpreter = e.old ?? e.new;
@@ -89,9 +114,15 @@ export class InterpreterService implements Disposable, IInterpreterService {
89114
}),
90115
);
91116
disposables.push(
92-
documentManager.onDidChangeActiveTextEditor((e) =>
93-
e && e.document ? this.refresh(e.document.uri) : undefined,
94-
),
117+
documentManager.onDidOpenTextDocument(() => {
118+
filter.interpreterVisibilityEmitter.fire();
119+
}),
120+
documentManager.onDidChangeActiveTextEditor((e) => {
121+
filter.interpreterVisibilityEmitter.fire();
122+
if (e && e.document) {
123+
this.refresh(e.document.uri);
124+
}
125+
}),
95126
);
96127
const pySettings = this.configService.getSettings();
97128
this._pythonPathSetting = pySettings.pythonPath;

src/client/interpreter/serviceRegistry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export function registerInterpreterTypes(serviceManager: IServiceManager): void
5757

5858
serviceManager.addSingleton<IInterpreterService>(IInterpreterService, InterpreterService);
5959
serviceManager.addSingleton<IInterpreterDisplay>(IInterpreterDisplay, InterpreterDisplay);
60+
serviceManager.addBinding(IInterpreterDisplay, IExtensionSingleActivationService);
6061

6162
serviceManager.addSingleton<IPythonPathUpdaterServiceFactory>(
6263
IPythonPathUpdaterServiceFactory,

0 commit comments

Comments
 (0)