use rls_data::config::Config; use rls_data::{ self, Analysis, CompilationOptions, CratePreludeData, Def, DefKind, Impl, Import, MacroRef, Ref, RefKind, Relation, }; use rls_span::{Column, Row}; #[derive(Debug)] pub struct Access { pub reachable: bool, pub public: bool, } pub struct Dumper { result: Analysis, config: Config, } impl Dumper { pub fn new(config: Config) -> Dumper { Dumper { config: config.clone(), result: Analysis::new(config) } } pub fn analysis(&self) -> &Analysis { &self.result } } impl Dumper { pub fn crate_prelude(&mut self, data: CratePreludeData) { self.result.prelude = Some(data) } pub fn compilation_opts(&mut self, data: CompilationOptions) { self.result.compilation = Some(data); } pub fn _macro_use(&mut self, data: MacroRef) { if self.config.pub_only || self.config.reachable_only { return; } self.result.macro_refs.push(data); } pub fn import(&mut self, access: &Access, import: Import) { if !access.public && self.config.pub_only || !access.reachable && self.config.reachable_only { return; } self.result.imports.push(import); } pub fn dump_ref(&mut self, data: Ref) { if self.config.pub_only || self.config.reachable_only { return; } self.result.refs.push(data); } pub fn dump_def(&mut self, access: &Access, mut data: Def) { if !access.public && self.config.pub_only || !access.reachable && self.config.reachable_only { return; } if data.kind == DefKind::Mod && data.span.file_name.to_str().unwrap() != data.value { // If the module is an out-of-line definition, then we'll make the // definition the first character in the module's file and turn // the declaration into a reference to it. let rf = Ref { kind: RefKind::Mod, span: data.span, ref_id: data.id }; self.result.refs.push(rf); data.span = rls_data::SpanData { file_name: data.value.clone().into(), byte_start: 0, byte_end: 0, line_start: Row::new_one_indexed(1), line_end: Row::new_one_indexed(1), column_start: Column::new_one_indexed(1), column_end: Column::new_one_indexed(1), } } self.result.defs.push(data); } pub fn dump_relation(&mut self, data: Relation) { self.result.relations.push(data); } pub fn dump_impl(&mut self, data: Impl) { self.result.impls.push(data); } }