2026-03-24 13:40:22 +00:00

49 lines
1.8 KiB
Rust

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
}
}
});
}