use tokio_util::sync::CancellationToken; use crate::analysis_db::SharedDb; /// Solicita rebuild do projeto (coarse). Cancela rebuild anterior se em progresso. /// Implementação inicial: apenas cria task e retorna. pub async fn request_rebuild(db: SharedDb) { // 1) lock curto: cancelar token anterior e instalar token novo let new_token = CancellationToken::new(); { let mut guard = db.write().await; if let Some(prev) = guard.active_rebuild.take() { prev.cancel(); } guard.active_rebuild = Some(new_token.clone()); } // 2) spawn task: roda análise fora do lock tokio::spawn(async move { // Ponto seguro: checar antes de começar if new_token.is_cancelled() { return; } // TODO(PR-03/04/05): // - Clonar snapshot de FileDB // - Parsing // - Binding/Resolver // - Typecheck // - Coleta de diagnostics // Ponto seguro: após parsing if new_token.is_cancelled() { return; } // Ponto seguro: após resolver if new_token.is_cancelled() { return; } // Ponto seguro: após typecheck if new_token.is_cancelled() { return; } // 3) lock curto: se token não cancelado, swap estado + revision++ if !new_token.is_cancelled() { let mut guard = db.write().await; // TODO: checar se o token ainda é o ativo quando tivermos um identificador estável if !new_token.is_cancelled() { // TODO: aplicar resultados reais de análise quando disponíveis guard.revision = guard.revision.saturating_add(1); // Nota: não limpamos `active_rebuild` aqui para evitar interferir num rebuild mais novo } } }); }