impl ToNav for hir::Local {
fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
let src = self.source(db);
- let (full_range, focus_range) = match src.value {
- Either::Left(it) => {
- (it.syntax().text_range(), it.name().map(|it| it.syntax().text_range()))
+ let node = match &src.value {
+ Either::Left(bind_pat) => {
+ bind_pat.name().map_or_else(|| bind_pat.syntax().clone(), |it| it.syntax().clone())
}
- Either::Right(it) => (it.syntax().text_range(), Some(it.self_kw_token().text_range())),
+ Either::Right(it) => it.syntax().clone(),
};
+ let full_range = original_range(db, src.with_value(&node));
let name = match self.name(db) {
Some(it) => it.to_string().into(),
None => "".into(),
};
NavigationTarget {
- file_id: src.file_id.original_file(db),
+ file_id: full_range.file_id,
name,
kind: BIND_PAT,
- full_range,
- focus_range,
+ full_range: full_range.range,
+ focus_range: None,
container_name: None,
description: None,
docs: None,
"T",
);
}
+
+ #[test]
+ fn goto_within_macro() {
+ check_goto(
+ "
+ //- /lib.rs
+ macro_rules! id {
+ ($($tt:tt)*) => ($($tt)*)
+ }
+
+ fn foo() {
+ let x = 1;
+ id!({
+ let y = <|>x;
+ let z = y;
+ });
+ }
+ ",
+ "x BIND_PAT FileId(1) [69; 70)",
+ "x",
+ );
+
+ check_goto(
+ "
+ //- /lib.rs
+ macro_rules! id {
+ ($($tt:tt)*) => ($($tt)*)
+ }
+
+ fn foo() {
+ let x = 1;
+ id!({
+ let y = x;
+ let z = <|>y;
+ });
+ }
+ ",
+ "y BIND_PAT FileId(1) [98; 99)",
+ "y",
+ );
+ }
}