use std::ops::Deref;
use crate::{
ast::{self, span::Span},
attributes::LinkedItemGraph,
printer::pretty_ast::ToDocument,
};
use ast::visitors::dyn_compatible;
pub mod pretty_ast;
pub use pretty_ast::PrettyAst;
pub mod render_view;
pub trait Resugaring: for<'a> dyn_compatible::AstVisitorMut<'a> {
fn name(&self) -> String;
}
pub trait Printer: Sized + PrettyAst<Span> + Default + HasLinkedItemGraph {
fn resugaring_phases() -> Vec<Box<dyn Resugaring>>;
const NAME: &'static str = <Self as PrettyAst<Span>>::NAME;
}
pub trait HasLinkedItemGraph {
fn linked_item_graph(&self) -> &LinkedItemGraph;
fn with_linked_item_graph(self, graph: std::rc::Rc<LinkedItemGraph>) -> Self;
}
pub struct SourceMap;
pub trait Print<T>: Printer {
fn print(&mut self, mut fragment: T) -> (String, SourceMap)
where
T: ToDocument<Self, Span>,
for<'a> dyn Resugaring: dyn_compatible::AstVisitableMut<'a, T>,
{
for mut reguaring_phase in Self::resugaring_phases() {
reguaring_phase.visit(&mut fragment)
}
let doc_builder = fragment.to_document(self).into_doc();
(doc_builder.deref().pretty(80).to_string(), SourceMap)
}
}
impl<P: Printer, T> Print<T> for P {}