Skip to content

Commit 0c1ff56

Browse files
authored
Support colorization of injected text with NES (microsoft#239236)
fix microsoft/vscode-copilot#12426
1 parent 0446f81 commit 0c1ff56

File tree

2 files changed

+20
-11
lines changed

2 files changed

+20
-11
lines changed

src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineDiffView.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { LineSource, renderLines, RenderOptions } from '../../../../../browser/w
1212
import { diffAddDecoration } from '../../../../../browser/widget/diffEditor/registrations.contribution.js';
1313
import { applyViewZones, IObservableViewZone } from '../../../../../browser/widget/diffEditor/utils.js';
1414
import { EditorOption } from '../../../../../common/config/editorOptions.js';
15+
import { OffsetRange } from '../../../../../common/core/offsetRange.js';
1516
import { Range } from '../../../../../common/core/range.js';
1617
import { AbstractText } from '../../../../../common/core/textEdit.js';
1718
import { DetailedLineRangeMapping } from '../../../../../common/diff/rangeMapping.js';
@@ -36,6 +37,8 @@ export class OriginalEditorInlineDiffView extends Disposable implements IInlineE
3637

3738
readonly isHovered = constObservable(false);
3839

40+
private readonly _tokenizationFinished = modelTokenizationFinished(this._modifiedTextModel);
41+
3942
constructor(
4043
private readonly _originalEditor: ICodeEditor,
4144
private readonly _state: IObservable<IOriginalEditorInlineDiffViewState | undefined>,
@@ -55,8 +58,6 @@ export class OriginalEditorInlineDiffView extends Disposable implements IInlineE
5558

5659
const editor = observableCodeEditor(this._originalEditor);
5760

58-
const tokenizationFinished = modelTokenizationFinished(_modifiedTextModel);
59-
6061
const originalViewZones = derived(this, (reader) => {
6162
const originalModel = editor.model.read(reader);
6263
if (!originalModel) { return []; }
@@ -73,7 +74,7 @@ export class OriginalEditorInlineDiffView extends Disposable implements IInlineE
7374
continue;
7475
}
7576

76-
tokenizationFinished.read(reader); // Update view-zones once tokenization completes
77+
this._tokenizationFinished.read(reader); // Update view-zones once tokenization completes
7778

7879
const source = new LineSource(diff.modified.mapToLineArray(l => this._modifiedTextModel.tokenization.getLineTokens(l)));
7980

@@ -217,15 +218,26 @@ export class OriginalEditorInlineDiffView extends Disposable implements IInlineE
217218
// when the injected text becomes long, the editor will split it into multiple spans
218219
// to be able to get the border around the start and end of the text, we need to split it into multiple segments
219220
const textSegments = insertedText.length > 3 ?
220-
[{ text: insertedText.slice(0, 1), extraClasses: ['start'] }, { text: insertedText.slice(1, -1), extraClasses: [] }, { text: insertedText.slice(-1), extraClasses: ['end'] }] :
221-
[{ text: insertedText, extraClasses: ['start', 'end'] }];
222-
223-
for (const { text, extraClasses } of textSegments) {
221+
[
222+
{ text: insertedText.slice(0, 1), extraClasses: ['start'], offsetRange: new OffsetRange(i.modifiedRange.startColumn - 1, i.modifiedRange.startColumn) },
223+
{ text: insertedText.slice(1, -1), extraClasses: [], offsetRange: new OffsetRange(i.modifiedRange.startColumn, i.modifiedRange.endColumn - 2) },
224+
{ text: insertedText.slice(-1), extraClasses: ['end'], offsetRange: new OffsetRange(i.modifiedRange.endColumn - 2, i.modifiedRange.endColumn - 1) }
225+
] :
226+
[
227+
{ text: insertedText, extraClasses: ['start', 'end'], offsetRange: new OffsetRange(i.modifiedRange.startColumn - 1, i.modifiedRange.endColumn) }
228+
];
229+
230+
// Tokenization
231+
this._tokenizationFinished.read(reader); // reconsider when tokenization is finished
232+
const lineTokens = this._modifiedTextModel.tokenization.getLineTokens(i.modifiedRange.startLineNumber);
233+
234+
for (const { text, extraClasses, offsetRange } of textSegments) {
224235
originalDecorations.push({
225236
range: Range.fromPositions(i.originalRange.getEndPosition()),
226237
options: {
227238
description: 'inserted-text',
228239
before: {
240+
tokens: lineTokens.getTokensInRange(offsetRange),
229241
content: text,
230242
inlineClassName: classNames(
231243
'inlineCompletions-char-insert',

src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/view.css

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,22 +177,19 @@
177177
border-radius: 4px;
178178
border: 1px solid var(--vscode-editorHoverWidget-border);
179179
margin: -2px 0 0 -2px;
180-
padding: 2px;
181180
}
182181

183182
.inlineCompletions-char-insert.single-line-inline { /* Inline Decoration */
184-
padding: 2px 0;
183+
padding: 1px 0;
185184
border-top: 1px solid var(--vscode-editorHoverWidget-border);
186185
border-bottom: 1px solid var(--vscode-editorHoverWidget-border);
187186
}
188187
.inlineCompletions-char-insert.single-line-inline.start {
189-
padding-left: 2px;
190188
border-top-left-radius: 4px;
191189
border-bottom-left-radius: 4px;
192190
border-left: 1px solid var(--vscode-editorHoverWidget-border);
193191
}
194192
.inlineCompletions-char-insert.single-line-inline.end {
195-
padding-right: 2px;
196193
border-top-right-radius: 4px;
197194
border-bottom-right-radius: 4px;
198195
border-right: 1px solid var(--vscode-editorHoverWidget-border);

0 commit comments

Comments
 (0)