mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-01 07:48:45 +00:00
fix: keyword highlighting in macro expansion
This commit is contained in:
parent
1bca00d1bc
commit
3650b40714
1 changed files with 133 additions and 0 deletions
|
@ -306,6 +306,9 @@ pub(crate) fn highlight_exit_points(
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Some(range) = original_range(sema.db, file_id, text_range) {
|
||||||
|
highlights.push(HighlightedRange { category: ReferenceCategory::empty(), range })
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// We should handle `return` separately because when it is used in `try` block
|
// We should handle `return` separately because when it is used in `try` block
|
||||||
|
@ -322,6 +325,10 @@ pub(crate) fn highlight_exit_points(
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Some(range) = original_range(sema.db, file_id, text_range) {
|
||||||
|
highlights
|
||||||
|
.push(HighlightedRange { category: ReferenceCategory::empty(), range })
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let tail = match body {
|
let tail = match body {
|
||||||
|
@ -411,6 +418,10 @@ pub(crate) fn highlight_break_points(
|
||||||
token_lt.map(|it| it.syntax().text_range()),
|
token_lt.map(|it| it.syntax().text_range()),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if let Some(range) = original_range(sema.db, file_id, text_range) {
|
||||||
|
highlights
|
||||||
|
.push(HighlightedRange { category: ReferenceCategory::empty(), range })
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Some(highlights)
|
Some(highlights)
|
||||||
|
@ -483,6 +494,9 @@ pub(crate) fn highlight_yield_points(
|
||||||
}
|
}
|
||||||
.map(|it| it.text_range());
|
.map(|it| it.text_range());
|
||||||
|
|
||||||
|
if let Some(range) = original_range(sema.db, file_id, token_range) {
|
||||||
|
highlights.push(HighlightedRange { category: ReferenceCategory::empty(), range });
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Some(highlights)
|
Some(highlights)
|
||||||
|
@ -522,6 +536,20 @@ fn find_defs(sema: &Semantics<'_, RootDatabase>, token: SyntaxToken) -> FxHashSe
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn original_range(
|
||||||
|
db: &dyn db::ExpandDatabase,
|
||||||
|
file_id: HirFileId,
|
||||||
|
text_range: Option<TextRange>,
|
||||||
|
) -> Option<TextRange> {
|
||||||
|
if text_range.is_none() || !file_id.is_macro() {
|
||||||
|
return text_range;
|
||||||
|
}
|
||||||
|
|
||||||
|
InFile::new(file_id, text_range.unwrap())
|
||||||
|
.original_node_file_range_opt(db)
|
||||||
|
.map(|(frange, _)| frange.range)
|
||||||
|
}
|
||||||
|
|
||||||
/// Preorder walk all the expression's child expressions.
|
/// Preorder walk all the expression's child expressions.
|
||||||
/// For macro calls, the callback will be called on the expanded expressions after
|
/// For macro calls, the callback will be called on the expanded expressions after
|
||||||
/// visiting the macro call itself.
|
/// visiting the macro call itself.
|
||||||
|
@ -989,6 +1017,7 @@ impl Never {
|
||||||
}
|
}
|
||||||
macro_rules! never {
|
macro_rules! never {
|
||||||
() => { never() }
|
() => { never() }
|
||||||
|
// ^^^^^^^
|
||||||
}
|
}
|
||||||
fn never() -> ! { loop {} }
|
fn never() -> ! { loop {} }
|
||||||
fn foo() ->$0 u32 {
|
fn foo() ->$0 u32 {
|
||||||
|
@ -1815,4 +1844,108 @@ fn test() {
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_in_macros() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
macro_rules! N {
|
||||||
|
($i:ident, $x:expr, $blk:expr) => {
|
||||||
|
for $i in 0..$x {
|
||||||
|
$blk
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
fn f() {
|
||||||
|
// ^^
|
||||||
|
N!(i, 5, {
|
||||||
|
println!("{}", i);
|
||||||
|
return$0;
|
||||||
|
// ^^^^^^
|
||||||
|
});
|
||||||
|
|
||||||
|
for i in 1..5 {
|
||||||
|
return;
|
||||||
|
// ^^^^^^
|
||||||
|
}
|
||||||
|
(|| {
|
||||||
|
return;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_in_closure() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
macro_rules! N {
|
||||||
|
($i:ident, $x:expr, $blk:expr) => {
|
||||||
|
for $i in 0..$x {
|
||||||
|
$blk
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
fn f() {
|
||||||
|
N!(i, 5, {
|
||||||
|
println!("{}", i);
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
|
||||||
|
for i in 1..5 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(|| {
|
||||||
|
// ^
|
||||||
|
return$0;
|
||||||
|
// ^^^^^^
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_in_try() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
fn main() {
|
||||||
|
fn f() {
|
||||||
|
// ^^
|
||||||
|
try {
|
||||||
|
return$0;
|
||||||
|
// ^^^^^^
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
// ^^^^^^
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn break_in_try() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
fn main() {
|
||||||
|
for i in 1..100 {
|
||||||
|
// ^^^
|
||||||
|
let x: Result<(), ()> = try {
|
||||||
|
break$0;
|
||||||
|
// ^^^^^
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue