pub mod base;
pub mod harvest;
pub mod model;
pub mod typeexpr;
use std::collections::BTreeMap;
use std::path::PathBuf;
use std::sync::Arc;
use crate::environment::Environment;
pub use base::{build_system_index, build_system_library};
pub use harvest::{harvest_entry, harvest_package, harvest_package_named};
pub use model::{
ConstDef, DefLocation, Docstring, ExportedName, Field, FunctionGroup, HarvestDiagnostic,
MacroDef, Method, ModuleIndex, PackageIndex, Param, Span, TypeDef, TypeKind, Visibility,
};
pub use typeexpr::TypeExpr;
#[derive(Debug, Clone, Default)]
pub struct HarvestedLibrary {
pub packages: BTreeMap<String, Arc<PackageIndex>>,
pub roots: BTreeMap<String, PathBuf>,
pub workspaces: Vec<String>,
}
pub fn harvest_library(env: &Environment) -> HarvestedLibrary {
harvest_libraries(std::slice::from_ref(env))
}
pub fn dev_packages(envs: &[Environment]) -> Vec<crate::environment::DevPackage> {
let mut out: Vec<crate::environment::DevPackage> = Vec::new();
for env in envs {
let Some(dev) = env.dev_package() else {
continue;
};
if out.iter().any(|d| d.name == dev.name) {
continue; }
out.push(dev);
}
out
}
pub fn harvest_libraries(envs: &[Environment]) -> HarvestedLibrary {
let install = envs.iter().find_map(|env| env.install.as_ref());
let mut lib = build_system_library(install);
let mut claimed = std::collections::BTreeSet::new();
for env in envs {
for package in &env.packages {
let Some(source) = &package.source else {
continue;
};
if !claimed.insert(package.name.clone()) {
continue; }
let index = harvest_package_named(source, &package.name);
lib.packages.insert(package.name.clone(), Arc::new(index));
lib.roots.insert(package.name.clone(), source.clone());
}
}
for dev in dev_packages(envs) {
lib.packages
.insert(dev.name.clone(), Arc::new(harvest_workspace(&dev)));
lib.roots.insert(dev.name.clone(), dev.root);
lib.workspaces.push(dev.name);
}
lib.workspaces.sort();
lib
}
pub fn harvest_workspace(dev: &crate::environment::DevPackage) -> PackageIndex {
harvest_package_named(&dev.root, &dev.name)
}