use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::Arc;
use ls_types::Uri;
use crate::config::ServerSettings;
use crate::semantic::types::{
DocumentAnalysis, LiveMetadataSnapshot, MergedSemanticModel, WorkspaceIndex,
};
#[derive(Debug, Default)]
pub struct ServerState {
pub settings: Arc<ServerSettings>,
pub workspace_folders: Vec<PathBuf>,
pub saved_workspace: Arc<WorkspaceIndex>,
pub open_documents: HashMap<Uri, Arc<DocumentAnalysis>>,
pub live_metadata: Arc<LiveMetadataSnapshot>,
pub model: Arc<MergedSemanticModel>,
pub last_walked: Option<Vec<PathBuf>>,
}
pub fn workspace_signature(folders: &[PathBuf]) -> Vec<PathBuf> {
let mut signature = folders.to_vec();
signature.sort();
signature
}
pub fn merged_workspace(
saved_workspace: &WorkspaceIndex,
open_documents: &HashMap<Uri, Arc<DocumentAnalysis>>,
) -> WorkspaceIndex {
let mut workspace = saved_workspace.clone();
for (uri, analysis) in open_documents {
workspace
.documents
.insert(uri.clone(), Arc::clone(analysis));
}
workspace
}