Skip to content

Commit 3d7aab3

Browse files
authored
makes inline chat hint stable wrt blame decoration (microsoft#235497) (microsoft#235598)
- change from injected text to after decoration - use class name for awol attachedData microsoft/vscode-copilot#10943
1 parent fe505be commit 3d7aab3

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

src/vs/workbench/contrib/inlineChat/browser/inlineChatCurrentLine.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { Range } from '../../../../editor/common/core/range.js';
1616
import { IPosition, Position } from '../../../../editor/common/core/position.js';
1717
import { AbstractInlineChatAction } from './inlineChatActions.js';
1818
import { EditorContextKeys } from '../../../../editor/common/editorContextKeys.js';
19-
import { InjectedTextCursorStops, IValidEditOperation, TrackedRangeStickiness } from '../../../../editor/common/model.js';
19+
import { IValidEditOperation, TrackedRangeStickiness } from '../../../../editor/common/model.js';
2020
import { URI } from '../../../../base/common/uri.js';
2121
import { isEqual } from '../../../../base/common/resources.js';
2222
import { StandardTokenType } from '../../../../editor/common/encodedTokenAttributes.js';
@@ -36,6 +36,8 @@ import { IConfigurationService } from '../../../../platform/configuration/common
3636
import { Event } from '../../../../base/common/event.js';
3737
import { observableCodeEditor } from '../../../../editor/browser/observableCodeEditor.js';
3838
import { PLAINTEXT_LANGUAGE_ID } from '../../../../editor/common/languages/modesRegistry.js';
39+
import { createStyleSheet2 } from '../../../../base/browser/domStylesheets.js';
40+
import { stringValue } from '../../../../base/browser/cssValue.js';
3941

4042
export const CTX_INLINE_CHAT_SHOWING_HINT = new RawContextKey<boolean>('inlineChatShowingHint', false, localize('inlineChatShowingHint', "Whether inline chat shows a contextual hint"));
4143

@@ -149,12 +151,6 @@ export class ShowInlineChatHintAction extends EditorAction2 {
149151
}
150152
}
151153

152-
class HintData {
153-
constructor(
154-
readonly setting: string
155-
) { }
156-
}
157-
158154
export class InlineChatHintsController extends Disposable implements IEditorContribution {
159155

160156
public static readonly ID = 'editor.contrib.inlineChatHints';
@@ -193,16 +189,18 @@ export class InlineChatHintsController extends Disposable implements IEditorCont
193189
if (e.target.type !== MouseTargetType.CONTENT_TEXT) {
194190
return;
195191
}
196-
const attachedData = e.target.detail.injectedText?.options.attachedData;
197-
if (!(attachedData instanceof HintData)) {
192+
if (!e.target.element?.classList.contains('inline-chat-hint-text')) {
198193
return;
199194
}
200195
if (e.event.leftButton) {
201196
commandService.executeCommand(_inlineChatActionId);
202197
this.hide();
203198
} else if (e.event.rightButton) {
204199
e.event.preventDefault();
205-
this._showContextMenu(e.event, attachedData.setting);
200+
this._showContextMenu(e.event, e.target.element?.classList.contains('whitespace')
201+
? InlineChatConfigKeys.LineEmptyHint
202+
: InlineChatConfigKeys.LineNLHint
203+
);
206204
}
207205
}));
208206

@@ -251,6 +249,9 @@ export class InlineChatHintsController extends Disposable implements IEditorCont
251249
return undefined;
252250
});
253251

252+
const style = createStyleSheet2();
253+
this._store.add(style);
254+
254255
this._store.add(autorun(r => {
255256

256257
const showData = showDataObs.read(r);
@@ -264,7 +265,7 @@ export class InlineChatHintsController extends Disposable implements IEditorCont
264265
const agentName = chatAgentService.getDefaultAgent(ChatAgentLocation.Editor)?.name ?? localize('defaultTitle', "Chat");
265266
const { position, isEol, isWhitespace, kb, model } = showData;
266267

267-
const inlineClassName: string[] = ['inline-chat-hint'];
268+
const inlineClassName: string[] = ['a' /*HACK but sorts as we want*/, 'inline-chat-hint', 'inline-chat-hint-text'];
268269
let content: string;
269270
if (isWhitespace) {
270271
content = '\u00a0' + localize('title2', "{0} to edit with {1}", kb, agentName);
@@ -275,6 +276,11 @@ export class InlineChatHintsController extends Disposable implements IEditorCont
275276
inlineClassName.push('embedded');
276277
}
277278

279+
style.setStyle(`.inline-chat-hint-text::after { content: ${stringValue(content)} }`);
280+
if (isWhitespace) {
281+
inlineClassName.push('whitespace');
282+
}
283+
278284
this._ctxShowingHint.set(true);
279285

280286
decos.set([{
@@ -283,13 +289,7 @@ export class InlineChatHintsController extends Disposable implements IEditorCont
283289
description: 'inline-chat-hint-line',
284290
showIfCollapsed: true,
285291
stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,
286-
after: {
287-
content,
288-
inlineClassName: inlineClassName.join(' '),
289-
inlineClassNameAffectsLetterSpacing: true,
290-
cursorStops: InjectedTextCursorStops.None,
291-
attachedData: new HintData(isWhitespace ? InlineChatConfigKeys.LineEmptyHint : InlineChatConfigKeys.LineNLHint)
292-
}
292+
afterContentClassName: inlineClassName.join(' '),
293293
}
294294
}]);
295295

0 commit comments

Comments
 (0)