|
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