/** * CodeLens 提供器 - 提供 Accept/Reject 按钮 */ import * as vscode from 'vscode'; import { SnapshotManager } from '../snapshot/snapshotManager'; import { COMMANDS } from '../models/constants'; export class CodeLensProvider implements vscode.CodeLensProvider { private _onDidChangeCodeLenses = new vscode.EventEmitter(); readonly onDidChangeCodeLenses = this._onDidChangeCodeLenses.event; constructor(private snapshotManager: SnapshotManager) {} /** * 刷新 CodeLens */ refresh(): void { this._onDidChangeCodeLenses.fire(); } /** * 提供 CodeLens */ provideCodeLenses( document: vscode.TextDocument, token: vscode.CancellationToken ): vscode.CodeLens[] { const snapshot = this.snapshotManager.getSnapshotByFilePath(document.uri.fsPath); if (!snapshot || snapshot.status !== 'active') { return []; } const codeLenses: vscode.CodeLens[] = []; // 为每个待处理的块添加 CodeLens snapshot.chunks.forEach(chunk => { if (chunk.status !== 'pending') return; const range = new vscode.Range( new vscode.Position(chunk.startLine, 0), new vscode.Position(chunk.startLine, 0) ); // Accept 按钮 codeLenses.push( new vscode.CodeLens(range, { title: '$(check) Accept', command: COMMANDS.ACCEPT_CHUNK, arguments: [snapshot.id, chunk.id], tooltip: '接受此变更块', }) ); // Reject 按钮 codeLenses.push( new vscode.CodeLens(range, { title: '$(close) Reject', command: COMMANDS.REJECT_CHUNK, arguments: [snapshot.id, chunk.id], tooltip: '拒绝此变更块', }) ); }); // 如果有多个块,添加全局操作按钮 const pendingChunks = snapshot.chunks.filter(c => c.status === 'pending'); if (pendingChunks.length > 1) { const firstChunk = pendingChunks[0]; const range = new vscode.Range( new vscode.Position(firstChunk.startLine, 0), new vscode.Position(firstChunk.startLine, 0) ); codeLenses.push( new vscode.CodeLens(range, { title: '$(check-all) Accept All', command: COMMANDS.ACCEPT_ALL, arguments: [snapshot.id], tooltip: '接受所有变更', }) ); codeLenses.push( new vscode.CodeLens(range, { title: '$(trash) Reject All', command: COMMANDS.REJECT_ALL, arguments: [snapshot.id], tooltip: '拒绝所有变更', }) ); } return codeLenses; } }