Skip to content

Commit 45ae0ab

Browse files
authored
Merge pull request #21126 from A4-Tacks/arglist-nr-error-comma
fix: fix parameter info with missing arguments
2 parents b5b4aba + 1d40867 commit 45ae0ab

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

crates/ide-completion/src/context/analysis.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ fn expected_type_and_name<'db>(
657657
cov_mark::hit!(expected_type_fn_param);
658658
ActiveParameter::at_token(
659659
sema,
660-
token.clone(),
660+
token.clone(),
661661
).map(|ap| {
662662
let name = ap.ident().map(NameOrNameRef::Name);
663663
(Some(ap.ty), name)

crates/ide-completion/src/context/tests.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,20 @@ fn bar(x: u32) {}
9090
"#,
9191
expect![[r#"ty: u32, name: x"#]],
9292
);
93+
check_expected_type_and_name(
94+
r#"
95+
fn foo() { bar(, $0); }
96+
fn bar(x: u32, y: i32) {}
97+
"#,
98+
expect![[r#"ty: i32, name: y"#]],
99+
);
100+
check_expected_type_and_name(
101+
r#"
102+
fn foo() { bar(, c$0); }
103+
fn bar(x: u32, y: i32) {}
104+
"#,
105+
expect![[r#"ty: i32, name: y"#]],
106+
);
93107
}
94108

95109
#[test]

crates/ide-db/src/active_parameter.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use hir::{InFile, Semantics, Type};
55
use parser::T;
66
use span::TextSize;
77
use syntax::{
8-
AstNode, NodeOrToken, SyntaxToken,
8+
AstNode, NodeOrToken, SyntaxKind, SyntaxNode, SyntaxToken,
99
ast::{self, AstChildren, HasArgList, HasAttrs, HasName},
1010
match_ast,
1111
};
@@ -102,8 +102,7 @@ pub fn callable_for_node<'db>(
102102
arg_list
103103
.syntax()
104104
.children_with_tokens()
105-
.filter_map(NodeOrToken::into_token)
106-
.filter(|t| t.kind() == T![,])
105+
.filter_map(into_comma)
107106
.take_while(|t| t.text_range().start() <= offset)
108107
.count()
109108
});
@@ -162,8 +161,7 @@ pub fn generic_def_for_node(
162161
let active_param = generic_arg_list
163162
.syntax()
164163
.children_with_tokens()
165-
.filter_map(NodeOrToken::into_token)
166-
.filter(|t| t.kind() == T![,])
164+
.filter_map(into_comma)
167165
.take_while(|t| t.text_range().start() <= token.text_range().start())
168166
.count();
169167

@@ -174,3 +172,12 @@ pub fn generic_def_for_node(
174172

175173
Some((def, active_param, first_arg_is_non_lifetime, variant))
176174
}
175+
176+
fn into_comma(it: NodeOrToken<SyntaxNode, SyntaxToken>) -> Option<SyntaxToken> {
177+
let token = match it {
178+
NodeOrToken::Token(it) => it,
179+
NodeOrToken::Node(node) if node.kind() == SyntaxKind::ERROR => node.first_token()?,
180+
NodeOrToken::Node(_) => return None,
181+
};
182+
(token.kind() == T![,]).then_some(token)
183+
}

0 commit comments

Comments
 (0)