don't complete raw in &mut $0

This commit is contained in:
lh123 2025-01-16 19:40:42 +08:00
parent 9809143562
commit a282733b49
4 changed files with 31 additions and 7 deletions

View file

@ -62,6 +62,7 @@ pub(crate) fn complete_expr_path(
in_condition,
incomplete_let,
ref ref_expr_parent,
after_amp,
ref is_func_update,
ref innermost_ret_ty,
ref impl_,
@ -69,14 +70,12 @@ pub(crate) fn complete_expr_path(
..
} = expr_ctx;
let has_raw_token =
ref_expr_parent.as_ref().map(|it| it.raw_token().is_some()).unwrap_or(false);
let has_const_token =
ref_expr_parent.as_ref().map(|it| it.const_token().is_some()).unwrap_or(false);
let has_mut_token =
ref_expr_parent.as_ref().map(|it| it.mut_token().is_some()).unwrap_or(false);
let (has_raw_token, has_const_token, has_mut_token) = ref_expr_parent
.as_ref()
.map(|it| (it.raw_token().is_some(), it.const_token().is_some(), it.mut_token().is_some()))
.unwrap_or((false, false, false));
let wants_raw_token = ref_expr_parent.is_some() && !has_raw_token;
let wants_raw_token = ref_expr_parent.is_some() && !has_raw_token && after_amp;
let wants_const_token =
ref_expr_parent.is_some() && has_raw_token && !has_const_token && !has_mut_token;
let wants_mut_token = if ref_expr_parent.is_some() {

View file

@ -146,6 +146,7 @@ pub(crate) struct PathExprCtx {
pub(crate) in_condition: bool,
pub(crate) incomplete_let: bool,
pub(crate) ref_expr_parent: Option<ast::RefExpr>,
pub(crate) after_amp: bool,
/// The surrounding RecordExpression we are completing a functional update
pub(crate) is_func_update: Option<ast::RecordExpr>,
pub(crate) self_param: Option<hir::SelfParam>,

View file

@ -1151,6 +1151,9 @@ fn classify_name_ref(
let after_if_expr = after_if_expr(it.clone());
let ref_expr_parent =
path.as_single_name_ref().and_then(|_| it.parent()).and_then(ast::RefExpr::cast);
let after_amp = non_trivia_sibling(it.clone().into(), Direction::Prev)
.map(|it| it.kind() == SyntaxKind::AMP)
.unwrap_or(false);
let (innermost_ret_ty, self_param) = {
let find_ret_ty = |it: SyntaxNode| {
if let Some(item) = ast::Item::cast(it.clone()) {
@ -1220,6 +1223,7 @@ fn classify_name_ref(
after_if_expr,
in_condition,
ref_expr_parent,
after_amp,
is_func_update,
innermost_ret_ty,
self_param,

View file

@ -522,6 +522,26 @@ fn completes_after_ref_expr() {
kw while
kw while let
"#]],
);
check(
r#"fn main() { let _ = &mut $0 }"#,
expect![[r#"
fn main() fn()
bt u32 u32
kw crate::
kw false
kw for
kw if
kw if let
kw loop
kw match
kw return
kw self::
kw true
kw unsafe
kw while
kw while let
"#]],
)
}