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

53 lines
1.6 KiB
Rust

use std::sync::Arc;
use tokio::sync::RwLock;
use tokio_util::sync::CancellationToken;
use prometeu_analysis::FileDB;
use prometeu_analysis::ids::{FileId, ProjectId};
use std::collections::HashMap;
use crate::rebuild::LspDiagnostic;
use crate::rebuild::FlatSymbol;
#[derive(Default)]
pub struct AnalysisDb {
pub file_db: FileDB,
pub file_to_project: HashMap<FileId, ProjectId>,
// Os campos abaixo serão conectados conforme PR-03/04/05 (podem começar como None)
// pub ast: Option<AstArena>,
// pub symbols: Option<SymbolArena>,
// pub types: Option<TypeArena>,
// pub diagnostics: Vec<Diagnostic>,
/// Incrementa a cada rebuild concluído com sucesso
pub revision: u64,
/// Cancel token do último rebuild em progresso (se houver)
pub active_rebuild: Option<CancellationToken>,
/// Último snapshot bom (consultado pelos handlers LSP)
pub last_good: Option<AnalysisSnapshot>,
}
pub type SharedDb = Arc<RwLock<AnalysisDb>>;
impl AnalysisDb {
pub fn project_for_file(&self, file: FileId) -> Option<ProjectId> {
self.file_to_project.get(&file).copied()
}
/// Returns all known file ids in the FileDB.
pub fn file_ids(&self) -> Vec<FileId> {
// delegate to FileDB helper (added in prometeu-analysis)
self.file_db.all_files()
}
}
#[derive(Default, Clone)]
pub struct AnalysisSnapshot {
/// Diagnostics por arquivo (URI LSP → diagnostics já convertidos)
pub diagnostics_by_uri: HashMap<String, Vec<LspDiagnostic>>,
/// Lista “flatten” de símbolos para workspaceSymbol/documentSymbol
pub symbols_flat: Vec<FlatSymbol>,
}