use pedant_types::{ResolutionReportBuilder, ResolutionReportLimits, ResolutionTier};
use crate::resolution::go::limits::GoResolutionLimits;
use crate::resolution::go::snapshot::GoResolutionSnapshot;
use super::corpus::Corpus;
use super::definitions;
use super::error::GoResolutionError;
use super::implementations::Implementations;
use super::records;
use super::references;
use super::target::GoProjectResolution;
pub(super) fn resolve(
snapshot: &GoResolutionSnapshot,
) -> Result<GoProjectResolution, GoResolutionError> {
let report = write(snapshot, snapshot.limits())?;
GoProjectResolution::try_new(snapshot, report)
}
fn write(
snapshot: &GoResolutionSnapshot,
limits: GoResolutionLimits,
) -> Result<pedant_types::ResolutionReport, GoResolutionError> {
let corpus = Corpus::of(snapshot);
let mut builder =
ResolutionReportBuilder::new(ResolutionTier::Syntactic, ResolutionReportLimits::default());
let index = definitions::state(&mut builder, &corpus)?;
let implementations = Implementations::of(&index, &corpus, limits)?;
for (position, unit) in corpus.units().iter().enumerate() {
let stated = references::of_unit(&index, &corpus, &implementations, (position, unit))?;
records::write(&mut builder, &index, (&stated, position), limits)?;
}
Ok(builder.finish()?)
}