Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsAccessibleView.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 { Emitter, Event } from '../../../../base/common/event.js';
7
import { ICodeEditor } from '../../../browser/editorBrowser.js';
8
import { ICodeEditorService } from '../../../browser/services/codeEditorService.js';
9
import { InlineCompletionContextKeys } from './controller/inlineCompletionContextKeys.js';
10
import { InlineCompletionsController } from './controller/inlineCompletionsController.js';
11
import { AccessibleViewType, AccessibleViewProviderId, IAccessibleViewContentProvider } from '../../../../platform/accessibility/browser/accessibleView.js';
12
import { IAccessibleViewImplementation } from '../../../../platform/accessibility/browser/accessibleViewRegistry.js';
13
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
14
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
15
import { Disposable } from '../../../../base/common/lifecycle.js';
16
import { InlineCompletionsModel } from './model/inlineCompletionsModel.js';
17
import { TextEdit } from '../../../common/core/edits/textEdit.js';
18
import { LineEdit } from '../../../common/core/edits/lineEdit.js';
19
import { TextModelText } from '../../../common/model/textModelText.js';
20
21
export class InlineCompletionsAccessibleView implements IAccessibleViewImplementation {
22
readonly type = AccessibleViewType.View;
23
readonly priority = 95;
24
readonly name = 'inline-completions';
25
readonly when = ContextKeyExpr.or(InlineCompletionContextKeys.inlineSuggestionVisible, InlineCompletionContextKeys.inlineEditVisible);
26
getProvider(accessor: ServicesAccessor) {
27
const codeEditorService = accessor.get(ICodeEditorService);
28
const editor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor();
29
if (!editor) {
30
return;
31
}
32
33
const model = InlineCompletionsController.get(editor)?.model.get();
34
if (!model?.state.get()) {
35
return;
36
}
37
38
return new InlineCompletionsAccessibleViewContentProvider(editor, model);
39
}
40
}
41
42
class InlineCompletionsAccessibleViewContentProvider extends Disposable implements IAccessibleViewContentProvider {
43
private readonly _onDidChangeContent: Emitter<void> = this._register(new Emitter<void>());
44
public readonly onDidChangeContent: Event<void> = this._onDidChangeContent.event;
45
public readonly options: { language: string | undefined; type: AccessibleViewType.View };
46
constructor(
47
private readonly _editor: ICodeEditor,
48
private readonly _model: InlineCompletionsModel,
49
) {
50
super();
51
this.options = { language: this._editor.getModel()?.getLanguageId() ?? undefined, type: AccessibleViewType.View };
52
}
53
54
public readonly id = AccessibleViewProviderId.InlineCompletions;
55
public readonly verbositySettingKey = 'accessibility.verbosity.inlineCompletions';
56
57
public provideContent(): string {
58
const state = this._model.state.get();
59
if (!state) {
60
throw new Error('Inline completion is visible but state is not available');
61
}
62
if (state.kind === 'ghostText') {
63
64
const lineText = this._model.textModel.getLineContent(state.primaryGhostText.lineNumber);
65
const ghostText = state.primaryGhostText.renderForScreenReader(lineText);
66
if (!ghostText) {
67
throw new Error('Inline completion is visible but ghost text is not available');
68
}
69
return lineText + ghostText;
70
} else {
71
const text = new TextModelText(this._model.textModel);
72
const lineEdit = LineEdit.fromTextEdit(new TextEdit(state.edits), text);
73
return lineEdit.humanReadablePatch(text.getLines());
74
}
75
}
76
public provideNextContent(): string | undefined {
77
// asynchronously update the model and fire the event
78
this._model.next().then((() => this._onDidChangeContent.fire()));
79
return;
80
}
81
public providePreviousContent(): string | undefined {
82
// asynchronously update the model and fire the event
83
this._model.previous().then((() => this._onDidChangeContent.fire()));
84
return;
85
}
86
public onClose(): void {
87
this._model.stop();
88
this._editor.focus();
89
}
90
}
91
92