@@ -17,6 +17,7 @@ import {
1717 workspace ,
1818 TextEditorRevealType ,
1919 TabInputTextDiff ,
20+ EventEmitter ,
2021} from 'vscode'
2122import type {
2223 ChildToParent ,
@@ -41,10 +42,17 @@ let lastRewrite = ''
4142const previewContents : Map < string , string > = new Map ( )
4243
4344class AstGrepPreviewProvider implements TextDocumentContentProvider {
45+ private emitter = new EventEmitter < Uri > ( )
46+ onDidChange = this . emitter . event
47+
4448 // TODO: add cancellation
4549 provideTextDocumentContent ( uri : Uri , _token : CancellationToken ) : string {
4650 return previewContents . get ( uri . path ) || ''
4751 }
52+
53+ notifyDiffChange ( uri : Uri ) {
54+ this . emitter . fire ( uri )
55+ }
4856}
4957const previewProvider = new AstGrepPreviewProvider ( )
5058
@@ -95,12 +103,13 @@ async function previewDiff({
95103 filePath,
96104 locationsToSelect,
97105 diffs,
106+ forceReload = false ,
98107} : ChildToParent [ 'previewDiff' ] ) {
99108 const fileUri = workspaceUriFromFilePath ( filePath )
100109 if ( ! fileUri ) {
101110 return
102111 }
103- await generatePreview ( fileUri , diffs )
112+ await generatePreview ( fileUri , diffs , forceReload )
104113 const previewUri = fileUri . with ( { scheme : SCHEME } )
105114 const filename = path . basename ( filePath )
106115 // https://github.com/microsoft/vscode/blob/d63202a5382aa104f5515ea09053a2a21a2587c6/src/vs/workbench/api/common/extHostApiCommands.ts#L422
@@ -156,7 +165,6 @@ async function onCommitChange(payload: ChildToParent['commitChange']) {
156165 return
157166 }
158167 await doChange ( fileUri , payload )
159- // TODO: we can use Promise.all after preview has onChange event
160168 await refreshSearchResult ( payload . id , fileUri , {
161169 inputValue,
162170 rewrite,
@@ -199,6 +207,8 @@ async function refreshSearchResult(
199207 const final = conclude ( )
200208 const replaced = new TextDecoder ( 'utf-8' ) . decode ( final )
201209 previewContents . set ( fileUri . path , replaced )
210+ // refresh diff
211+ previewProvider . notifyDiffChange ( fileUri )
202212 parentPort . postMessage ( 'refreshSearchResult' , {
203213 id,
204214 updatedResults,
@@ -261,8 +271,8 @@ function bufferMaker(bytes: Uint8Array) {
261271 }
262272}
263273
264- async function generatePreview ( uri : Uri , diffs : Diff [ ] ) {
265- if ( previewContents . has ( uri . path ) ) {
274+ async function generatePreview ( uri : Uri , diffs : Diff [ ] , forceReload : boolean ) {
275+ if ( previewContents . has ( uri . path ) && ! forceReload ) {
266276 return
267277 }
268278 // TODO, maybe we also need a rewrite change event?
@@ -274,4 +284,8 @@ async function generatePreview(uri: Uri, diffs: Diff[]) {
274284 const final = conclude ( )
275285 const replaced = new TextDecoder ( 'utf-8' ) . decode ( final )
276286 previewContents . set ( uri . path , replaced )
287+ if ( forceReload ) {
288+ const previewUri = uri . with ( { scheme : SCHEME } )
289+ previewProvider . notifyDiffChange ( previewUri )
290+ }
277291}
0 commit comments