All files / src/fix fixPreview.ts

42.5% Statements 34/80
66.66% Branches 2/3
25% Functions 2/8
42.5% Lines 34/80

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 811x 1x 1x 1x 1x 1x 1x 1x     1x 1x     1x 1x     1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                           1x 1x                           1x 1x                              
import * as vscode from 'vscode';
 
const scheme = 'codeReviewerPreview';
 
class FixPreviewContentProvider implements vscode.TextDocumentContentProvider {
  private texts = new Map<string, string>();
 
  provideTextDocumentContent(uri: vscode.Uri): string {
    return this.texts.get(uri.toString()) ?? '';
  }
 
  set(uri: vscode.Uri, text: string): void {
    this.texts.set(uri.toString(), text);
  }
 
  clear(uri: vscode.Uri): void {
    this.texts.delete(uri.toString());
  }
}
 
let previewProvider: FixPreviewContentProvider | null = null;
 
export function registerFixPreviewProvider(context: vscode.ExtensionContext): void {
  if (previewProvider) { return; }
  previewProvider = new FixPreviewContentProvider();
  context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider(scheme, previewProvider));
}
 
export interface PreviewRequest {
  originalText: string;
  newText: string;
  title: string;
  fileName: string;
}
 
export async function openPreviewDiff(req: PreviewRequest): Promise<vscode.Uri | undefined> {
  if (!previewProvider) { return undefined; }
  const stamp = Date.now();
  const originalUri = vscode.Uri.parse(`${scheme}://original/${encodeURIComponent(req.fileName)}-${stamp}`);
  const newUri = vscode.Uri.parse(`${scheme}://new/${encodeURIComponent(req.fileName)}-${stamp}`);
  previewProvider.set(originalUri, req.originalText);
  previewProvider.set(newUri, req.newText);

  await vscode.commands.executeCommand('vscode.diff', originalUri, newUri, req.title, {
    viewColumn: vscode.ViewColumn.Beside,
    preserveFocus: true,
  });
  return newUri;
}
 
export async function closePreviewEditor(uri: vscode.Uri): Promise<void> {
  if (!previewProvider) { return; }
  for (const group of vscode.window.tabGroups.all) {
    for (const tab of group.tabs) {
      if (tab.input instanceof vscode.TabInputTextDiff) {
        const modified = tab.input.modified;
        if (modified.toString() === uri.toString()) {
          await vscode.window.tabGroups.close(tab);
        }
      }
    }
  }
  previewProvider.clear(uri);
}
 
export async function applyNewText(
  document: vscode.TextDocument,
  newText: string
): Promise<boolean> {
  const originalText = document.getText();
  if (newText === originalText) { return true; }

  const edit = new vscode.WorkspaceEdit();
  const fullRange = new vscode.Range(
    document.positionAt(0),
    document.positionAt(originalText.length)
  );
  edit.replace(document.uri, fullRange, newText);
  return vscode.workspace.applyEdit(edit);
}