Skip to content

Commit 74864d5

Browse files
bors[bot]matklad
andauthored
Merge #5582
5582: Finish Module grammar r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 72ffd85 + 7d09e5e commit 74864d5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+172
-129
lines changed

crates/ra_assists/src/handlers/add_missing_impl_members.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ fn add_missing_impl_members_inner(
112112
) -> Option<()> {
113113
let _p = ra_prof::profile("add_missing_impl_members_inner");
114114
let impl_def = ctx.find_node_at_offset::<ast::ImplDef>()?;
115-
let impl_item_list = impl_def.item_list()?;
115+
let impl_item_list = impl_def.assoc_item_list()?;
116116

117117
let trait_ = resolve_target_trait(&ctx.sema, &impl_def)?;
118118

@@ -121,6 +121,7 @@ fn add_missing_impl_members_inner(
121121
ast::AssocItem::FnDef(def) => def.name(),
122122
ast::AssocItem::TypeAliasDef(def) => def.name(),
123123
ast::AssocItem::ConstDef(def) => def.name(),
124+
ast::AssocItem::MacroCall(_) => None,
124125
}
125126
.map(|it| it.text().clone())
126127
};

crates/ra_assists/src/handlers/generate_new.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ fn find_struct_impl(ctx: &AssistContext, strukt: &ast::StructDef) -> Option<Opti
158158
}
159159

160160
fn has_new_fn(imp: &ast::ImplDef) -> bool {
161-
if let Some(il) = imp.item_list() {
161+
if let Some(il) = imp.assoc_item_list() {
162162
for item in il.assoc_items() {
163163
if let ast::AssocItem::FnDef(f) = item {
164164
if let Some(name) = f.name() {

crates/ra_assists/src/handlers/move_bounds.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ pub(crate) fn move_bounds_to_where_clause(acc: &mut Assists, ctx: &AssistContext
3838
let anchor = match_ast! {
3939
match parent {
4040
ast::FnDef(it) => it.body()?.syntax().clone().into(),
41-
ast::TraitDef(it) => it.item_list()?.syntax().clone().into(),
42-
ast::ImplDef(it) => it.item_list()?.syntax().clone().into(),
41+
ast::TraitDef(it) => it.assoc_item_list()?.syntax().clone().into(),
42+
ast::ImplDef(it) => it.assoc_item_list()?.syntax().clone().into(),
4343
ast::EnumDef(it) => it.variant_list()?.syntax().clone().into(),
4444
ast::StructDef(it) => {
4545
it.syntax().children_with_tokens()

crates/ra_assists/src/utils.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub fn get_missing_assoc_items(
6363
let mut impl_fns_consts = FxHashSet::default();
6464
let mut impl_type = FxHashSet::default();
6565

66-
if let Some(item_list) = impl_def.item_list() {
66+
if let Some(item_list) = impl_def.assoc_item_list() {
6767
for item in item_list.assoc_items() {
6868
match item {
6969
ast::AssocItem::FnDef(f) => {
@@ -83,6 +83,7 @@ pub fn get_missing_assoc_items(
8383
impl_fns_consts.insert(n.syntax().to_string());
8484
}
8585
}
86+
ast::AssocItem::MacroCall(_) => (),
8687
}
8788
}
8889
}

crates/ra_hir_def/src/item_tree/lower.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,12 @@ impl Ctx {
153153
self.forced_visibility = forced_vis;
154154
}
155155

156-
fn lower_assoc_item(&mut self, item: &ast::Item) -> Option<AssocItem> {
156+
fn lower_assoc_item(&mut self, item: &ast::AssocItem) -> Option<AssocItem> {
157157
match item {
158-
ast::Item::FnDef(ast) => self.lower_function(ast).map(Into::into),
159-
ast::Item::TypeAliasDef(ast) => self.lower_type_alias(ast).map(Into::into),
160-
ast::Item::ConstDef(ast) => Some(self.lower_const(ast).into()),
161-
ast::Item::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into),
162-
_ => None,
158+
ast::AssocItem::FnDef(ast) => self.lower_function(ast).map(Into::into),
159+
ast::AssocItem::TypeAliasDef(ast) => self.lower_type_alias(ast).map(Into::into),
160+
ast::AssocItem::ConstDef(ast) => Some(self.lower_const(ast).into()),
161+
ast::AssocItem::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into),
163162
}
164163
}
165164

@@ -419,9 +418,9 @@ impl Ctx {
419418
let generic_params =
420419
self.lower_generic_params_and_inner_items(GenericsOwner::Trait(trait_def), trait_def);
421420
let auto = trait_def.auto_token().is_some();
422-
let items = trait_def.item_list().map(|list| {
421+
let items = trait_def.assoc_item_list().map(|list| {
423422
self.with_inherited_visibility(visibility, |this| {
424-
list.items()
423+
list.assoc_items()
425424
.filter_map(|item| {
426425
let attrs = Attrs::new(&item, &this.hygiene);
427426
this.collect_inner_items(item.syntax());
@@ -454,9 +453,9 @@ impl Ctx {
454453

455454
// We cannot use `assoc_items()` here as that does not include macro calls.
456455
let items = impl_def
457-
.item_list()
456+
.assoc_item_list()
458457
.into_iter()
459-
.flat_map(|it| it.items())
458+
.flat_map(|it| it.assoc_items())
460459
.filter_map(|item| {
461460
self.collect_inner_items(item.syntax());
462461
let assoc = self.lower_assoc_item(&item)?;

crates/ra_ide/src/completion/complete_fn_param.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,36 @@ pub(super) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
1818
}
1919

2020
let mut params = FxHashMap::default();
21+
2122
let me = ctx.token.ancestors().find_map(ast::FnDef::cast);
23+
let mut process_fn = |func: ast::FnDef| {
24+
if Some(&func) == me.as_ref() {
25+
return;
26+
}
27+
func.param_list().into_iter().flat_map(|it| it.params()).for_each(|param| {
28+
let text = param.syntax().text().to_string();
29+
params.entry(text).or_insert(param);
30+
})
31+
};
32+
2233
for node in ctx.token.parent().ancestors() {
23-
let items = match_ast! {
34+
match_ast! {
2435
match node {
25-
ast::SourceFile(it) => it.items(),
26-
ast::ItemList(it) => it.items(),
36+
ast::SourceFile(it) => it.items().filter_map(|item| match item {
37+
ast::Item::FnDef(it) => Some(it),
38+
_ => None,
39+
}).for_each(&mut process_fn),
40+
ast::ItemList(it) => it.items().filter_map(|item| match item {
41+
ast::Item::FnDef(it) => Some(it),
42+
_ => None,
43+
}).for_each(&mut process_fn),
44+
ast::AssocItemList(it) => it.assoc_items().filter_map(|item| match item {
45+
ast::AssocItem::FnDef(it) => Some(it),
46+
_ => None,
47+
}).for_each(&mut process_fn),
2748
_ => continue,
2849
}
2950
};
30-
for item in items {
31-
if let ast::Item::FnDef(func) = item {
32-
if Some(&func) == me.as_ref() {
33-
continue;
34-
}
35-
func.param_list().into_iter().flat_map(|it| it.params()).for_each(|param| {
36-
let text = param.syntax().text().to_string();
37-
params.entry(text).or_insert(param);
38-
})
39-
}
40-
}
4151
}
4252

4353
params

crates/ra_ide/src/completion/complete_keyword.rs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -66,27 +66,24 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
6666
add_keyword(ctx, acc, "fn", "fn $0() {}")
6767
}
6868

69-
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
70-
|| ctx.block_expr_parent
71-
{
69+
if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
7270
add_keyword(ctx, acc, "trait", "trait $0 {}");
7371
add_keyword(ctx, acc, "impl", "impl $0 {}");
7472
}
7573

7674
return;
7775
}
78-
if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent {
76+
if ctx.has_item_list_or_source_file_parent || has_trait_or_impl_parent || ctx.block_expr_parent
77+
{
7978
add_keyword(ctx, acc, "fn", "fn $0() {}");
8079
}
81-
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
82-
|| ctx.block_expr_parent
83-
{
80+
if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
8481
add_keyword(ctx, acc, "use", "use ");
8582
add_keyword(ctx, acc, "impl", "impl $0 {}");
8683
add_keyword(ctx, acc, "trait", "trait $0 {}");
8784
}
8885

89-
if ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent {
86+
if ctx.has_item_list_or_source_file_parent {
9087
add_keyword(ctx, acc, "enum", "enum $0 {}");
9188
add_keyword(ctx, acc, "struct", "struct $0");
9289
add_keyword(ctx, acc, "union", "union $0 {}");
@@ -108,29 +105,28 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
108105
add_keyword(ctx, acc, "else", "else {$0}");
109106
add_keyword(ctx, acc, "else if", "else if $0 {}");
110107
}
111-
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
112-
|| ctx.block_expr_parent
113-
{
108+
if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
114109
add_keyword(ctx, acc, "mod", "mod $0 {}");
115110
}
116111
if ctx.bind_pat_parent || ctx.ref_pat_parent {
117112
add_keyword(ctx, acc, "mut", "mut ");
118113
}
119-
if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent {
114+
if ctx.has_item_list_or_source_file_parent || has_trait_or_impl_parent || ctx.block_expr_parent
115+
{
120116
add_keyword(ctx, acc, "const", "const ");
121117
add_keyword(ctx, acc, "type", "type ");
122118
}
123-
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
124-
|| ctx.block_expr_parent
125-
{
119+
if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
126120
add_keyword(ctx, acc, "static", "static ");
127121
};
128-
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
129-
|| ctx.block_expr_parent
130-
{
122+
if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
131123
add_keyword(ctx, acc, "extern", "extern ");
132124
}
133-
if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent || ctx.is_match_arm {
125+
if ctx.has_item_list_or_source_file_parent
126+
|| has_trait_or_impl_parent
127+
|| ctx.block_expr_parent
128+
|| ctx.is_match_arm
129+
{
134130
add_keyword(ctx, acc, "unsafe", "unsafe ");
135131
}
136132
if ctx.in_loop_body {
@@ -142,7 +138,7 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
142138
add_keyword(ctx, acc, "break", "break");
143139
}
144140
}
145-
if ctx.has_item_list_or_source_file_parent && !ctx.has_trait_parent {
141+
if ctx.has_item_list_or_source_file_parent || ctx.has_impl_parent {
146142
add_keyword(ctx, acc, "pub", "pub ")
147143
}
148144

crates/ra_ide/src/completion/patterns.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::completion::test_utils::check_pattern_is_applicable;
1313

1414
pub(crate) fn has_trait_parent(element: SyntaxElement) -> bool {
1515
not_same_range_ancestor(element)
16-
.filter(|it| it.kind() == ITEM_LIST)
16+
.filter(|it| it.kind() == ASSOC_ITEM_LIST)
1717
.and_then(|it| it.parent())
1818
.filter(|it| it.kind() == TRAIT_DEF)
1919
.is_some()
@@ -25,7 +25,7 @@ fn test_has_trait_parent() {
2525

2626
pub(crate) fn has_impl_parent(element: SyntaxElement) -> bool {
2727
not_same_range_ancestor(element)
28-
.filter(|it| it.kind() == ITEM_LIST)
28+
.filter(|it| it.kind() == ASSOC_ITEM_LIST)
2929
.and_then(|it| it.parent())
3030
.filter(|it| it.kind() == IMPL_DEF)
3131
.is_some()
@@ -73,7 +73,7 @@ pub(crate) fn has_item_list_or_source_file_parent(element: SyntaxElement) -> boo
7373
#[test]
7474
fn test_has_item_list_or_source_file_parent() {
7575
check_pattern_is_applicable(r"i<|>", has_item_list_or_source_file_parent);
76-
check_pattern_is_applicable(r"impl { f<|> }", has_item_list_or_source_file_parent);
76+
check_pattern_is_applicable(r"mod foo { f<|> }", has_item_list_or_source_file_parent);
7777
}
7878

7979
pub(crate) fn is_match_arm(element: SyntaxElement) -> bool {

crates/ra_parser/src/grammar.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,12 @@ pub(crate) fn reparser(
149149
USE_TREE_LIST => items::use_tree_list,
150150
EXTERN_ITEM_LIST => items::extern_item_list,
151151
TOKEN_TREE if first_child? == T!['{'] => items::token_tree,
152-
ITEM_LIST => match parent? {
152+
ASSOC_ITEM_LIST => match parent? {
153153
IMPL_DEF => items::impl_item_list,
154154
TRAIT_DEF => items::trait_item_list,
155-
MODULE => items::mod_item_list,
156155
_ => return None,
157156
},
157+
ITEM_LIST => items::mod_item_list,
158158
_ => return None,
159159
};
160160
Some(res)

crates/ra_parser/src/grammar/items/traits.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub(crate) fn trait_item_list(p: &mut Parser) {
5050
item_or_macro(p, true, ItemFlavor::Trait);
5151
}
5252
p.expect(T!['}']);
53-
m.complete(p, ITEM_LIST);
53+
m.complete(p, ASSOC_ITEM_LIST);
5454
}
5555

5656
// test impl_def
@@ -107,7 +107,7 @@ pub(crate) fn impl_item_list(p: &mut Parser) {
107107
item_or_macro(p, true, ItemFlavor::Mod);
108108
}
109109
p.expect(T!['}']);
110-
m.complete(p, ITEM_LIST);
110+
m.complete(p, ASSOC_ITEM_LIST);
111111
}
112112

113113
// test impl_type_params

crates/ra_parser/src/syntax_kind/generated.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ pub enum SyntaxKind {
213213
TUPLE_FIELD_DEF,
214214
ENUM_VARIANT_LIST,
215215
ITEM_LIST,
216+
ASSOC_ITEM_LIST,
216217
ATTR,
217218
META_ITEM,
218219
USE_TREE,

crates/ra_syntax/src/ast/edit.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,12 @@ where
8080
}
8181
}
8282

83-
impl ast::ItemList {
83+
impl ast::AssocItemList {
8484
#[must_use]
85-
pub fn append_items(&self, items: impl IntoIterator<Item = ast::AssocItem>) -> ast::ItemList {
85+
pub fn append_items(
86+
&self,
87+
items: impl IntoIterator<Item = ast::AssocItem>,
88+
) -> ast::AssocItemList {
8689
let mut res = self.clone();
8790
if !self.syntax().text().contains_char('\n') {
8891
res = make_multiline(res);
@@ -92,7 +95,7 @@ impl ast::ItemList {
9295
}
9396

9497
#[must_use]
95-
pub fn append_item(&self, item: ast::AssocItem) -> ast::ItemList {
98+
pub fn append_item(&self, item: ast::AssocItem) -> ast::AssocItemList {
9699
let (indent, position) = match self.assoc_items().last() {
97100
Some(it) => (
98101
leading_indent(it.syntax()).unwrap_or_default().to_string(),

0 commit comments

Comments
 (0)