use pedant_types::{ResolutionReport, SourceSpan, SymbolDefinition, SymbolReference};
use crate::resolution::line_index::SourceLines;
pub(crate) enum SiteError {
UnknownFile {
file: Box<str>,
},
InvalidCoordinate {
file: Box<str>,
line: u32,
column: u32,
},
}
pub(crate) fn validate_sites(
lines: &SourceLines<'_>,
report: &ResolutionReport,
) -> Result<(), SiteError> {
for definition in report.definitions() {
validate_span(lines, SymbolDefinition::span(definition))?;
}
for reference in report.references() {
validate_span(lines, SymbolReference::span(reference))?;
}
Ok(())
}
fn validate_span(lines: &SourceLines<'_>, span: &SourceSpan) -> Result<(), SiteError> {
let index = lines
.get(span.file())
.ok_or_else(|| SiteError::UnknownFile {
file: Box::from(span.file()),
})?;
for at in [span.start(), span.end()] {
if !index.holds(at.line(), at.column()) {
return Err(SiteError::InvalidCoordinate {
file: Box::from(span.file()),
line: at.line(),
column: at.column(),
});
}
}
Ok(())
}