Skip to content

Commit f1d22da

Browse files
committed
filter signature help suggestions based on parent ink! scope
1 parent a252feb commit f1d22da

File tree

1 file changed

+50
-39
lines changed

1 file changed

+50
-39
lines changed

crates/analyzer/src/analysis/signature_help.rs

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
33
use ink_analyzer_ir::syntax::{AstNode, TextRange, TextSize};
44
use ink_analyzer_ir::{
5-
FromAST, InkArg, InkArgKind, InkArgValueKind, InkAttributeKind, InkFile, IsInkEntity,
5+
FromAST, FromSyntax, InkArg, InkArgKind, InkArgValueKind, InkAttributeKind, InkFile,
6+
IsInkEntity,
67
};
78
use itertools::Itertools;
89

@@ -110,54 +111,64 @@ pub fn signature_help(file: &InkFile, offset: TextSize) -> Vec<SignatureHelp> {
110111
} else if let Some(parent_item_kind) =
111112
item_at_offset.normalized_parent_item_syntax_kind()
112113
{
113-
// Determines possible args by prefix or parent item kind.
114-
for possible_arg_kind in
115-
utils::valid_ink_args_by_syntax_kind(parent_item_kind)
116-
.iter()
117-
.filter(|arg_kind| {
118-
focused_arg.map_or(true, |arg| {
119-
arg.name().map_or(true, |arg_name| {
120-
let name = arg_name.to_string();
121-
name.is_empty()
122-
|| arg_kind.to_string().starts_with(&name)
123-
})
114+
// Determines possible args by prefix or parent item kind
115+
// (also accounts for parent scope).
116+
let mut possible_args =
117+
utils::valid_ink_args_by_syntax_kind(parent_item_kind);
118+
if let Some(attr_parent) = ink_attr
119+
.syntax()
120+
.parent()
121+
.filter(|it| it.kind() == parent_item_kind)
122+
{
123+
utils::remove_invalid_ink_arg_suggestions_for_parent_ink_scope(
124+
&mut possible_args,
125+
&attr_parent,
126+
);
127+
}
128+
for possible_arg_kind in possible_args
129+
.iter()
130+
.filter(|arg_kind| {
131+
focused_arg.map_or(true, |arg| {
132+
arg.name().map_or(true, |arg_name| {
133+
let name = arg_name.to_string();
134+
name.is_empty()
135+
|| arg_kind.to_string().starts_with(&name)
124136
})
125137
})
126-
// Replaces complementary arguments with primary arguments (if possible).
127-
// Useful for easier deduplication.
128-
.flat_map(|arg_kind| {
129-
if arg_kind.is_entity_type()
130-
|| *arg_kind == InkArgKind::Namespace
131-
{
132-
// Namespace is special (see `complementary_signature` inline docs).
138+
})
139+
// Replaces complementary arguments with primary arguments (if possible).
140+
// Useful for easier deduplication.
141+
.flat_map(|arg_kind| {
142+
if arg_kind.is_entity_type()
143+
|| *arg_kind == InkArgKind::Namespace
144+
{
145+
// Namespace is special (see `complementary_signature` inline docs).
146+
vec![*arg_kind]
147+
} else {
148+
let primary_args: Vec<InkArgKind> = [*arg_kind]
149+
.into_iter()
150+
.chain(utils::valid_sibling_ink_args(
151+
InkAttributeKind::Arg(*arg_kind),
152+
))
153+
.filter(|arg_kind| arg_kind.is_entity_type())
154+
.collect();
155+
if primary_args.is_empty() {
133156
vec![*arg_kind]
134157
} else {
135-
let primary_args: Vec<InkArgKind> = [*arg_kind]
136-
.into_iter()
137-
.chain(utils::valid_sibling_ink_args(
138-
InkAttributeKind::Arg(*arg_kind),
139-
))
140-
.filter(|arg_kind| arg_kind.is_entity_type())
141-
.collect();
142-
if primary_args.is_empty() {
143-
vec![*arg_kind]
144-
} else {
145-
primary_args
146-
}
158+
primary_args
147159
}
148-
})
149-
.sorted()
150-
// Deduplicates arguments by lite signature equivalence.
151-
.unique_by(|arg_kind| {
152-
utils::valid_sibling_ink_args(InkAttributeKind::Arg(
153-
*arg_kind,
154-
))
160+
}
161+
})
162+
.sorted()
163+
// Deduplicates arguments by lite signature equivalence.
164+
.unique_by(|arg_kind| {
165+
utils::valid_sibling_ink_args(InkAttributeKind::Arg(*arg_kind))
155166
.iter()
156167
.chain([arg_kind])
157168
.map(ToString::to_string)
158169
.sorted()
159170
.join(",")
160-
})
171+
})
161172
{
162173
if possible_arg_kind.is_entity_type() {
163174
// Computes signature based on possible primary argument.

0 commit comments

Comments
 (0)