1use bynk_syntax::CompileError;
6use bynk_syntax::ast::SourceUnit;
7use bynk_syntax::lexer::Token;
8use bynk_syntax::parser;
9
10use crate::{checker, resolver};
11
12pub fn diagnose_unparsable(
19 tokens: &[Token],
20 source: &str,
21 strict: Vec<CompileError>,
22) -> Vec<CompileError> {
23 let parser::Recovered {
24 units,
25 errors,
26 broken_decl_names,
27 } = parser::parse_units_recovering(tokens, source);
28 let (recovered, _warnings) = bynk_syntax::partition_by_severity(errors);
29 let mut out = parser::merge_syntax_errors(strict, recovered);
30 if let Some(SourceUnit::Commons(commons)) = units.into_iter().next() {
31 let item_spans: Vec<_> = commons.items.iter().map(|i| i.span()).collect();
32 let (resolved, resolve_errors) = resolver::resolve_recovering(commons);
33 let (shown, _hidden) =
34 resolver::split_broken_decl_echoes(resolve_errors.clone(), &broken_decl_names);
35 out.extend(shown);
36 if let Err(checked) = checker::check(resolved) {
37 let (checked, _warnings) = bynk_syntax::partition_by_severity(checked);
38 let checked = resolver::without_resolve_echoes(checked, &resolve_errors, &item_spans);
41 out.extend(resolver::split_broken_decl_echoes(checked, &broken_decl_names).0);
42 }
43 }
44 out
45}