mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 13:51:31 +00:00
Add inlay hint for exclusive ranges
Adds an inlay hint containing a '<' character to exclusive range expressions and patterns that specify an upper bound.
This commit is contained in:
parent
f595e60b6d
commit
3c378b9c70
14 changed files with 209 additions and 17 deletions
121
crates/ide/src/inlay_hints/range_exclusive.rs
Normal file
121
crates/ide/src/inlay_hints/range_exclusive.rs
Normal file
|
@ -0,0 +1,121 @@
|
|||
//! Implementation of "range exclusive" inlay hints:
|
||||
//! ```no_run
|
||||
//! for i in 0../* < */10 {}
|
||||
//! if let ../* < */100 = 50 {}
|
||||
//! ```
|
||||
use syntax::{ast, SyntaxToken, T};
|
||||
|
||||
use crate::{InlayHint, InlayHintsConfig};
|
||||
|
||||
pub(super) fn hints(
|
||||
acc: &mut Vec<InlayHint>,
|
||||
config: &InlayHintsConfig,
|
||||
range: impl ast::RangeItem,
|
||||
) -> Option<()> {
|
||||
(config.range_exclusive_hints && range.end().is_some())
|
||||
.then(|| {
|
||||
range.op_token().filter(|token| token.kind() == T![..]).map(|token| {
|
||||
acc.push(inlay_hint(token));
|
||||
})
|
||||
})
|
||||
.flatten()
|
||||
}
|
||||
|
||||
fn inlay_hint(token: SyntaxToken) -> InlayHint {
|
||||
InlayHint {
|
||||
range: token.text_range(),
|
||||
position: crate::InlayHintPosition::After,
|
||||
pad_left: false,
|
||||
pad_right: false,
|
||||
kind: crate::InlayKind::RangeExclusive,
|
||||
label: crate::InlayHintLabel::from("<"),
|
||||
text_edit: None,
|
||||
needs_resolve: false,
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::{
|
||||
inlay_hints::tests::{check_with_config, DISABLED_CONFIG},
|
||||
InlayHintsConfig,
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn range_exclusive_expression_bounded_above_hints() {
|
||||
check_with_config(
|
||||
InlayHintsConfig { range_exclusive_hints: true, ..DISABLED_CONFIG },
|
||||
r#"
|
||||
fn main() {
|
||||
let a = 0..10;
|
||||
//^^<
|
||||
let b = ..100;
|
||||
//^^<
|
||||
let c = (2 - 1)..(7 * 8)
|
||||
//^^<
|
||||
}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn range_exclusive_expression_unbounded_above_no_hints() {
|
||||
check_with_config(
|
||||
InlayHintsConfig { range_exclusive_hints: true, ..DISABLED_CONFIG },
|
||||
r#"
|
||||
fn main() {
|
||||
let a = 0..;
|
||||
let b = ..;
|
||||
}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn range_inclusive_expression_no_hints() {
|
||||
check_with_config(
|
||||
InlayHintsConfig { range_exclusive_hints: true, ..DISABLED_CONFIG },
|
||||
r#"
|
||||
fn main() {
|
||||
let a = 0..=10;
|
||||
let b = ..=100;
|
||||
}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn range_exclusive_pattern_bounded_above_hints() {
|
||||
check_with_config(
|
||||
InlayHintsConfig { range_exclusive_hints: true, ..DISABLED_CONFIG },
|
||||
r#"
|
||||
fn main() {
|
||||
if let 0..10 = 0 {}
|
||||
//^^<
|
||||
if let ..100 = 0 {}
|
||||
//^^<
|
||||
}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn range_exclusive_pattern_unbounded_above_no_hints() {
|
||||
check_with_config(
|
||||
InlayHintsConfig { range_exclusive_hints: true, ..DISABLED_CONFIG },
|
||||
r#"
|
||||
fn main() {
|
||||
if let 0.. = 0 {}
|
||||
if let .. = 0 {}
|
||||
}"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn range_inclusive_pattern_no_hints() {
|
||||
check_with_config(
|
||||
InlayHintsConfig { range_exclusive_hints: true, ..DISABLED_CONFIG },
|
||||
r#"
|
||||
fn main() {
|
||||
if let 0..=10 = 0 {}
|
||||
if let ..=100 = 0 {}
|
||||
}"#,
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue