@@ -5,7 +5,7 @@ use std::fmt;
5
5
use either::Either;
6
6
use hir::{
7
7
symbols::FileSymbol, AssocItem, Documentation, FieldSource, HasAttrs, HasContainer, HasSource,
8
- HirDisplay, InFile, LocalSource, ModuleSource,
8
+ HirDisplay, HirFileId, InFile, LocalSource, ModuleSource,
9
9
};
10
10
use ide_db::{
11
11
base_db::{FileId, FileRange},
@@ -92,10 +92,9 @@ impl NavigationTarget {
92
92
93
93
pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget {
94
94
let name = module.name(db).map(|it| it.to_smol_str()).unwrap_or_default();
95
- if let Some(src @ InFile { value, .. }) = &module.declaration_source(db) {
96
- let FileRange { file_id, range: full_range } = src.syntax().original_file_range(db);
97
- let focus_range =
98
- value.name().and_then(|it| orig_focus_range(db, src.file_id, it.syntax()));
95
+ if let Some(InFile { value, file_id }) = &module.declaration_source(db) {
96
+ let (file_id, full_range, focus_range) =
97
+ orig_range_with_focus(db, *file_id, value.syntax(), value.name());
99
98
let mut res = NavigationTarget::from_syntax(
100
99
file_id,
101
100
name,
@@ -131,14 +130,15 @@ impl NavigationTarget {
131
130
/// Allows `NavigationTarget` to be created from a `NameOwner`
132
131
pub(crate) fn from_named(
133
132
db: &RootDatabase,
134
- node @ InFile { file_id, value }: InFile<&dyn ast::HasName>,
133
+ InFile { file_id, value }: InFile<&dyn ast::HasName>,
135
134
kind: SymbolKind,
136
135
) -> NavigationTarget {
137
136
let name = value.name().map(|it| it.text().into()).unwrap_or_else(|| "_".into());
138
- let focus_range = value.name().and_then(|it| orig_focus_range(db, file_id, it.syntax()));
139
- let FileRange { file_id, range } = node.map(|it| it.syntax()).original_file_range(db);
140
137
141
- NavigationTarget::from_syntax(file_id, name, focus_range, range, kind)
138
+ let (file_id, full_range, focus_range) =
139
+ orig_range_with_focus(db, file_id, value.syntax(), value.name());
140
+
141
+ NavigationTarget::from_syntax(file_id, name, focus_range, full_range, kind)
142
142
}
143
143
144
144
fn from_syntax(
@@ -165,15 +165,21 @@ impl NavigationTarget {
165
165
impl TryToNav for FileSymbol {
166
166
fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
167
167
let full_range = self.loc.original_range(db);
168
- let name_range = self.loc.original_name_range(db)?;
168
+ let focus_range = self.loc.original_name_range(db).and_then(|it| {
169
+ if it.file_id == full_range.file_id {
170
+ Some(it.range)
171
+ } else {
172
+ None
173
+ }
174
+ });
169
175
170
176
Some(NavigationTarget {
171
177
file_id: full_range.file_id,
172
178
name: if self.is_alias { self.def.name(db)?.to_smol_str() } else { self.name.clone() },
173
179
alias: if self.is_alias { Some(self.name.clone()) } else { None },
174
180
kind: Some(hir::ModuleDefId::from(self.def).into()),
175
181
full_range: full_range.range,
176
- focus_range: Some(name_range.range) ,
182
+ focus_range,
177
183
container_name: self.container_name.clone(),
178
184
description: match self.def {
179
185
hir::ModuleDef::Module(it) => Some(it.display(db).to_string()),
@@ -340,15 +346,11 @@ impl ToNav for hir::Module {
340
346
let name = self.name(db).map(|it| it.to_smol_str()).unwrap_or_default();
341
347
let (syntax, focus) = match &value {
342
348
ModuleSource::SourceFile(node) => (node.syntax(), None),
343
- ModuleSource::Module(node) => (
344
- node.syntax(),
345
- node.name().and_then(|it| orig_focus_range(db, file_id, it.syntax())),
346
- ),
349
+ ModuleSource::Module(node) => (node.syntax(), node.name()),
347
350
ModuleSource::BlockExpr(node) => (node.syntax(), None),
348
351
};
349
- let FileRange { file_id, range: full_range } =
350
- InFile::new(file_id, syntax).original_file_range(db);
351
- NavigationTarget::from_syntax(file_id, name, focus, full_range, SymbolKind::Module)
352
+ let (file_id, full_range, focus_range) = orig_range_with_focus(db, file_id, syntax, focus);
353
+ NavigationTarget::from_syntax(file_id, name, focus_range, full_range, SymbolKind::Module)
352
354
}
353
355
}
354
356
@@ -357,17 +359,14 @@ impl TryToNav for hir::Impl {
357
359
let InFile { file_id, value } = self.source(db)?;
358
360
let derive_attr = self.is_builtin_derive(db);
359
361
360
- let focus_range = if derive_attr.is_some() {
361
- None
362
- } else {
363
- value.self_ty().and_then(|ty| orig_focus_range(db, file_id, ty.syntax()))
364
- };
362
+ let focus = if derive_attr.is_some() { None } else { value.self_ty() };
365
363
366
- let FileRange { file_id, range: full_range } = match &derive_attr {
367
- Some(attr) => attr.syntax().original_file_range(db ),
368
- None => InFile::new(file_id, value.syntax()).original_file_range(db ),
364
+ let syntax = match &derive_attr {
365
+ Some(attr) => attr.value. syntax(),
366
+ None => value.syntax(),
369
367
};
370
368
369
+ let (file_id, full_range, focus_range) = orig_range_with_focus(db, file_id, syntax, focus);
371
370
Some(NavigationTarget::from_syntax(
372
371
file_id,
373
372
"impl".into(),
@@ -456,9 +455,8 @@ impl ToNav for LocalSource {
456
455
Either::Left(bind_pat) => (bind_pat.syntax(), bind_pat.name()),
457
456
Either::Right(it) => (it.syntax(), it.name()),
458
457
};
459
- let focus_range = name.and_then(|it| orig_focus_range(db, file_id, it.syntax()));
460
- let FileRange { file_id, range: full_range } =
461
- InFile::new(file_id, node).original_file_range(db);
458
+
459
+ let (file_id, full_range, focus_range) = orig_range_with_focus(db, file_id, node, name);
462
460
463
461
let name = local.name(db).to_smol_str();
464
462
let kind = if local.is_self(db) {
@@ -493,9 +491,8 @@ impl ToNav for hir::Label {
493
491
let InFile { file_id, value } = self.source(db);
494
492
let name = self.name(db).to_smol_str();
495
493
496
- let range = |syntax: &_| InFile::new(file_id, syntax).original_file_range(db);
497
- let FileRange { file_id, range: full_range } = range(value.syntax());
498
- let focus_range = value.lifetime().map(|lt| range(lt.syntax()).range);
494
+ let (file_id, full_range, focus_range) =
495
+ orig_range_with_focus(db, file_id, value.syntax(), value.lifetime());
499
496
500
497
NavigationTarget {
501
498
file_id,
@@ -525,19 +522,14 @@ impl TryToNav for hir::TypeParam {
525
522
Either::Right(x) => Either::Right(x),
526
523
};
527
524
528
- let range = |syntax: &_| InFile::new(file_id, syntax).original_file_range(db);
529
- let focus_range = |syntax: &_| InFile::new(file_id, syntax).original_file_range_opt(db);
530
- let FileRange { file_id, range: full_range } = match &value {
531
- Either::Left(type_param) => range(type_param.syntax()),
532
- Either::Right(trait_) => trait_
533
- .name()
534
- .and_then(|name| focus_range(name.syntax()))
535
- .unwrap_or_else(|| range(trait_.syntax())),
525
+ let syntax = match &value {
526
+ Either::Left(type_param) => type_param.syntax(),
527
+ Either::Right(trait_) => trait_.syntax(),
536
528
};
537
- let focus_range = value
538
- .either(|it| it.name(), |it| it.name())
539
- .and_then(|it| focus_range(it. syntax()))
540
- .map(|it| it.range);
529
+ let focus = value.as_ref().either(|it| it.name(), |it| it.name());
530
+
531
+ let (file_id, full_range, focus_range) = orig_range_with_focus(db, file_id, syntax, focus);
532
+
541
533
Some(NavigationTarget {
542
534
file_id,
543
535
name,
@@ -563,15 +555,15 @@ impl TryToNav for hir::LifetimeParam {
563
555
let InFile { file_id, value } = self.source(db)?;
564
556
let name = self.name(db).to_smol_str();
565
557
566
- let FileRange { file_id, range: full_range } =
558
+ let FileRange { file_id, range } =
567
559
InFile::new(file_id, value.syntax()).original_file_range(db);
568
560
Some(NavigationTarget {
569
561
file_id,
570
562
name,
571
563
alias: None,
572
564
kind: Some(SymbolKind::LifetimeParam),
573
- full_range,
574
- focus_range: Some(full_range ),
565
+ full_range: range ,
566
+ focus_range: Some(range ),
575
567
container_name: None,
576
568
description: None,
577
569
docs: None,
@@ -592,9 +584,8 @@ impl TryToNav for hir::ConstParam {
592
584
}
593
585
};
594
586
595
- let focus_range = value.name().and_then(|it| orig_focus_range(db, file_id, it.syntax()));
596
- let FileRange { file_id, range: full_range } =
597
- InFile::new(file_id, value.syntax()).original_file_range(db);
587
+ let (file_id, full_range, focus_range) =
588
+ orig_range_with_focus(db, file_id, value.syntax(), value.name());
598
589
Some(NavigationTarget {
599
590
file_id,
600
591
name,
@@ -609,12 +600,19 @@ impl TryToNav for hir::ConstParam {
609
600
}
610
601
}
611
602
612
- fn orig_focus_range (
603
+ fn orig_range_with_focus (
613
604
db: &RootDatabase,
614
- file_id: hir::HirFileId,
615
- syntax: &SyntaxNode,
616
- ) -> Option<TextRange> {
617
- InFile::new(file_id, syntax).original_file_range_opt(db).map(|it| it.range)
605
+ hir_file: HirFileId,
606
+ value: &SyntaxNode,
607
+ name: Option<impl AstNode>,
608
+ ) -> (FileId, TextRange, Option<TextRange>) {
609
+ let FileRange { file_id, range: full_range } =
610
+ InFile::new(hir_file, value).original_file_range(db);
611
+ let focus_range = name
612
+ .and_then(|it| InFile::new(hir_file, it.syntax()).original_file_range_opt(db))
613
+ .and_then(|range| if range.file_id == file_id { Some(range.range) } else { None });
614
+
615
+ (file_id, full_range, focus_range)
618
616
}
619
617
620
618
#[cfg(test)]
0 commit comments