mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| 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);
 | |
|     }
 | |
| }
 | 
