about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-07-30 09:51:20 +0000
committerGitHub <noreply@github.com>2020-07-30 09:51:20 +0000
commit74864d560b9293174c82fdee2b9d15991ebf075f (patch)
treef76a250431629a36d225d456ed41f393aaa9a579
parent72ffd851dd5b0fcdf3aa072131ba11009878b4ae (diff)
parent7d09e5ed618b9b9d6e00b57b24db0b9c8a8c12d7 (diff)
downloadrust-74864d560b9293174c82fdee2b9d15991ebf075f.tar.gz
rust-74864d560b9293174c82fdee2b9d15991ebf075f.zip
Merge #5582
5582: Finish Module grammar r=matklad a=matklad



bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
-rw-r--r--crates/ra_assists/src/handlers/add_missing_impl_members.rs3
-rw-r--r--crates/ra_assists/src/handlers/generate_new.rs2
-rw-r--r--crates/ra_assists/src/handlers/move_bounds.rs4
-rw-r--r--crates/ra_assists/src/utils.rs3
-rw-r--r--crates/ra_hir_def/src/item_tree/lower.rs19
-rw-r--r--crates/ra_ide/src/completion/complete_fn_param.rs38
-rw-r--r--crates/ra_ide/src/completion/complete_keyword.rs36
-rw-r--r--crates/ra_ide/src/completion/patterns.rs6
-rw-r--r--crates/ra_parser/src/grammar.rs4
-rw-r--r--crates/ra_parser/src/grammar/items/traits.rs4
-rw-r--r--crates/ra_parser/src/syntax_kind/generated.rs1
-rw-r--r--crates/ra_syntax/src/ast/edit.rs9
-rw-r--r--crates/ra_syntax/src/ast/generated/nodes.rs72
-rw-r--r--crates/ra_syntax/test_data/parser/err/0018_incomplete_fn.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/err/0026_imp_recovery.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/err/0043_default_const.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/err/0004_impl_type.rast8
-rw-r--r--crates/ra_syntax/test_data/parser/inline/err/0014_default_fn_type.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0001_trait_item_list.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0016_unsafe_trait.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0021_impl_item_list.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0041_trait_item.rast4
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0047_unsafe_default_impl.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0050_fn_decl.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0079_impl_def.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0087_unsafe_impl.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0091_auto_trait.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0094_unsafe_auto_trait.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0097_default_impl.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0132_default_fn_type.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0150_impl_type_params.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_fn.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0030_traits.rast4
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0042_ufcs_call_list.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0045_block_inner_attrs.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rast4
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0066_default_const.rast2
-rw-r--r--xtask/src/ast_src.rs1
-rw-r--r--xtask/src/codegen/rust.ungram23
47 files changed, 172 insertions, 129 deletions
diff --git a/crates/ra_assists/src/handlers/add_missing_impl_members.rs b/crates/ra_assists/src/handlers/add_missing_impl_members.rs
index f185e61e595..a2d9006e488 100644
--- a/crates/ra_assists/src/handlers/add_missing_impl_members.rs
+++ b/crates/ra_assists/src/handlers/add_missing_impl_members.rs
@@ -112,7 +112,7 @@ fn add_missing_impl_members_inner(
 ) -> Option<()> {
     let _p = ra_prof::profile("add_missing_impl_members_inner");
     let impl_def = ctx.find_node_at_offset::<ast::ImplDef>()?;
-    let impl_item_list = impl_def.item_list()?;
+    let impl_item_list = impl_def.assoc_item_list()?;
 
     let trait_ = resolve_target_trait(&ctx.sema, &impl_def)?;
 
@@ -121,6 +121,7 @@ fn add_missing_impl_members_inner(
             ast::AssocItem::FnDef(def) => def.name(),
             ast::AssocItem::TypeAliasDef(def) => def.name(),
             ast::AssocItem::ConstDef(def) => def.name(),
+            ast::AssocItem::MacroCall(_) => None,
         }
         .map(|it| it.text().clone())
     };
diff --git a/crates/ra_assists/src/handlers/generate_new.rs b/crates/ra_assists/src/handlers/generate_new.rs
index e27def1d8ab..25bc171bfb1 100644
--- a/crates/ra_assists/src/handlers/generate_new.rs
+++ b/crates/ra_assists/src/handlers/generate_new.rs
@@ -158,7 +158,7 @@ fn find_struct_impl(ctx: &AssistContext, strukt: &ast::StructDef) -> Option<Opti
 }
 
 fn has_new_fn(imp: &ast::ImplDef) -> bool {
-    if let Some(il) = imp.item_list() {
+    if let Some(il) = imp.assoc_item_list() {
         for item in il.assoc_items() {
             if let ast::AssocItem::FnDef(f) = item {
                 if let Some(name) = f.name() {
diff --git a/crates/ra_assists/src/handlers/move_bounds.rs b/crates/ra_assists/src/handlers/move_bounds.rs
index ba3dafb9955..6b73fff44cd 100644
--- a/crates/ra_assists/src/handlers/move_bounds.rs
+++ b/crates/ra_assists/src/handlers/move_bounds.rs
@@ -38,8 +38,8 @@ pub(crate) fn move_bounds_to_where_clause(acc: &mut Assists, ctx: &AssistContext
     let anchor = match_ast! {
         match parent {
             ast::FnDef(it) => it.body()?.syntax().clone().into(),
-            ast::TraitDef(it) => it.item_list()?.syntax().clone().into(),
-            ast::ImplDef(it) => it.item_list()?.syntax().clone().into(),
+            ast::TraitDef(it) => it.assoc_item_list()?.syntax().clone().into(),
+            ast::ImplDef(it) => it.assoc_item_list()?.syntax().clone().into(),
             ast::EnumDef(it) => it.variant_list()?.syntax().clone().into(),
             ast::StructDef(it) => {
                 it.syntax().children_with_tokens()
diff --git a/crates/ra_assists/src/utils.rs b/crates/ra_assists/src/utils.rs
index 02de902d6ed..27c33df2320 100644
--- a/crates/ra_assists/src/utils.rs
+++ b/crates/ra_assists/src/utils.rs
@@ -63,7 +63,7 @@ pub fn get_missing_assoc_items(
     let mut impl_fns_consts = FxHashSet::default();
     let mut impl_type = FxHashSet::default();
 
-    if let Some(item_list) = impl_def.item_list() {
+    if let Some(item_list) = impl_def.assoc_item_list() {
         for item in item_list.assoc_items() {
             match item {
                 ast::AssocItem::FnDef(f) => {
@@ -83,6 +83,7 @@ pub fn get_missing_assoc_items(
                         impl_fns_consts.insert(n.syntax().to_string());
                     }
                 }
+                ast::AssocItem::MacroCall(_) => (),
             }
         }
     }
diff --git a/crates/ra_hir_def/src/item_tree/lower.rs b/crates/ra_hir_def/src/item_tree/lower.rs
index eb1da463207..4fc21a642ce 100644
--- a/crates/ra_hir_def/src/item_tree/lower.rs
+++ b/crates/ra_hir_def/src/item_tree/lower.rs
@@ -153,13 +153,12 @@ impl Ctx {
         self.forced_visibility = forced_vis;
     }
 
-    fn lower_assoc_item(&mut self, item: &ast::Item) -> Option<AssocItem> {
+    fn lower_assoc_item(&mut self, item: &ast::AssocItem) -> Option<AssocItem> {
         match item {
-            ast::Item::FnDef(ast) => self.lower_function(ast).map(Into::into),
-            ast::Item::TypeAliasDef(ast) => self.lower_type_alias(ast).map(Into::into),
-            ast::Item::ConstDef(ast) => Some(self.lower_const(ast).into()),
-            ast::Item::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into),
-            _ => None,
+            ast::AssocItem::FnDef(ast) => self.lower_function(ast).map(Into::into),
+            ast::AssocItem::TypeAliasDef(ast) => self.lower_type_alias(ast).map(Into::into),
+            ast::AssocItem::ConstDef(ast) => Some(self.lower_const(ast).into()),
+            ast::AssocItem::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into),
         }
     }
 
@@ -419,9 +418,9 @@ impl Ctx {
         let generic_params =
             self.lower_generic_params_and_inner_items(GenericsOwner::Trait(trait_def), trait_def);
         let auto = trait_def.auto_token().is_some();
-        let items = trait_def.item_list().map(|list| {
+        let items = trait_def.assoc_item_list().map(|list| {
             self.with_inherited_visibility(visibility, |this| {
-                list.items()
+                list.assoc_items()
                     .filter_map(|item| {
                         let attrs = Attrs::new(&item, &this.hygiene);
                         this.collect_inner_items(item.syntax());
@@ -454,9 +453,9 @@ impl Ctx {
 
         // We cannot use `assoc_items()` here as that does not include macro calls.
         let items = impl_def
-            .item_list()
+            .assoc_item_list()
             .into_iter()
-            .flat_map(|it| it.items())
+            .flat_map(|it| it.assoc_items())
             .filter_map(|item| {
                 self.collect_inner_items(item.syntax());
                 let assoc = self.lower_assoc_item(&item)?;
diff --git a/crates/ra_ide/src/completion/complete_fn_param.rs b/crates/ra_ide/src/completion/complete_fn_param.rs
index 7a53083f540..d4b6112a5a6 100644
--- a/crates/ra_ide/src/completion/complete_fn_param.rs
+++ b/crates/ra_ide/src/completion/complete_fn_param.rs
@@ -18,26 +18,36 @@ pub(super) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
     }
 
     let mut params = FxHashMap::default();
+
     let me = ctx.token.ancestors().find_map(ast::FnDef::cast);
+    let mut process_fn = |func: ast::FnDef| {
+        if Some(&func) == me.as_ref() {
+            return;
+        }
+        func.param_list().into_iter().flat_map(|it| it.params()).for_each(|param| {
+            let text = param.syntax().text().to_string();
+            params.entry(text).or_insert(param);
+        })
+    };
+
     for node in ctx.token.parent().ancestors() {
-        let items = match_ast! {
+        match_ast! {
             match node {
-                ast::SourceFile(it) => it.items(),
-                ast::ItemList(it) => it.items(),
+                ast::SourceFile(it) => it.items().filter_map(|item| match item {
+                    ast::Item::FnDef(it) => Some(it),
+                    _ => None,
+                }).for_each(&mut process_fn),
+                ast::ItemList(it) => it.items().filter_map(|item| match item {
+                    ast::Item::FnDef(it) => Some(it),
+                    _ => None,
+                }).for_each(&mut process_fn),
+                ast::AssocItemList(it) => it.assoc_items().filter_map(|item| match item {
+                    ast::AssocItem::FnDef(it) => Some(it),
+                    _ => None,
+                }).for_each(&mut process_fn),
                 _ => continue,
             }
         };
-        for item in items {
-            if let ast::Item::FnDef(func) = item {
-                if Some(&func) == me.as_ref() {
-                    continue;
-                }
-                func.param_list().into_iter().flat_map(|it| it.params()).for_each(|param| {
-                    let text = param.syntax().text().to_string();
-                    params.entry(text).or_insert(param);
-                })
-            }
-        }
     }
 
     params
diff --git a/crates/ra_ide/src/completion/complete_keyword.rs b/crates/ra_ide/src/completion/complete_keyword.rs
index fcdaeef49b0..1581b2d5d8e 100644
--- a/crates/ra_ide/src/completion/complete_keyword.rs
+++ b/crates/ra_ide/src/completion/complete_keyword.rs
@@ -66,27 +66,24 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
             add_keyword(ctx, acc, "fn", "fn $0() {}")
         }
 
-        if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
-            || ctx.block_expr_parent
-        {
+        if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
             add_keyword(ctx, acc, "trait", "trait $0 {}");
             add_keyword(ctx, acc, "impl", "impl $0 {}");
         }
 
         return;
     }
-    if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent {
+    if ctx.has_item_list_or_source_file_parent || has_trait_or_impl_parent || ctx.block_expr_parent
+    {
         add_keyword(ctx, acc, "fn", "fn $0() {}");
     }
-    if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
-        || ctx.block_expr_parent
-    {
+    if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
         add_keyword(ctx, acc, "use", "use ");
         add_keyword(ctx, acc, "impl", "impl $0 {}");
         add_keyword(ctx, acc, "trait", "trait $0 {}");
     }
 
-    if ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent {
+    if ctx.has_item_list_or_source_file_parent {
         add_keyword(ctx, acc, "enum", "enum $0 {}");
         add_keyword(ctx, acc, "struct", "struct $0");
         add_keyword(ctx, acc, "union", "union $0 {}");
@@ -108,29 +105,28 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
         add_keyword(ctx, acc, "else", "else {$0}");
         add_keyword(ctx, acc, "else if", "else if $0 {}");
     }
-    if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
-        || ctx.block_expr_parent
-    {
+    if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
         add_keyword(ctx, acc, "mod", "mod $0 {}");
     }
     if ctx.bind_pat_parent || ctx.ref_pat_parent {
         add_keyword(ctx, acc, "mut", "mut ");
     }
-    if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent {
+    if ctx.has_item_list_or_source_file_parent || has_trait_or_impl_parent || ctx.block_expr_parent
+    {
         add_keyword(ctx, acc, "const", "const ");
         add_keyword(ctx, acc, "type", "type ");
     }
-    if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
-        || ctx.block_expr_parent
-    {
+    if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
         add_keyword(ctx, acc, "static", "static ");
     };
-    if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent)
-        || ctx.block_expr_parent
-    {
+    if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
         add_keyword(ctx, acc, "extern", "extern ");
     }
-    if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent || ctx.is_match_arm {
+    if ctx.has_item_list_or_source_file_parent
+        || has_trait_or_impl_parent
+        || ctx.block_expr_parent
+        || ctx.is_match_arm
+    {
         add_keyword(ctx, acc, "unsafe", "unsafe ");
     }
     if ctx.in_loop_body {
@@ -142,7 +138,7 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
             add_keyword(ctx, acc, "break", "break");
         }
     }
-    if ctx.has_item_list_or_source_file_parent && !ctx.has_trait_parent {
+    if ctx.has_item_list_or_source_file_parent || ctx.has_impl_parent {
         add_keyword(ctx, acc, "pub", "pub ")
     }
 
diff --git a/crates/ra_ide/src/completion/patterns.rs b/crates/ra_ide/src/completion/patterns.rs
index b2fe13280a8..175209d8ac7 100644
--- a/crates/ra_ide/src/completion/patterns.rs
+++ b/crates/ra_ide/src/completion/patterns.rs
@@ -13,7 +13,7 @@ use crate::completion::test_utils::check_pattern_is_applicable;
 
 pub(crate) fn has_trait_parent(element: SyntaxElement) -> bool {
     not_same_range_ancestor(element)
-        .filter(|it| it.kind() == ITEM_LIST)
+        .filter(|it| it.kind() == ASSOC_ITEM_LIST)
         .and_then(|it| it.parent())
         .filter(|it| it.kind() == TRAIT_DEF)
         .is_some()
@@ -25,7 +25,7 @@ fn test_has_trait_parent() {
 
 pub(crate) fn has_impl_parent(element: SyntaxElement) -> bool {
     not_same_range_ancestor(element)
-        .filter(|it| it.kind() == ITEM_LIST)
+        .filter(|it| it.kind() == ASSOC_ITEM_LIST)
         .and_then(|it| it.parent())
         .filter(|it| it.kind() == IMPL_DEF)
         .is_some()
@@ -73,7 +73,7 @@ pub(crate) fn has_item_list_or_source_file_parent(element: SyntaxElement) -> boo
 #[test]
 fn test_has_item_list_or_source_file_parent() {
     check_pattern_is_applicable(r"i<|>", has_item_list_or_source_file_parent);
-    check_pattern_is_applicable(r"impl { f<|> }", has_item_list_or_source_file_parent);
+    check_pattern_is_applicable(r"mod foo { f<|> }", has_item_list_or_source_file_parent);
 }
 
 pub(crate) fn is_match_arm(element: SyntaxElement) -> bool {
diff --git a/crates/ra_parser/src/grammar.rs b/crates/ra_parser/src/grammar.rs
index de2c98afd9d..3350e23b9f8 100644
--- a/crates/ra_parser/src/grammar.rs
+++ b/crates/ra_parser/src/grammar.rs
@@ -149,12 +149,12 @@ pub(crate) fn reparser(
         USE_TREE_LIST => items::use_tree_list,
         EXTERN_ITEM_LIST => items::extern_item_list,
         TOKEN_TREE if first_child? == T!['{'] => items::token_tree,
-        ITEM_LIST => match parent? {
+        ASSOC_ITEM_LIST => match parent? {
             IMPL_DEF => items::impl_item_list,
             TRAIT_DEF => items::trait_item_list,
-            MODULE => items::mod_item_list,
             _ => return None,
         },
+        ITEM_LIST => items::mod_item_list,
         _ => return None,
     };
     Some(res)
diff --git a/crates/ra_parser/src/grammar/items/traits.rs b/crates/ra_parser/src/grammar/items/traits.rs
index c819e33be97..ef9c8ff5b03 100644
--- a/crates/ra_parser/src/grammar/items/traits.rs
+++ b/crates/ra_parser/src/grammar/items/traits.rs
@@ -50,7 +50,7 @@ pub(crate) fn trait_item_list(p: &mut Parser) {
         item_or_macro(p, true, ItemFlavor::Trait);
     }
     p.expect(T!['}']);
-    m.complete(p, ITEM_LIST);
+    m.complete(p, ASSOC_ITEM_LIST);
 }
 
 // test impl_def
@@ -107,7 +107,7 @@ pub(crate) fn impl_item_list(p: &mut Parser) {
         item_or_macro(p, true, ItemFlavor::Mod);
     }
     p.expect(T!['}']);
-    m.complete(p, ITEM_LIST);
+    m.complete(p, ASSOC_ITEM_LIST);
 }
 
 // test impl_type_params
diff --git a/crates/ra_parser/src/syntax_kind/generated.rs b/crates/ra_parser/src/syntax_kind/generated.rs
index 625f0c82296..56dadc6af0e 100644
--- a/crates/ra_parser/src/syntax_kind/generated.rs
+++ b/crates/ra_parser/src/syntax_kind/generated.rs
@@ -213,6 +213,7 @@ pub enum SyntaxKind {
     TUPLE_FIELD_DEF,
     ENUM_VARIANT_LIST,
     ITEM_LIST,
+    ASSOC_ITEM_LIST,
     ATTR,
     META_ITEM,
     USE_TREE,
diff --git a/crates/ra_syntax/src/ast/edit.rs b/crates/ra_syntax/src/ast/edit.rs
index abc7a646c2c..01a310f66de 100644
--- a/crates/ra_syntax/src/ast/edit.rs
+++ b/crates/ra_syntax/src/ast/edit.rs
@@ -80,9 +80,12 @@ where
     }
 }
 
-impl ast::ItemList {
+impl ast::AssocItemList {
     #[must_use]
-    pub fn append_items(&self, items: impl IntoIterator<Item = ast::AssocItem>) -> ast::ItemList {
+    pub fn append_items(
+        &self,
+        items: impl IntoIterator<Item = ast::AssocItem>,
+    ) -> ast::AssocItemList {
         let mut res = self.clone();
         if !self.syntax().text().contains_char('\n') {
             res = make_multiline(res);
@@ -92,7 +95,7 @@ impl ast::ItemList {
     }
 
     #[must_use]
-    pub fn append_item(&self, item: ast::AssocItem) -> ast::ItemList {
+    pub fn append_item(&self, item: ast::AssocItem) -> ast::AssocItemList {
         let (indent, position) = match self.assoc_items().last() {
             Some(it) => (
                 leading_indent(it.syntax()).unwrap_or_default().to_string(),
diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs
index dfda7955028..fbf3b457a9e 100644
--- a/crates/ra_syntax/src/ast/generated/nodes.rs
+++ b/crates/ra_syntax/src/ast/generated/nodes.rs
@@ -112,7 +112,7 @@ impl ImplDef {
     pub fn impl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![impl]) }
     pub fn excl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![!]) }
     pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
-    pub fn item_list(&self) -> Option<ItemList> { support::child(&self.syntax) }
+    pub fn assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct MacroCall {
@@ -180,7 +180,7 @@ impl TraitDef {
     pub fn unsafe_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![unsafe]) }
     pub fn auto_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![auto]) }
     pub fn trait_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![trait]) }
-    pub fn item_list(&self) -> Option<ItemList> { support::child(&self.syntax) }
+    pub fn assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct TypeAliasDef {
@@ -238,11 +238,6 @@ impl Visibility {
     pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Abi {
-    pub(crate) syntax: SyntaxNode,
-}
-impl Abi {}
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct Name {
     pub(crate) syntax: SyntaxNode,
 }
@@ -250,6 +245,21 @@ impl Name {
     pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct ItemList {
+    pub(crate) syntax: SyntaxNode,
+}
+impl ast::AttrsOwner for ItemList {}
+impl ast::ModuleItemOwner for ItemList {}
+impl ItemList {
+    pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
+    pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
+}
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct Abi {
+    pub(crate) syntax: SyntaxNode,
+}
+impl Abi {}
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct TypeParamList {
     pub(crate) syntax: SyntaxNode,
 }
@@ -367,11 +377,10 @@ impl TypeBoundList {
     pub fn bounds(&self) -> AstChildren<TypeBound> { support::children(&self.syntax) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ItemList {
+pub struct AssocItemList {
     pub(crate) syntax: SyntaxNode,
 }
-impl ast::ModuleItemOwner for ItemList {}
-impl ItemList {
+impl AssocItemList {
     pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
     pub fn assoc_items(&self) -> AstChildren<AssocItem> { support::children(&self.syntax) }
     pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
@@ -1336,10 +1345,10 @@ pub enum AssocItem {
     FnDef(FnDef),
     TypeAliasDef(TypeAliasDef),
     ConstDef(ConstDef),
+    MacroCall(MacroCall),
 }
 impl ast::AttrsOwner for AssocItem {}
 impl ast::NameOwner for AssocItem {}
-impl ast::VisibilityOwner for AssocItem {}
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum Pat {
     OrPat(OrPat),
@@ -1574,8 +1583,8 @@ impl AstNode for Visibility {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
-impl AstNode for Abi {
-    fn can_cast(kind: SyntaxKind) -> bool { kind == ABI }
+impl AstNode for Name {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == NAME }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
         if Self::can_cast(syntax.kind()) {
             Some(Self { syntax })
@@ -1585,8 +1594,19 @@ impl AstNode for Abi {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
-impl AstNode for Name {
-    fn can_cast(kind: SyntaxKind) -> bool { kind == NAME }
+impl AstNode for ItemList {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == ITEM_LIST }
+    fn cast(syntax: SyntaxNode) -> Option<Self> {
+        if Self::can_cast(syntax.kind()) {
+            Some(Self { syntax })
+        } else {
+            None
+        }
+    }
+    fn syntax(&self) -> &SyntaxNode { &self.syntax }
+}
+impl AstNode for Abi {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == ABI }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
         if Self::can_cast(syntax.kind()) {
             Some(Self { syntax })
@@ -1728,8 +1748,8 @@ impl AstNode for TypeBoundList {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
-impl AstNode for ItemList {
-    fn can_cast(kind: SyntaxKind) -> bool { kind == ITEM_LIST }
+impl AstNode for AssocItemList {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == ASSOC_ITEM_LIST }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
         if Self::can_cast(syntax.kind()) {
             Some(Self { syntax })
@@ -3144,10 +3164,13 @@ impl From<TypeAliasDef> for AssocItem {
 impl From<ConstDef> for AssocItem {
     fn from(node: ConstDef) -> AssocItem { AssocItem::ConstDef(node) }
 }
+impl From<MacroCall> for AssocItem {
+    fn from(node: MacroCall) -> AssocItem { AssocItem::MacroCall(node) }
+}
 impl AstNode for AssocItem {
     fn can_cast(kind: SyntaxKind) -> bool {
         match kind {
-            FN_DEF | TYPE_ALIAS_DEF | CONST_DEF => true,
+            FN_DEF | TYPE_ALIAS_DEF | CONST_DEF | MACRO_CALL => true,
             _ => false,
         }
     }
@@ -3156,6 +3179,7 @@ impl AstNode for AssocItem {
             FN_DEF => AssocItem::FnDef(FnDef { syntax }),
             TYPE_ALIAS_DEF => AssocItem::TypeAliasDef(TypeAliasDef { syntax }),
             CONST_DEF => AssocItem::ConstDef(ConstDef { syntax }),
+            MACRO_CALL => AssocItem::MacroCall(MacroCall { syntax }),
             _ => return None,
         };
         Some(res)
@@ -3165,6 +3189,7 @@ impl AstNode for AssocItem {
             AssocItem::FnDef(it) => &it.syntax,
             AssocItem::TypeAliasDef(it) => &it.syntax,
             AssocItem::ConstDef(it) => &it.syntax,
+            AssocItem::MacroCall(it) => &it.syntax,
         }
     }
 }
@@ -3515,12 +3540,17 @@ impl std::fmt::Display for Visibility {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
-impl std::fmt::Display for Abi {
+impl std::fmt::Display for Name {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
-impl std::fmt::Display for Name {
+impl std::fmt::Display for ItemList {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        std::fmt::Display::fmt(self.syntax(), f)
+    }
+}
+impl std::fmt::Display for Abi {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
     }
@@ -3585,7 +3615,7 @@ impl std::fmt::Display for TypeBoundList {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
-impl std::fmt::Display for ItemList {
+impl std::fmt::Display for AssocItemList {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
     }
diff --git a/crates/ra_syntax/test_data/parser/err/0018_incomplete_fn.rast b/crates/ra_syntax/test_data/parser/err/0018_incomplete_fn.rast
index 31cc4e55142..a87e5061a7d 100644
--- a/crates/ra_syntax/test_data/parser/err/0018_incomplete_fn.rast
+++ b/crates/ra_syntax/test_data/parser/err/0018_incomplete_fn.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..183
           NAME_REF@5..13
             IDENT@5..13 "FnScopes"
     WHITESPACE@13..14 " "
-    ITEM_LIST@14..182
+    ASSOC_ITEM_LIST@14..182
       L_CURLY@14..15 "{"
       WHITESPACE@15..20 "\n    "
       FN_DEF@20..161
diff --git a/crates/ra_syntax/test_data/parser/err/0026_imp_recovery.rast b/crates/ra_syntax/test_data/parser/err/0026_imp_recovery.rast
index bf07409fb0d..254ff546a7d 100644
--- a/crates/ra_syntax/test_data/parser/err/0026_imp_recovery.rast
+++ b/crates/ra_syntax/test_data/parser/err/0026_imp_recovery.rast
@@ -41,7 +41,7 @@ SOURCE_FILE@0..38
                       IDENT@32..33 "T"
             R_ANGLE@33..34 ">"
     WHITESPACE@34..35 " "
-    ITEM_LIST@35..37
+    ASSOC_ITEM_LIST@35..37
       L_CURLY@35..36 "{"
       R_CURLY@36..37 "}"
   WHITESPACE@37..38 "\n"
diff --git a/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rast b/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rast
index e3cda7c432a..bc446e3dfcb 100644
--- a/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rast
+++ b/crates/ra_syntax/test_data/parser/err/0037_visibility_in_traits.rast
@@ -14,7 +14,7 @@ SOURCE_FILE@0..118
       L_PAREN@11..12 "("
       R_PAREN@12..13 ")"
     WHITESPACE@13..14 " "
-    ITEM_LIST@14..117
+    ASSOC_ITEM_LIST@14..117
       L_CURLY@14..15 "{"
       WHITESPACE@15..20 "\n    "
       FN_DEF@20..31
diff --git a/crates/ra_syntax/test_data/parser/err/0043_default_const.rast b/crates/ra_syntax/test_data/parser/err/0043_default_const.rast
index 8eb583ef85c..6ca1a487004 100644
--- a/crates/ra_syntax/test_data/parser/err/0043_default_const.rast
+++ b/crates/ra_syntax/test_data/parser/err/0043_default_const.rast
@@ -5,7 +5,7 @@ SOURCE_FILE@0..39
     NAME@6..7
       IDENT@6..7 "T"
     WHITESPACE@7..8 " "
-    ITEM_LIST@8..38
+    ASSOC_ITEM_LIST@8..38
       L_CURLY@8..9 "{"
       WHITESPACE@9..12 "\n  "
       MACRO_CALL@12..19
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0004_impl_type.rast b/crates/ra_syntax/test_data/parser/inline/err/0004_impl_type.rast
index fd939be8db5..2d0253aa07d 100644
--- a/crates/ra_syntax/test_data/parser/inline/err/0004_impl_type.rast
+++ b/crates/ra_syntax/test_data/parser/inline/err/0004_impl_type.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..87
           NAME_REF@5..9
             IDENT@5..9 "Type"
     WHITESPACE@9..10 " "
-    ITEM_LIST@10..12
+    ASSOC_ITEM_LIST@10..12
       L_CURLY@10..11 "{"
       R_CURLY@11..12 "}"
   WHITESPACE@12..13 "\n"
@@ -29,7 +29,7 @@ SOURCE_FILE@0..87
           NAME_REF@29..30
             IDENT@29..30 "T"
     WHITESPACE@30..31 " "
-    ITEM_LIST@31..33
+    ASSOC_ITEM_LIST@31..33
       L_CURLY@31..32 "{"
       R_CURLY@32..33 "}"
   WHITESPACE@33..34 "\n"
@@ -45,7 +45,7 @@ SOURCE_FILE@0..87
           NAME_REF@44..51
             IDENT@44..51 "NotType"
     WHITESPACE@51..52 " "
-    ITEM_LIST@52..54
+    ASSOC_ITEM_LIST@52..54
       L_CURLY@52..53 "{"
       R_CURLY@53..54 "}"
   WHITESPACE@54..55 "\n"
@@ -69,7 +69,7 @@ SOURCE_FILE@0..87
           NAME_REF@76..83
             IDENT@76..83 "NotType"
     WHITESPACE@83..84 " "
-    ITEM_LIST@84..86
+    ASSOC_ITEM_LIST@84..86
       L_CURLY@84..85 "{"
       R_CURLY@85..86 "}"
   WHITESPACE@86..87 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0014_default_fn_type.rast b/crates/ra_syntax/test_data/parser/inline/err/0014_default_fn_type.rast
index b8cd0587da7..5501dc5a687 100644
--- a/crates/ra_syntax/test_data/parser/inline/err/0014_default_fn_type.rast
+++ b/crates/ra_syntax/test_data/parser/inline/err/0014_default_fn_type.rast
@@ -5,7 +5,7 @@ SOURCE_FILE@0..62
     NAME@6..7
       IDENT@6..7 "T"
     WHITESPACE@7..8 " "
-    ITEM_LIST@8..61
+    ASSOC_ITEM_LIST@8..61
       L_CURLY@8..9 "{"
       WHITESPACE@9..14 "\n    "
       MACRO_CALL@14..21
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0001_trait_item_list.rast b/crates/ra_syntax/test_data/parser/inline/ok/0001_trait_item_list.rast
index a38b4f5736d..f422acddaa8 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0001_trait_item_list.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0001_trait_item_list.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..83
           NAME_REF@5..6
             IDENT@5..6 "F"
     WHITESPACE@6..7 " "
-    ITEM_LIST@7..82
+    ASSOC_ITEM_LIST@7..82
       L_CURLY@7..8 "{"
       WHITESPACE@8..13 "\n    "
       TYPE_ALIAS_DEF@13..27
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rast b/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rast
index 9f4a9e69bce..0cd1dffc9f8 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..128
           NAME_REF@5..6
             IDENT@5..6 "S"
     WHITESPACE@6..7 " "
-    ITEM_LIST@7..127
+    ASSOC_ITEM_LIST@7..127
       L_CURLY@7..8 "{"
       WHITESPACE@8..13 "\n    "
       FN_DEF@13..26
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0016_unsafe_trait.rast b/crates/ra_syntax/test_data/parser/inline/ok/0016_unsafe_trait.rast
index d59c6006d74..69b82e33c67 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0016_unsafe_trait.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0016_unsafe_trait.rast
@@ -7,7 +7,7 @@ SOURCE_FILE@0..18
     NAME@13..14
       IDENT@13..14 "T"
     WHITESPACE@14..15 " "
-    ITEM_LIST@15..17
+    ASSOC_ITEM_LIST@15..17
       L_CURLY@15..16 "{"
       R_CURLY@16..17 "}"
   WHITESPACE@17..18 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rast b/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rast
index 15da6fdd6e9..79148e953c1 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..69
           NAME_REF@5..6
             IDENT@5..6 "S"
     WHITESPACE@6..7 " "
-    ITEM_LIST@7..68
+    ASSOC_ITEM_LIST@7..68
       L_CURLY@7..8 "{"
       WHITESPACE@8..13 "\n    "
       FN_DEF@13..33
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0021_impl_item_list.rast b/crates/ra_syntax/test_data/parser/inline/ok/0021_impl_item_list.rast
index c204aeb63ee..31b5b6616b3 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0021_impl_item_list.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0021_impl_item_list.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..89
           NAME_REF@5..6
             IDENT@5..6 "F"
     WHITESPACE@6..7 " "
-    ITEM_LIST@7..88
+    ASSOC_ITEM_LIST@7..88
       L_CURLY@7..8 "{"
       WHITESPACE@8..13 "\n    "
       TYPE_ALIAS_DEF@13..26
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0041_trait_item.rast b/crates/ra_syntax/test_data/parser/inline/ok/0041_trait_item.rast
index 1ae79136169..884ab2dbf31 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0041_trait_item.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0041_trait_item.rast
@@ -48,7 +48,7 @@ SOURCE_FILE@0..101
                   NAME_REF@34..38
                     IDENT@34..38 "Copy"
     WHITESPACE@38..39 " "
-    ITEM_LIST@39..41
+    ASSOC_ITEM_LIST@39..41
       L_CURLY@39..40 "{"
       R_CURLY@40..41 "}"
   WHITESPACE@41..42 "\n"
@@ -119,7 +119,7 @@ SOURCE_FILE@0..101
                   NAME_REF@93..97
                     IDENT@93..97 "Copy"
     WHITESPACE@97..98 " "
-    ITEM_LIST@98..100
+    ASSOC_ITEM_LIST@98..100
       L_CURLY@98..99 "{"
       R_CURLY@99..100 "}"
   WHITESPACE@100..101 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0047_unsafe_default_impl.rast b/crates/ra_syntax/test_data/parser/inline/ok/0047_unsafe_default_impl.rast
index 52de6023b42..8a6b5a8fcf9 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0047_unsafe_default_impl.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0047_unsafe_default_impl.rast
@@ -12,7 +12,7 @@ SOURCE_FILE@0..27
           NAME_REF@20..23
             IDENT@20..23 "Foo"
     WHITESPACE@23..24 " "
-    ITEM_LIST@24..26
+    ASSOC_ITEM_LIST@24..26
       L_CURLY@24..25 "{"
       R_CURLY@25..26 "}"
   WHITESPACE@26..27 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0050_fn_decl.rast b/crates/ra_syntax/test_data/parser/inline/ok/0050_fn_decl.rast
index 8bf62cda900..5f1429102c9 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0050_fn_decl.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0050_fn_decl.rast
@@ -5,7 +5,7 @@ SOURCE_FILE@0..22
     NAME@6..7
       IDENT@6..7 "T"
     WHITESPACE@7..8 " "
-    ITEM_LIST@8..21
+    ASSOC_ITEM_LIST@8..21
       L_CURLY@8..9 "{"
       WHITESPACE@9..10 " "
       FN_DEF@10..19
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast b/crates/ra_syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast
index 24b9a1f461b..31178f86e02 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast
@@ -17,7 +17,7 @@ SOURCE_FILE@0..20
           NAME_REF@15..16
             IDENT@15..16 "X"
     WHITESPACE@16..17 " "
-    ITEM_LIST@17..19
+    ASSOC_ITEM_LIST@17..19
       L_CURLY@17..18 "{"
       R_CURLY@18..19 "}"
   WHITESPACE@19..20 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0079_impl_def.rast b/crates/ra_syntax/test_data/parser/inline/ok/0079_impl_def.rast
index a00ab40f93b..26825ef8605 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0079_impl_def.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0079_impl_def.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..12
           NAME_REF@5..8
             IDENT@5..8 "Foo"
     WHITESPACE@8..9 " "
-    ITEM_LIST@9..11
+    ASSOC_ITEM_LIST@9..11
       L_CURLY@9..10 "{"
       R_CURLY@10..11 "}"
   WHITESPACE@11..12 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0087_unsafe_impl.rast b/crates/ra_syntax/test_data/parser/inline/ok/0087_unsafe_impl.rast
index 01ed3afca48..e3223cee583 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0087_unsafe_impl.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0087_unsafe_impl.rast
@@ -10,7 +10,7 @@ SOURCE_FILE@0..19
           NAME_REF@12..15
             IDENT@12..15 "Foo"
     WHITESPACE@15..16 " "
-    ITEM_LIST@16..18
+    ASSOC_ITEM_LIST@16..18
       L_CURLY@16..17 "{"
       R_CURLY@17..18 "}"
   WHITESPACE@18..19 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0091_auto_trait.rast b/crates/ra_syntax/test_data/parser/inline/ok/0091_auto_trait.rast
index 800412cef78..7efa4c34ddc 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0091_auto_trait.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0091_auto_trait.rast
@@ -7,7 +7,7 @@ SOURCE_FILE@0..16
     NAME@11..12
       IDENT@11..12 "T"
     WHITESPACE@12..13 " "
-    ITEM_LIST@13..15
+    ASSOC_ITEM_LIST@13..15
       L_CURLY@13..14 "{"
       R_CURLY@14..15 "}"
   WHITESPACE@15..16 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0094_unsafe_auto_trait.rast b/crates/ra_syntax/test_data/parser/inline/ok/0094_unsafe_auto_trait.rast
index 9370f6ae777..fad27be66aa 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0094_unsafe_auto_trait.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0094_unsafe_auto_trait.rast
@@ -9,7 +9,7 @@ SOURCE_FILE@0..23
     NAME@18..19
       IDENT@18..19 "T"
     WHITESPACE@19..20 " "
-    ITEM_LIST@20..22
+    ASSOC_ITEM_LIST@20..22
       L_CURLY@20..21 "{"
       R_CURLY@21..22 "}"
   WHITESPACE@22..23 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0097_default_impl.rast b/crates/ra_syntax/test_data/parser/inline/ok/0097_default_impl.rast
index 80bda4ba7e9..8a839a4a6a5 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0097_default_impl.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0097_default_impl.rast
@@ -10,7 +10,7 @@ SOURCE_FILE@0..20
           NAME_REF@13..16
             IDENT@13..16 "Foo"
     WHITESPACE@16..17 " "
-    ITEM_LIST@17..19
+    ASSOC_ITEM_LIST@17..19
       L_CURLY@17..18 "{"
       R_CURLY@18..19 "}"
   WHITESPACE@19..20 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast b/crates/ra_syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast
index a65a5c85fc9..ea54347fc42 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast
@@ -17,7 +17,7 @@ SOURCE_FILE@0..94
           NAME_REF@14..15
             IDENT@14..15 "F"
     WHITESPACE@15..16 " "
-    ITEM_LIST@16..93
+    ASSOC_ITEM_LIST@16..93
       L_CURLY@16..17 "{"
       WHITESPACE@17..23 "\n     "
       COMMENT@23..48 "//! This is a doc com ..."
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0132_default_fn_type.rast b/crates/ra_syntax/test_data/parser/inline/ok/0132_default_fn_type.rast
index 00ce5ecf0df..3772cb64ba9 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0132_default_fn_type.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0132_default_fn_type.rast
@@ -16,7 +16,7 @@ SOURCE_FILE@0..69
           NAME_REF@11..14
             IDENT@11..14 "Foo"
     WHITESPACE@14..15 " "
-    ITEM_LIST@15..68
+    ASSOC_ITEM_LIST@15..68
       L_CURLY@15..16 "{"
       WHITESPACE@16..21 "\n    "
       TYPE_ALIAS_DEF@21..42
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0150_impl_type_params.rast b/crates/ra_syntax/test_data/parser/inline/ok/0150_impl_type_params.rast
index e70c3b710fb..77e12cad604 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0150_impl_type_params.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0150_impl_type_params.rast
@@ -32,7 +32,7 @@ SOURCE_FILE@0..29
                       IDENT@23..24 "N"
             R_ANGLE@24..25 ">"
     WHITESPACE@25..26 " "
-    ITEM_LIST@26..28
+    ASSOC_ITEM_LIST@26..28
       L_CURLY@26..27 "{"
       R_CURLY@27..28 "}"
   WHITESPACE@28..29 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_fn.rast b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_fn.rast
index adb6159f472..c0b8c0300c4 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_fn.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_fn.rast
@@ -16,7 +16,7 @@ SOURCE_FILE@0..50
           NAME_REF@11..14
             IDENT@11..14 "Foo"
     WHITESPACE@14..15 " "
-    ITEM_LIST@15..49
+    ASSOC_ITEM_LIST@15..49
       L_CURLY@15..16 "{"
       WHITESPACE@16..21 "\n    "
       FN_DEF@21..47
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast
index a9eda566811..e0c338297e3 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast
@@ -12,7 +12,7 @@ SOURCE_FILE@0..27
           NAME_REF@20..23
             IDENT@20..23 "Foo"
     WHITESPACE@23..24 " "
-    ITEM_LIST@24..26
+    ASSOC_ITEM_LIST@24..26
       L_CURLY@24..25 "{"
       R_CURLY@25..26 "}"
   WHITESPACE@26..27 "\n"
diff --git a/crates/ra_syntax/test_data/parser/ok/0030_traits.rast b/crates/ra_syntax/test_data/parser/ok/0030_traits.rast
index 0aadc11a490..63693de4f7d 100644
--- a/crates/ra_syntax/test_data/parser/ok/0030_traits.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0030_traits.rast
@@ -5,7 +5,7 @@ SOURCE_FILE@0..96
     NAME@6..14
       IDENT@6..14 "Runnable"
     WHITESPACE@14..15 " "
-    ITEM_LIST@15..36
+    ASSOC_ITEM_LIST@15..36
       L_CURLY@15..16 "{"
       WHITESPACE@16..21 "\n    "
       FN_DEF@21..34
@@ -26,7 +26,7 @@ SOURCE_FILE@0..96
     NAME@44..57
       IDENT@44..57 "TraitWithExpr"
     WHITESPACE@57..58 " "
-    ITEM_LIST@58..95
+    ASSOC_ITEM_LIST@58..95
       L_CURLY@58..59 "{"
       WHITESPACE@59..64 "\n    "
       FN_DEF@64..93
diff --git a/crates/ra_syntax/test_data/parser/ok/0042_ufcs_call_list.rast b/crates/ra_syntax/test_data/parser/ok/0042_ufcs_call_list.rast
index 468982b74e5..573edc08190 100644
--- a/crates/ra_syntax/test_data/parser/ok/0042_ufcs_call_list.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0042_ufcs_call_list.rast
@@ -17,7 +17,7 @@ SOURCE_FILE@0..199
           NAME_REF@80..83
             IDENT@80..83 "Foo"
     WHITESPACE@83..84 " "
-    ITEM_LIST@84..141
+    ASSOC_ITEM_LIST@84..141
       L_CURLY@84..85 "{"
       WHITESPACE@85..90 "\n    "
       FN_DEF@90..139
diff --git a/crates/ra_syntax/test_data/parser/ok/0045_block_inner_attrs.rast b/crates/ra_syntax/test_data/parser/ok/0045_block_inner_attrs.rast
index e8b095251f2..69aa0ba4d37 100644
--- a/crates/ra_syntax/test_data/parser/ok/0045_block_inner_attrs.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0045_block_inner_attrs.rast
@@ -98,7 +98,7 @@ SOURCE_FILE@0..686
           NAME_REF@529..537
             IDENT@529..537 "Whatever"
     WHITESPACE@537..538 " "
-    ITEM_LIST@538..685
+    ASSOC_ITEM_LIST@538..685
       L_CURLY@538..539 "{"
       WHITESPACE@539..544 "\n    "
       FN_DEF@544..683
diff --git a/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rast b/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rast
index 816740a7cdc..919c690de8f 100644
--- a/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rast
@@ -192,7 +192,7 @@ SOURCE_FILE@0..519
     NAME@180..183
       IDENT@180..183 "Foo"
     WHITESPACE@183..184 " "
-    ITEM_LIST@184..236
+    ASSOC_ITEM_LIST@184..236
       L_CURLY@184..185 "{"
       WHITESPACE@185..190 "\n    "
       FN_DEF@190..234
@@ -260,7 +260,7 @@ SOURCE_FILE@0..519
           NAME_REF@243..244
             IDENT@243..244 "S"
     WHITESPACE@244..245 " "
-    ITEM_LIST@245..519
+    ASSOC_ITEM_LIST@245..519
       L_CURLY@245..246 "{"
       WHITESPACE@246..252 "\n     "
       FN_DEF@252..277
diff --git a/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast b/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast
index 886b211d011..40619b46e26 100644
--- a/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast
@@ -5,7 +5,7 @@ SOURCE_FILE@0..170
     NAME@6..7
       IDENT@6..7 "T"
     WHITESPACE@7..8 " "
-    ITEM_LIST@8..169
+    ASSOC_ITEM_LIST@8..169
       L_CURLY@8..9 "{"
       WHITESPACE@9..14 "\n    "
       FN_DEF@14..46
diff --git a/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast b/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast
index a0423806c48..7b026e33b0c 100644
--- a/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast
@@ -8,7 +8,7 @@ SOURCE_FILE@0..137
           NAME_REF@5..6
             IDENT@5..6 "U"
     WHITESPACE@6..7 " "
-    ITEM_LIST@7..136
+    ASSOC_ITEM_LIST@7..136
       L_CURLY@7..8 "{"
       WHITESPACE@8..13 "\n    "
       FN_DEF@13..45
diff --git a/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast
index dab0247ee6f..584b2faf104 100644
--- a/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast
@@ -16,7 +16,7 @@ SOURCE_FILE@0..46
           NAME_REF@11..14
             IDENT@11..14 "Foo"
     WHITESPACE@14..15 " "
-    ITEM_LIST@15..45
+    ASSOC_ITEM_LIST@15..45
       L_CURLY@15..16 "{"
       WHITESPACE@16..19 "\n  "
       CONST_DEF@19..43
diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs
index 83449437bb2..d2a408e775c 100644
--- a/xtask/src/ast_src.rs
+++ b/xtask/src/ast_src.rs
@@ -186,6 +186,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
         "TUPLE_FIELD_DEF",
         "ENUM_VARIANT_LIST",
         "ITEM_LIST",
+        "ASSOC_ITEM_LIST",
         "ATTR",
         "META_ITEM", // not an item actually
         "USE_TREE",
diff --git a/xtask/src/codegen/rust.ungram b/xtask/src/codegen/rust.ungram
index a93cb381587..470ac8c8ff2 100644
--- a/xtask/src/codegen/rust.ungram
+++ b/xtask/src/codegen/rust.ungram
@@ -19,6 +19,13 @@ Item =
 | UnionDef
 | UseItem
 
+Module =
+  Attr* Visibility? 'mod' Name
+  (ItemList | ';')
+
+ItemList =
+  '{' Attr* Item* '}'
+
 FnDef =
  Attr* Visibility? Abi? 'const' 'default' 'async' 'unsafe' 'fn' Name TypeParamList?
  ParamList RetType?
@@ -67,17 +74,10 @@ EnumVariant =
 TraitDef =
   Attr* Visibility? 'unsafe'? 'auto'? 'trait' Name TypeParamList
   (':' TypeBoundList?)? WhereClause
-  ItemList
+  AssocItemList
 
-Module =
-  Attr* Visibility? 'mod' Name
-  (ItemList | ';')
-
-ItemList =
-  '{'
-    AssocItem*
-    Item*
-  '}'
+AssocItemList =
+  '{' AssocItem* '}'
 
 ConstDef =
   Attr* Visibility? 'default'? 'const' Name ':' ascribed_type:TypeRef
@@ -94,7 +94,7 @@ TypeAliasDef =
 ImplDef =
  Attr* Visibility? 'const'? 'default'? 'unsafe'? 'impl' TypeParamList? '!'? 'for'
  WhereClause?
- ItemList
+ AssocItemList
 
 ParenType =
   '(' TypeRef ')'
@@ -467,6 +467,7 @@ AssocItem =
   FnDef
 | TypeAliasDef
 | ConstDef
+| MacroCall
 
 ExternItem =
   FnDef | StaticDef