49 lines
1.8 KiB
Rust
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
|
|
}
|
|
}
|
|
});
|
|
}
|