Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/inlay_hints/range_exclusive.rs')
-rw-r--r--crates/ide/src/inlay_hints/range_exclusive.rs121
1 files changed, 121 insertions, 0 deletions
diff --git a/crates/ide/src/inlay_hints/range_exclusive.rs b/crates/ide/src/inlay_hints/range_exclusive.rs
new file mode 100644
index 0000000000..50ab15c504
--- /dev/null
+++ b/crates/ide/src/inlay_hints/range_exclusive.rs
@@ -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 {}
+}"#,
+ );
+ }
+}