Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/context/analysis.rs')
-rw-r--r--crates/ide-completion/src/context/analysis.rs22
1 files changed, 14 insertions, 8 deletions
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index 65bae5b66e..1c8bc656ca 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -1250,6 +1250,11 @@ fn classify_name_ref<'db>(
let original = ast::Const::cast(name.syntax().parent()?)?;
TypeLocation::TypeAscription(TypeAscriptionTarget::Const(original.body()))
},
+ ast::Static(it) => {
+ let name = find_opt_node_in_file(original_file, it.name())?;
+ let original = ast::Static::cast(name.syntax().parent()?)?;
+ TypeLocation::TypeAscription(TypeAscriptionTarget::Const(original.body()))
+ },
ast::RetType(it) => {
it.thin_arrow_token()?;
let parent = match ast::Fn::cast(parent.parent()?) {
@@ -1305,14 +1310,14 @@ fn classify_name_ref<'db>(
let make_path_kind_expr = |expr: ast::Expr| {
let it = expr.syntax();
+ let prev_token = iter::successors(it.first_token(), |it| it.prev_token())
+ .skip(1)
+ .find(|it| !it.kind().is_trivia());
let in_block_expr = is_in_block(it);
let (in_loop_body, innermost_breakable) = is_in_breakable(it).unzip();
let after_if_expr = is_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 after_amp = prev_token.as_ref().is_some_and(|it| it.kind() == SyntaxKind::AMP);
+ let ref_expr_parent = prev_token.and_then(|it| it.parent()).and_then(ast::RefExpr::cast);
let (innermost_ret_ty, self_param) = {
let find_ret_ty = |it: SyntaxNode| {
if let Some(item) = ast::Item::cast(it.clone()) {
@@ -2030,9 +2035,10 @@ fn is_after_if_expr(node: SyntaxNode) -> bool {
Some(stmt) => stmt.syntax().clone(),
None => node,
};
- let prev_sibling =
- non_trivia_sibling(node.into(), Direction::Prev).and_then(NodeOrToken::into_node);
- iter::successors(prev_sibling, |it| it.last_child_or_token()?.into_node())
+ let Some(prev_token) = previous_non_trivia_token(node) else { return false };
+ prev_token
+ .parent_ancestors()
+ .take_while(|it| it.text_range().end() == prev_token.text_range().end())
.find_map(ast::IfExpr::cast)
.is_some()
}