mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-11-03 13:13:18 +00:00 
			
		
		
		
	Integrate feedback
* pass in existing `Semantics` object to function * pass in `Definition` for param type * refactor iterator to use `flatten`
This commit is contained in:
		
							parent
							
								
									ce1c85317f
								
							
						
					
					
						commit
						e78df83e2f
					
				@ -1,4 +1,4 @@
 | 
				
			|||||||
use hir::{Semantics, TypeParam};
 | 
					use hir::Semantics;
 | 
				
			||||||
use ide_db::{
 | 
					use ide_db::{
 | 
				
			||||||
    base_db::{FileId, FileRange},
 | 
					    base_db::{FileId, FileRange},
 | 
				
			||||||
    defs::Definition,
 | 
					    defs::Definition,
 | 
				
			||||||
@ -60,7 +60,9 @@ pub(crate) fn replace_named_generic_with_impl(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let type_param_hir_def = ctx.sema.to_def(&type_param)?;
 | 
					    let type_param_hir_def = ctx.sema.to_def(&type_param)?;
 | 
				
			||||||
    if is_referenced_outside(ctx.db(), type_param_hir_def, &fn_, ctx.file_id()) {
 | 
					    let type_param_def = Definition::GenericParam(hir::GenericParam::TypeParam(type_param_hir_def));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if is_referenced_outside(&ctx.sema, type_param_def, &fn_, ctx.file_id()) {
 | 
				
			||||||
        return None;
 | 
					        return None;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -100,27 +102,20 @@ pub(crate) fn replace_named_generic_with_impl(
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn is_referenced_outside(
 | 
					fn is_referenced_outside(
 | 
				
			||||||
    db: &RootDatabase,
 | 
					    sema: &Semantics<'_, RootDatabase>,
 | 
				
			||||||
    type_param: TypeParam,
 | 
					    type_param_def: Definition,
 | 
				
			||||||
    fn_: &ast::Fn,
 | 
					    fn_: &ast::Fn,
 | 
				
			||||||
    file_id: FileId,
 | 
					    file_id: FileId,
 | 
				
			||||||
) -> bool {
 | 
					) -> bool {
 | 
				
			||||||
    let semantics = Semantics::new(db);
 | 
					 | 
				
			||||||
    let type_param_def = Definition::GenericParam(hir::GenericParam::TypeParam(type_param));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // limit search scope to function body & return type
 | 
					    // limit search scope to function body & return type
 | 
				
			||||||
    let search_ranges = vec![
 | 
					    let search_ranges = vec![
 | 
				
			||||||
        fn_.body().map(|body| body.syntax().text_range()),
 | 
					        fn_.body().map(|body| body.syntax().text_range()),
 | 
				
			||||||
        fn_.ret_type().map(|ret_type| ret_type.syntax().text_range()),
 | 
					        fn_.ret_type().map(|ret_type| ret_type.syntax().text_range()),
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    search_ranges.into_iter().filter_map(|search_range| search_range).any(|search_range| {
 | 
					    search_ranges.into_iter().flatten().any(|search_range| {
 | 
				
			||||||
        let file_range = FileRange { file_id, range: search_range };
 | 
					        let file_range = FileRange { file_id, range: search_range };
 | 
				
			||||||
        !type_param_def
 | 
					        !type_param_def.usages(sema).in_scope(SearchScope::file_range(file_range)).all().is_empty()
 | 
				
			||||||
            .usages(&semantics)
 | 
					 | 
				
			||||||
            .in_scope(SearchScope::file_range(file_range))
 | 
					 | 
				
			||||||
            .all()
 | 
					 | 
				
			||||||
            .is_empty()
 | 
					 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user