mirror of
https://github.com/Microsoft/vscode
synced 2024-08-27 21:09:43 +00:00
Fix codeblock streaming (#208952)
* Suggestion for microsoft/vscode-copilot-release#983 * Update codeblock when response is done, in case it wasn't rendered * Clean up
This commit is contained in:
parent
b065dc2b60
commit
d948d379b2
|
@ -33,7 +33,7 @@ import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/browser/widge
|
|||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService';
|
||||
import { localize } from 'vs/nls';
|
||||
import { createActionViewItem, IMenuEntryActionViewItemOptions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
|
||||
import { IMenuEntryActionViewItemOptions, MenuEntryActionViewItem, createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
|
||||
import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar';
|
||||
import { MenuId, MenuItemAction } from 'vs/platform/actions/common/actions';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
|
@ -918,17 +918,13 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
|
|||
}
|
||||
|
||||
const sessionId = isResponseVM(element) || isRequestVM(element) ? element.sessionId : '';
|
||||
const modelEntry = this.codeBlockModelCollection.get(sessionId, element, index);
|
||||
if (!modelEntry) {
|
||||
console.error('Trying to render code block without model', element.id, index);
|
||||
return $('div');
|
||||
}
|
||||
const modelEntry = this.codeBlockModelCollection.getOrCreate(sessionId, element, index);
|
||||
vulns = modelEntry.vulns;
|
||||
textModel = modelEntry.model;
|
||||
}
|
||||
|
||||
const hideToolbar = isResponseVM(element) && element.errorDetails?.responseIsFiltered;
|
||||
const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: templateData.contextKeyService, vulns });
|
||||
const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: templateData.contextKeyService, vulns }, text);
|
||||
|
||||
// Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping)
|
||||
// not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render)
|
||||
|
@ -975,9 +971,13 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
|
|||
};
|
||||
}
|
||||
|
||||
private renderCodeBlock(data: ICodeBlockData): IDisposableReference<CodeBlockPart> {
|
||||
private renderCodeBlock(data: ICodeBlockData, text: string): IDisposableReference<CodeBlockPart> {
|
||||
const ref = this._editorPool.get();
|
||||
const editorInfo = ref.object;
|
||||
if (isResponseVM(data.element)) {
|
||||
this.codeBlockModelCollection.update(data.element.sessionId, data.element, data.codeBlockIndex, { text, languageId: data.languageId });
|
||||
}
|
||||
|
||||
editorInfo.render(data, this._currentLayoutWidth, this.rendererOptions.editableCodeBlock);
|
||||
|
||||
return ref;
|
||||
|
|
|
@ -241,7 +241,9 @@ export class ChatViewModel extends Disposable implements IChatViewModel {
|
|||
private onAddResponse(responseModel: IChatResponseModel) {
|
||||
const response = this.instantiationService.createInstance(ChatResponseViewModel, responseModel);
|
||||
this._register(response.onDidChange(() => {
|
||||
this.updateCodeBlockTextModels(response);
|
||||
if (response.isComplete) {
|
||||
this.updateCodeBlockTextModels(response);
|
||||
}
|
||||
return this._onDidChange.fire(null);
|
||||
}));
|
||||
this._items.push(response);
|
||||
|
|
Loading…
Reference in a new issue