Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/inlineCompletions/common/inlineCompletionsUnification.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { equals } from '../../../../base/common/arrays.js';
7
import { Event, Emitter } from '../../../../base/common/event.js';
8
import { Disposable } from '../../../../base/common/lifecycle.js';
9
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
10
import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';
11
import { IWorkbenchAssignmentService } from '../../assignment/common/assignmentService.js';
12
13
export const IInlineCompletionsUnificationService = createDecorator<IInlineCompletionsUnificationService>('inlineCompletionsUnificationService');
14
15
export interface IInlineCompletionsUnificationState {
16
codeUnification: boolean;
17
modelUnification: boolean;
18
expAssignments: string[];
19
}
20
21
export interface IInlineCompletionsUnificationService {
22
readonly _serviceBrand: undefined;
23
24
readonly state: IInlineCompletionsUnificationState;
25
onDidStateChange: Event<void>;
26
}
27
28
const CODE_UNIFICATION_PREFIX = 'cmp-cht-';
29
const CODE_UNIFICATION_FF = 'inlineCompletionsUnificationCode';
30
const MODEL_UNIFICATION_FF = 'inlineCompletionsUnificationModel';
31
32
export class InlineCompletionsUnificationImpl extends Disposable implements IInlineCompletionsUnificationService {
33
readonly _serviceBrand: undefined;
34
35
private _state = new InlineCompletionsUnificationState(false, false, []);
36
public get state(): IInlineCompletionsUnificationState { return this._state; }
37
38
private readonly _onDidStateChange = this._register(new Emitter<void>());
39
public readonly onDidStateChange = this._onDidStateChange.event;
40
41
constructor(
42
@IWorkbenchAssignmentService private readonly _assignmentService: IWorkbenchAssignmentService
43
) {
44
super();
45
this._register(this._assignmentService.onDidRefetchAssignments(() => this._update()));
46
this._update();
47
}
48
49
private async _update(): Promise<void> {
50
const [codeUnificationFF, modelUnificationFF] = await Promise.all([
51
this._assignmentService.getTreatment<boolean>(CODE_UNIFICATION_FF),
52
this._assignmentService.getTreatment<boolean>(MODEL_UNIFICATION_FF),
53
]);
54
// Intentionally read the current experiments after fetching the treatments
55
const currentExperiments = await this._assignmentService.getCurrentExperiments();
56
const newState = new InlineCompletionsUnificationState(
57
codeUnificationFF === true,
58
modelUnificationFF === true,
59
currentExperiments?.filter(exp => exp.startsWith(CODE_UNIFICATION_PREFIX)) ?? []
60
);
61
if (this._state.equals(newState)) {
62
return;
63
}
64
this._state = newState;
65
this._onDidStateChange.fire();
66
}
67
}
68
69
class InlineCompletionsUnificationState implements IInlineCompletionsUnificationState {
70
constructor(
71
public readonly codeUnification: boolean,
72
public readonly modelUnification: boolean,
73
public readonly expAssignments: string[]
74
) {
75
}
76
77
equals(other: IInlineCompletionsUnificationState): boolean {
78
return this.codeUnification === other.codeUnification
79
&& this.modelUnification === other.modelUnification
80
&& equals(this.expAssignments, other.expAssignments);
81
}
82
}
83
84
registerSingleton(IInlineCompletionsUnificationService, InlineCompletionsUnificationImpl, InstantiationType.Delayed);
85
86