Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/utils.rs')
-rw-r--r--crates/ide-assists/src/utils.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/crates/ide-assists/src/utils.rs b/crates/ide-assists/src/utils.rs
index 20e0302b57..5a3c5a39da 100644
--- a/crates/ide-assists/src/utils.rs
+++ b/crates/ide-assists/src/utils.rs
@@ -1057,6 +1057,21 @@ fn test_string_suffix() {
assert_eq!(Some("i32"), string_suffix(r##"r#""#i32"##));
}
+/// Calculate the string literal prefix length
+pub(crate) fn string_prefix(s: &str) -> Option<&str> {
+ s.split_once(['"', '\'', '#']).map(|(prefix, _)| prefix)
+}
+#[test]
+fn test_string_prefix() {
+ assert_eq!(Some(""), string_prefix(r#""abc""#));
+ assert_eq!(Some(""), string_prefix(r#""""#));
+ assert_eq!(Some(""), string_prefix(r#"""suffix"#));
+ assert_eq!(Some("c"), string_prefix(r#"c"""#));
+ assert_eq!(Some("r"), string_prefix(r#"r"""#));
+ assert_eq!(Some("cr"), string_prefix(r#"cr"""#));
+ assert_eq!(Some("r"), string_prefix(r##"r#""#"##));
+}
+
/// Replaces the record expression, handling field shorthands including inside macros.
pub(crate) fn replace_record_field_expr(
ctx: &AssistContext<'_>,
@@ -1150,3 +1165,19 @@ pub fn is_body_const(sema: &Semantics<'_, RootDatabase>, expr: &ast::Expr) -> bo
});
is_const
}
+
+// FIXME: #20460 When hir-ty can analyze the `never` statement at the end of block, remove it
+pub(crate) fn is_never_block(
+ sema: &Semantics<'_, RootDatabase>,
+ block_expr: &ast::BlockExpr,
+) -> bool {
+ if let Some(tail_expr) = block_expr.tail_expr() {
+ sema.type_of_expr(&tail_expr).is_some_and(|ty| ty.original.is_never())
+ } else if let Some(ast::Stmt::ExprStmt(expr_stmt)) = block_expr.statements().last()
+ && let Some(expr) = expr_stmt.expr()
+ {
+ sema.type_of_expr(&expr).is_some_and(|ty| ty.original.is_never())
+ } else {
+ false
+ }
+}