mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 13:25:09 +00:00

Adds an inlay hint containing a '<' character to exclusive range expressions and patterns that specify an upper bound.
121 lines
2.8 KiB
Rust
121 lines
2.8 KiB
Rust
//! 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 {}
|
|
}"#,
|
|
);
|
|
}
|
|
}
|