Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/active_parameter.rs')
-rw-r--r--crates/ide-db/src/active_parameter.rs17
1 files changed, 12 insertions, 5 deletions
diff --git a/crates/ide-db/src/active_parameter.rs b/crates/ide-db/src/active_parameter.rs
index 4fb7d142ed..f5a5b76c33 100644
--- a/crates/ide-db/src/active_parameter.rs
+++ b/crates/ide-db/src/active_parameter.rs
@@ -5,7 +5,7 @@ use hir::{InFile, Semantics, Type};
use parser::T;
use span::TextSize;
use syntax::{
- AstNode, NodeOrToken, SyntaxToken,
+ AstNode, NodeOrToken, SyntaxKind, SyntaxNode, SyntaxToken,
ast::{self, AstChildren, HasArgList, HasAttrs, HasName},
match_ast,
};
@@ -102,8 +102,7 @@ pub fn callable_for_node<'db>(
arg_list
.syntax()
.children_with_tokens()
- .filter_map(NodeOrToken::into_token)
- .filter(|t| t.kind() == T![,])
+ .filter_map(into_comma)
.take_while(|t| t.text_range().start() <= offset)
.count()
});
@@ -162,8 +161,7 @@ pub fn generic_def_for_node(
let active_param = generic_arg_list
.syntax()
.children_with_tokens()
- .filter_map(NodeOrToken::into_token)
- .filter(|t| t.kind() == T![,])
+ .filter_map(into_comma)
.take_while(|t| t.text_range().start() <= token.text_range().start())
.count();
@@ -174,3 +172,12 @@ pub fn generic_def_for_node(
Some((def, active_param, first_arg_is_non_lifetime, variant))
}
+
+fn into_comma(it: NodeOrToken<SyntaxNode, SyntaxToken>) -> Option<SyntaxToken> {
+ let token = match it {
+ NodeOrToken::Token(it) => it,
+ NodeOrToken::Node(node) if node.kind() == SyntaxKind::ERROR => node.first_token()?,
+ NodeOrToken::Node(_) => return None,
+ };
+ (token.kind() == T![,]).then_some(token)
+}