|
2 | 2 |
|
3 | 3 | use ink_analyzer_ir::syntax::{AstNode, TextRange, TextSize};
|
4 | 4 | use ink_analyzer_ir::{
|
5 |
| - FromAST, InkArg, InkArgKind, InkArgValueKind, InkAttributeKind, InkFile, IsInkEntity, |
| 5 | + FromAST, FromSyntax, InkArg, InkArgKind, InkArgValueKind, InkAttributeKind, InkFile, |
| 6 | + IsInkEntity, |
6 | 7 | };
|
7 | 8 | use itertools::Itertools;
|
8 | 9 |
|
@@ -110,54 +111,64 @@ pub fn signature_help(file: &InkFile, offset: TextSize) -> Vec<SignatureHelp> {
|
110 | 111 | } else if let Some(parent_item_kind) =
|
111 | 112 | item_at_offset.normalized_parent_item_syntax_kind()
|
112 | 113 | {
|
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) |
124 | 136 | })
|
125 | 137 | })
|
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() { |
133 | 156 | vec![*arg_kind]
|
134 | 157 | } 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 |
147 | 159 | }
|
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)) |
155 | 166 | .iter()
|
156 | 167 | .chain([arg_kind])
|
157 | 168 | .map(ToString::to_string)
|
158 | 169 | .sorted()
|
159 | 170 | .join(",")
|
160 |
| - }) |
| 171 | + }) |
161 | 172 | {
|
162 | 173 | if possible_arg_kind.is_entity_type() {
|
163 | 174 | // Computes signature based on possible primary argument.
|
|
0 commit comments