From b2cdb0b22631a66a00be25ba4b2e9c0b34ff426a Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Thu, 30 Jul 2020 18:15:08 +0200
Subject: Fix param gramamr

---
 xtask/src/codegen/rust.ungram | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/xtask/src/codegen/rust.ungram b/xtask/src/codegen/rust.ungram
index ef7c3e50e..4f7f6403e 100644
--- a/xtask/src/codegen/rust.ungram
+++ b/xtask/src/codegen/rust.ungram
@@ -66,8 +66,11 @@ SelfParam =
   )
 
 Param =
-  Attr* Pat (':' ascribed_type:TypeRef)
-| '...'
+  Attr* (
+    Pat (':' ascribed_type:TypeRef)
+  | ascribed_type:TypeRef
+  | '...'
+  )
 
 RetType =
   '->' TypeRef
-- 
cgit v1.2.3


From c83467796b6c7365ea4f41900d74444384a9e618 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Thu, 30 Jul 2020 18:17:28 +0200
Subject: Finalize Trait grammar

---
 .../ra_assists/src/handlers/change_visibility.rs   |  4 +--
 crates/ra_assists/src/handlers/move_bounds.rs      |  2 +-
 crates/ra_hir/src/has_source.rs                    |  6 ++--
 crates/ra_hir/src/semantics.rs                     |  2 +-
 crates/ra_hir/src/semantics/source_to_def.rs       |  6 ++--
 crates/ra_hir_def/src/body/lower.rs                |  2 +-
 crates/ra_hir_def/src/generics.rs                  |  4 +--
 crates/ra_hir_def/src/item_tree.rs                 |  4 +--
 crates/ra_hir_def/src/item_tree/lower.rs           |  8 +++---
 crates/ra_hir_def/src/item_tree/tests.rs           |  4 +--
 crates/ra_hir_def/src/keys.rs                      |  2 +-
 crates/ra_ide/src/completion/patterns.rs           |  4 +--
 crates/ra_ide/src/display/navigation_target.rs     |  4 +--
 crates/ra_ide/src/display/short_label.rs           |  2 +-
 crates/ra_ide/src/file_structure.rs                |  2 +-
 crates/ra_ide/src/goto_implementation.rs           |  4 +--
 crates/ra_ide/src/hover.rs                         | 32 +++++++++++-----------
 crates/ra_ide/src/syntax_highlighting.rs           |  2 +-
 crates/ra_ide_db/src/defs.rs                       |  2 +-
 crates/ra_ide_db/src/symbol_index.rs               |  4 +--
 crates/ra_parser/src/grammar.rs                    |  2 +-
 crates/ra_parser/src/grammar/items.rs              |  2 +-
 crates/ra_parser/src/syntax_kind/generated.rs      |  2 +-
 crates/ra_syntax/src/ast/generated/nodes.rs        | 32 +++++++++++-----------
 crates/ra_syntax/src/ast/node_ext.rs               |  2 +-
 crates/ra_syntax/src/parsing/text_tree_sink.rs     |  2 +-
 .../test_data/parser/err/0022_bad_exprs.rast       |  2 +-
 .../test_data/parser/err/0043_default_const.rast   |  2 +-
 .../parser/inline/err/0014_default_fn_type.rast    |  2 +-
 .../parser/inline/ok/0016_unsafe_trait.rast        |  2 +-
 .../parser/inline/ok/0041_trait_item.rast          |  4 +--
 .../test_data/parser/inline/ok/0050_fn_decl.rast   |  2 +-
 .../parser/inline/ok/0091_auto_trait.rast          |  2 +-
 .../parser/inline/ok/0094_unsafe_auto_trait.rast   |  2 +-
 .../parser/inline/ok/0151_trait_alias.rast         |  6 ++--
 .../ra_syntax/test_data/parser/ok/0030_traits.rast |  4 +--
 .../test_data/parser/ok/0051_parameter_attrs.rast  |  2 +-
 .../parser/ok/0063_trait_fn_patterns.rast          |  2 +-
 crates/rust-analyzer/src/handlers.rs               |  2 +-
 crates/rust-analyzer/src/to_proto.rs               |  2 +-
 xtask/src/ast_src.rs                               |  2 +-
 xtask/src/codegen/rust.ungram                      |  4 +--
 42 files changed, 92 insertions(+), 92 deletions(-)

diff --git a/crates/ra_assists/src/handlers/change_visibility.rs b/crates/ra_assists/src/handlers/change_visibility.rs
index 76144d7d2..724daa93f 100644
--- a/crates/ra_assists/src/handlers/change_visibility.rs
+++ b/crates/ra_assists/src/handlers/change_visibility.rs
@@ -1,7 +1,7 @@
 use ra_syntax::{
     ast::{self, NameOwner, VisibilityOwner},
     AstNode,
-    SyntaxKind::{CONST, ENUM, FN, MODULE, STATIC, STRUCT, TRAIT_DEF, VISIBILITY},
+    SyntaxKind::{CONST, ENUM, FN, MODULE, STATIC, STRUCT, TRAIT, VISIBILITY},
     T,
 };
 use test_utils::mark;
@@ -36,7 +36,7 @@ fn add_vis(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
 
     let (offset, target) = if let Some(keyword) = item_keyword {
         let parent = keyword.parent();
-        let def_kws = vec![CONST, STATIC, FN, MODULE, STRUCT, ENUM, TRAIT_DEF];
+        let def_kws = vec![CONST, STATIC, FN, MODULE, STRUCT, ENUM, TRAIT];
         // Parent is not a definition, can't add visibility
         if !def_kws.iter().any(|&def_kw| def_kw == parent.kind()) {
             return None;
diff --git a/crates/ra_assists/src/handlers/move_bounds.rs b/crates/ra_assists/src/handlers/move_bounds.rs
index 84ac75fa8..fd1d87423 100644
--- a/crates/ra_assists/src/handlers/move_bounds.rs
+++ b/crates/ra_assists/src/handlers/move_bounds.rs
@@ -38,7 +38,7 @@ pub(crate) fn move_bounds_to_where_clause(acc: &mut Assists, ctx: &AssistContext
     let anchor = match_ast! {
         match parent {
             ast::Fn(it) => it.body()?.syntax().clone().into(),
-            ast::TraitDef(it) => it.assoc_item_list()?.syntax().clone().into(),
+            ast::Trait(it) => it.assoc_item_list()?.syntax().clone().into(),
             ast::ImplDef(it) => it.assoc_item_list()?.syntax().clone().into(),
             ast::Enum(it) => it.variant_list()?.syntax().clone().into(),
             ast::Struct(it) => {
diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs
index 9581552e5..057f6e32f 100644
--- a/crates/ra_hir/src/has_source.rs
+++ b/crates/ra_hir/src/has_source.rs
@@ -99,8 +99,8 @@ impl HasSource for Static {
     }
 }
 impl HasSource for Trait {
-    type Ast = ast::TraitDef;
-    fn source(self, db: &dyn HirDatabase) -> InFile<ast::TraitDef> {
+    type Ast = ast::Trait;
+    fn source(self, db: &dyn HirDatabase) -> InFile<ast::Trait> {
         self.id.lookup(db.upcast()).source(db.upcast())
     }
 }
@@ -127,7 +127,7 @@ impl HasSource for ImplDef {
 }
 
 impl HasSource for TypeParam {
-    type Ast = Either<ast::TraitDef, ast::TypeParam>;
+    type Ast = Either<ast::Trait, ast::TypeParam>;
     fn source(self, db: &dyn HirDatabase) -> InFile<Self::Ast> {
         let child_source = self.id.parent.child_source(db.upcast());
         child_source.map(|it| it[self.id.local_id].clone())
diff --git a/crates/ra_hir/src/semantics.rs b/crates/ra_hir/src/semantics.rs
index 32a60b789..5f5104dab 100644
--- a/crates/ra_hir/src/semantics.rs
+++ b/crates/ra_hir/src/semantics.rs
@@ -583,7 +583,7 @@ to_def_impls![
     (crate::Struct, ast::Struct, struct_to_def),
     (crate::Enum, ast::Enum, enum_to_def),
     (crate::Union, ast::Union, union_to_def),
-    (crate::Trait, ast::TraitDef, trait_to_def),
+    (crate::Trait, ast::Trait, trait_to_def),
     (crate::ImplDef, ast::ImplDef, impl_to_def),
     (crate::TypeAlias, ast::TypeAlias, type_alias_to_def),
     (crate::Const, ast::Const, const_to_def),
diff --git a/crates/ra_hir/src/semantics/source_to_def.rs b/crates/ra_hir/src/semantics/source_to_def.rs
index 782a03f9e..ae41d3ddf 100644
--- a/crates/ra_hir/src/semantics/source_to_def.rs
+++ b/crates/ra_hir/src/semantics/source_to_def.rs
@@ -65,7 +65,7 @@ impl SourceToDefCtx<'_, '_> {
         Some(ModuleId { krate: parent_module.krate, local_id: child_id })
     }
 
-    pub(super) fn trait_to_def(&mut self, src: InFile<ast::TraitDef>) -> Option<TraitId> {
+    pub(super) fn trait_to_def(&mut self, src: InFile<ast::Trait>) -> Option<TraitId> {
         self.to_def(src, keys::TRAIT)
     }
     pub(super) fn impl_to_def(&mut self, src: InFile<ast::ImplDef>) -> Option<ImplId> {
@@ -154,7 +154,7 @@ impl SourceToDefCtx<'_, '_> {
                         let def = self.module_to_def(container.with_value(it))?;
                         def.into()
                     },
-                    ast::TraitDef(it) => {
+                    ast::Trait(it) => {
                         let def = self.trait_to_def(container.with_value(it))?;
                         def.into()
                     },
@@ -207,7 +207,7 @@ impl SourceToDefCtx<'_, '_> {
                     ast::Fn(it) => self.fn_to_def(container.with_value(it))?.into(),
                     ast::Struct(it) => self.struct_to_def(container.with_value(it))?.into(),
                     ast::Enum(it) => self.enum_to_def(container.with_value(it))?.into(),
-                    ast::TraitDef(it) => self.trait_to_def(container.with_value(it))?.into(),
+                    ast::Trait(it) => self.trait_to_def(container.with_value(it))?.into(),
                     ast::TypeAlias(it) => self.type_alias_to_def(container.with_value(it))?.into(),
                     ast::ImplDef(it) => self.impl_to_def(container.with_value(it))?.into(),
                     _ => continue,
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs
index 4a26e6397..0d0242173 100644
--- a/crates/ra_hir_def/src/body/lower.rs
+++ b/crates/ra_hir_def/src/body/lower.rs
@@ -664,7 +664,7 @@ impl ExprCollector<'_> {
                         let id = self.find_inner_item(&def)?;
                         (UnionLoc { container, id }.intern(self.db).into(), def.name())
                     }
-                    ast::Item::TraitDef(def) => {
+                    ast::Item::Trait(def) => {
                         let id = self.find_inner_item(&def)?;
                         (TraitLoc { container, id }.intern(self.db).into(), def.name())
                     }
diff --git a/crates/ra_hir_def/src/generics.rs b/crates/ra_hir_def/src/generics.rs
index 5fa2fbb3f..8ea61fcf2 100644
--- a/crates/ra_hir_def/src/generics.rs
+++ b/crates/ra_hir_def/src/generics.rs
@@ -66,7 +66,7 @@ pub enum WherePredicateTarget {
     TypeParam(LocalTypeParamId),
 }
 
-type SourceMap = ArenaMap<LocalTypeParamId, Either<ast::TraitDef, ast::TypeParam>>;
+type SourceMap = ArenaMap<LocalTypeParamId, Either<ast::Trait, ast::TypeParam>>;
 
 impl GenericParams {
     pub(crate) fn generic_params_query(
@@ -317,7 +317,7 @@ impl GenericParams {
 
 impl HasChildSource for GenericDefId {
     type ChildId = LocalTypeParamId;
-    type Value = Either<ast::TraitDef, ast::TypeParam>;
+    type Value = Either<ast::Trait, ast::TypeParam>;
     fn child_source(&self, db: &dyn DefDatabase) -> InFile<SourceMap> {
         let (_, sm) = GenericParams::new(db, *self);
         sm
diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs
index c478a9909..11002b1ad 100644
--- a/crates/ra_hir_def/src/item_tree.rs
+++ b/crates/ra_hir_def/src/item_tree.rs
@@ -419,7 +419,7 @@ mod_items! {
     Enum in enums -> ast::Enum,
     Const in consts -> ast::Const,
     Static in statics -> ast::Static,
-    Trait in traits -> ast::TraitDef,
+    Trait in traits -> ast::Trait,
     Impl in impls -> ast::ImplDef,
     TypeAlias in type_aliases -> ast::TypeAlias,
     Mod in mods -> ast::Module,
@@ -571,7 +571,7 @@ pub struct Trait {
     pub generic_params: GenericParamsId,
     pub auto: bool,
     pub items: Box<[AssocItem]>,
-    pub ast_id: FileAstId<ast::TraitDef>,
+    pub ast_id: FileAstId<ast::Trait>,
 }
 
 #[derive(Debug, Clone, Eq, PartialEq)]
diff --git a/crates/ra_hir_def/src/item_tree/lower.rs b/crates/ra_hir_def/src/item_tree/lower.rs
index a94548e5d..aaf3cfd3a 100644
--- a/crates/ra_hir_def/src/item_tree/lower.rs
+++ b/crates/ra_hir_def/src/item_tree/lower.rs
@@ -95,7 +95,7 @@ impl Ctx {
 
             // These are handled in their respective `lower_X` method (since we can't just blindly
             // walk them).
-            ast::Item::TraitDef(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {}
+            ast::Item::Trait(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {}
 
             // These don't have inner items.
             ast::Item::Module(_) | ast::Item::ExternCrate(_) | ast::Item::Use(_) => {}
@@ -111,7 +111,7 @@ impl Ctx {
             ast::Item::Static(ast) => self.lower_static(ast).map(Into::into),
             ast::Item::Const(ast) => Some(self.lower_const(ast).into()),
             ast::Item::Module(ast) => self.lower_module(ast).map(Into::into),
-            ast::Item::TraitDef(ast) => self.lower_trait(ast).map(Into::into),
+            ast::Item::Trait(ast) => self.lower_trait(ast).map(Into::into),
             ast::Item::ImplDef(ast) => self.lower_impl(ast).map(Into::into),
             ast::Item::Use(ast) => Some(ModItems(
                 self.lower_use(ast).into_iter().map(Into::into).collect::<SmallVec<_>>(),
@@ -413,7 +413,7 @@ impl Ctx {
         Some(id(self.data().mods.alloc(res)))
     }
 
-    fn lower_trait(&mut self, trait_def: &ast::TraitDef) -> Option<FileItemTreeId<Trait>> {
+    fn lower_trait(&mut self, trait_def: &ast::Trait) -> Option<FileItemTreeId<Trait>> {
         let name = trait_def.name()?.as_name();
         let visibility = self.lower_visibility(trait_def);
         let generic_params =
@@ -698,7 +698,7 @@ enum GenericsOwner<'a> {
     Enum,
     Union,
     /// The `TraitDef` is needed to fill the source map for the implicit `Self` parameter.
-    Trait(&'a ast::TraitDef),
+    Trait(&'a ast::Trait),
     TypeAlias,
     Impl,
 }
diff --git a/crates/ra_hir_def/src/item_tree/tests.rs b/crates/ra_hir_def/src/item_tree/tests.rs
index e61ce58bc..40a9bd53d 100644
--- a/crates/ra_hir_def/src/item_tree/tests.rs
+++ b/crates/ra_hir_def/src/item_tree/tests.rs
@@ -234,7 +234,7 @@ fn smoke() {
             #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("ext_crate"))] }, input: None }]) }]
             ExternCrate { path: ModPath { kind: Plain, segments: [Name(Text("krate"))] }, alias: None, visibility: RawVisibilityId("pub(self)"), is_macro_use: false, ast_id: FileAstId::<ra_syntax::ast::generated::nodes::ExternCrate>(1) }
             #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("on_trait"))] }, input: None }]) }]
-            Trait { name: Name(Text("Tr")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(0), auto: false, items: [TypeAlias(Idx::<TypeAlias>(0)), Const(Idx::<Const>(0)), Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::TraitDef>(2) }
+            Trait { name: Name(Text("Tr")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(0), auto: false, items: [TypeAlias(Idx::<TypeAlias>(0)), Const(Idx::<Const>(0)), Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Trait>(2) }
             > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("assoc_ty"))] }, input: None }]) }]
             > TypeAlias { name: Name(Text("AssocTy")), visibility: RawVisibilityId("pub(self)"), bounds: [Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Tr"))] }, generic_args: [Some(GenericArgs { args: [Type(Tuple([]))], has_self_type: false, bindings: [] })] })], generic_params: GenericParamsId(4294967295), type_ref: None, ast_id: FileAstId::<ra_syntax::ast::generated::nodes::TypeAlias>(8) }
             > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("assoc_const"))] }, input: None }]) }]
@@ -327,7 +327,7 @@ fn trait_attrs() {
 
             top-level items:
             #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("trait_attr"))] }, input: None }]) }]
-            Trait { name: Name(Text("Tr")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(0), auto: false, items: [Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::TraitDef>(0) }
+            Trait { name: Name(Text("Tr")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(0), auto: false, items: [Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Trait>(0) }
             > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_a"))] }, input: None }]) }]
             > Function { name: Name(Text("a")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(4294967295), has_self_param: false, is_unsafe: false, params: [], is_varargs: false, ret_type: Tuple([]), ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Fn>(1) }
             > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_b"))] }, input: None }]) }]
diff --git a/crates/ra_hir_def/src/keys.rs b/crates/ra_hir_def/src/keys.rs
index f75e3bb50..0bed08875 100644
--- a/crates/ra_hir_def/src/keys.rs
+++ b/crates/ra_hir_def/src/keys.rs
@@ -19,7 +19,7 @@ pub const CONST: Key<ast::Const, ConstId> = Key::new();
 pub const STATIC: Key<ast::Static, StaticId> = Key::new();
 pub const TYPE_ALIAS: Key<ast::TypeAlias, TypeAliasId> = Key::new();
 pub const IMPL: Key<ast::ImplDef, ImplId> = Key::new();
-pub const TRAIT: Key<ast::TraitDef, TraitId> = Key::new();
+pub const TRAIT: Key<ast::Trait, TraitId> = Key::new();
 pub const STRUCT: Key<ast::Struct, StructId> = Key::new();
 pub const UNION: Key<ast::Union, UnionId> = Key::new();
 pub const ENUM: Key<ast::Enum, EnumId> = Key::new();
diff --git a/crates/ra_ide/src/completion/patterns.rs b/crates/ra_ide/src/completion/patterns.rs
index b8408da4e..6c11f5830 100644
--- a/crates/ra_ide/src/completion/patterns.rs
+++ b/crates/ra_ide/src/completion/patterns.rs
@@ -15,7 +15,7 @@ pub(crate) fn has_trait_parent(element: SyntaxElement) -> bool {
     not_same_range_ancestor(element)
         .filter(|it| it.kind() == ASSOC_ITEM_LIST)
         .and_then(|it| it.parent())
-        .filter(|it| it.kind() == TRAIT_DEF)
+        .filter(|it| it.kind() == TRAIT)
         .is_some()
 }
 #[test]
@@ -113,7 +113,7 @@ fn test_if_is_prev() {
 }
 
 pub(crate) fn has_trait_as_prev_sibling(element: SyntaxElement) -> bool {
-    previous_sibling_or_ancestor_sibling(element).filter(|it| it.kind() == TRAIT_DEF).is_some()
+    previous_sibling_or_ancestor_sibling(element).filter(|it| it.kind() == TRAIT).is_some()
 }
 #[test]
 fn test_has_trait_as_prev_sibling() {
diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs
index 9e2c01245..45fbc86ef 100644
--- a/crates/ra_ide/src/display/navigation_target.rs
+++ b/crates/ra_ide/src/display/navigation_target.rs
@@ -382,7 +382,7 @@ pub(crate) fn docs_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> Option
             ast::Fn(it) => it.doc_comment_text(),
             ast::Struct(it) => it.doc_comment_text(),
             ast::Enum(it) => it.doc_comment_text(),
-            ast::TraitDef(it) => it.doc_comment_text(),
+            ast::Trait(it) => it.doc_comment_text(),
             ast::Module(it) => it.doc_comment_text(),
             ast::TypeAlias(it) => it.doc_comment_text(),
             ast::Const(it) => it.doc_comment_text(),
@@ -407,7 +407,7 @@ pub(crate) fn description_from_symbol(db: &RootDatabase, symbol: &FileSymbol) ->
             ast::Fn(it) => it.short_label(),
             ast::Struct(it) => it.short_label(),
             ast::Enum(it) => it.short_label(),
-            ast::TraitDef(it) => it.short_label(),
+            ast::Trait(it) => it.short_label(),
             ast::Module(it) => it.short_label(),
             ast::TypeAlias(it) => it.short_label(),
             ast::Const(it) => it.short_label(),
diff --git a/crates/ra_ide/src/display/short_label.rs b/crates/ra_ide/src/display/short_label.rs
index 282f362f2..c600908a4 100644
--- a/crates/ra_ide/src/display/short_label.rs
+++ b/crates/ra_ide/src/display/short_label.rs
@@ -31,7 +31,7 @@ impl ShortLabel for ast::Enum {
     }
 }
 
-impl ShortLabel for ast::TraitDef {
+impl ShortLabel for ast::Trait {
     fn short_label(&self) -> Option<String> {
         if self.unsafe_token().is_some() {
             short_label_from_node(self, "unsafe trait ")
diff --git a/crates/ra_ide/src/file_structure.rs b/crates/ra_ide/src/file_structure.rs
index 77384b6ec..3fc972460 100644
--- a/crates/ra_ide/src/file_structure.rs
+++ b/crates/ra_ide/src/file_structure.rs
@@ -130,7 +130,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
             ast::Union(it) => decl(it),
             ast::Enum(it) => decl(it),
             ast::Variant(it) => decl(it),
-            ast::TraitDef(it) => decl(it),
+            ast::Trait(it) => decl(it),
             ast::Module(it) => decl(it),
             ast::TypeAlias(it) => {
                 let ty = it.type_ref();
diff --git a/crates/ra_ide/src/goto_implementation.rs b/crates/ra_ide/src/goto_implementation.rs
index e2f7e6373..9912b7142 100644
--- a/crates/ra_ide/src/goto_implementation.rs
+++ b/crates/ra_ide/src/goto_implementation.rs
@@ -28,7 +28,7 @@ pub(crate) fn goto_implementation(
             nominal_def.syntax().text_range(),
             impls_for_def(&sema, &nominal_def, krate)?,
         ));
-    } else if let Some(trait_def) = find_node_at_offset::<ast::TraitDef>(&syntax, position.offset) {
+    } else if let Some(trait_def) = find_node_at_offset::<ast::Trait>(&syntax, position.offset) {
         return Some(RangeInfo::new(
             trait_def.syntax().text_range(),
             impls_for_trait(&sema, &trait_def, krate)?,
@@ -62,7 +62,7 @@ fn impls_for_def(
 
 fn impls_for_trait(
     sema: &Semantics<RootDatabase>,
-    node: &ast::TraitDef,
+    node: &ast::Trait,
     krate: Crate,
 ) -> Option<Vec<NavigationTarget>> {
     let tr = sema.to_def(node)?;
diff --git a/crates/ra_ide/src/hover.rs b/crates/ra_ide/src/hover.rs
index 83228af2e..aa48cb412 100644
--- a/crates/ra_ide/src/hover.rs
+++ b/crates/ra_ide/src/hover.rs
@@ -1678,7 +1678,7 @@ fn main() { let s<|>t = foo(); }
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -1718,7 +1718,7 @@ fn main() { let s<|>t = foo(); }
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -1777,7 +1777,7 @@ fn main() { let s<|>t = foo(); }
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -1796,7 +1796,7 @@ fn main() { let s<|>t = foo(); }
                                         19..22,
                                     ),
                                     name: "Bar",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Bar",
@@ -1839,7 +1839,7 @@ fn main() { let s<|>t = foo(); }
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -1858,7 +1858,7 @@ fn main() { let s<|>t = foo(); }
                                         22..25,
                                     ),
                                     name: "Bar",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Bar",
@@ -1933,7 +1933,7 @@ fn foo(ar<|>g: &impl Foo) {}
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -1973,7 +1973,7 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -1992,7 +1992,7 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
                                         19..22,
                                     ),
                                     name: "Bar",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Bar",
@@ -2049,7 +2049,7 @@ fn foo(ar<|>g: &impl Foo<S>) {}
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -2130,7 +2130,7 @@ fn main() { let s<|>t = foo(); }
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -2167,7 +2167,7 @@ fn foo(ar<|>g: &dyn Foo) {}
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -2205,7 +2205,7 @@ fn foo(ar<|>g: &dyn Foo<S>) {}
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
@@ -2265,7 +2265,7 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
                                         6..15,
                                     ),
                                     name: "ImplTrait",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait ImplTrait",
@@ -2303,7 +2303,7 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
                                         28..36,
                                     ),
                                     name: "DynTrait",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait DynTrait",
@@ -2370,7 +2370,7 @@ fn main() { let s<|>t = test().get(); }
                                         6..9,
                                     ),
                                     name: "Foo",
-                                    kind: TRAIT_DEF,
+                                    kind: TRAIT,
                                     container_name: None,
                                     description: Some(
                                         "trait Foo",
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs
index 19ec73d2a..a66453c04 100644
--- a/crates/ra_ide/src/syntax_highlighting.rs
+++ b/crates/ra_ide/src/syntax_highlighting.rs
@@ -708,7 +708,7 @@ fn highlight_name_by_syntax(name: ast::Name) -> Highlight {
         STRUCT => HighlightTag::Struct,
         ENUM => HighlightTag::Enum,
         UNION => HighlightTag::Union,
-        TRAIT_DEF => HighlightTag::Trait,
+        TRAIT => HighlightTag::Trait,
         TYPE_ALIAS => HighlightTag::TypeAlias,
         TYPE_PARAM => HighlightTag::TypeParam,
         RECORD_FIELD => HighlightTag::Field,
diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs
index b908bd741..df56f2d9e 100644
--- a/crates/ra_ide_db/src/defs.rs
+++ b/crates/ra_ide_db/src/defs.rs
@@ -162,7 +162,7 @@ pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option
                 let def: hir::Enum = sema.to_def(&it)?;
                 Some(NameClass::Definition(Definition::ModuleDef(def.into())))
             },
-            ast::TraitDef(it) => {
+            ast::Trait(it) => {
                 let def: hir::Trait = sema.to_def(&it)?;
                 Some(NameClass::Definition(Definition::ModuleDef(def.into())))
             },
diff --git a/crates/ra_ide_db/src/symbol_index.rs b/crates/ra_ide_db/src/symbol_index.rs
index 41b8d07f4..35a2c5be3 100644
--- a/crates/ra_ide_db/src/symbol_index.rs
+++ b/crates/ra_ide_db/src/symbol_index.rs
@@ -344,7 +344,7 @@ impl Query {
 }
 
 fn is_type(kind: SyntaxKind) -> bool {
-    matches!(kind, STRUCT | ENUM | TRAIT_DEF | TYPE_ALIAS)
+    matches!(kind, STRUCT | ENUM | TRAIT | TYPE_ALIAS)
 }
 
 /// The actual data that is stored in the index. It should be as compact as
@@ -400,7 +400,7 @@ fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> {
             ast::Fn(it) => decl(it),
             ast::Struct(it) => decl(it),
             ast::Enum(it) => decl(it),
-            ast::TraitDef(it) => decl(it),
+            ast::Trait(it) => decl(it),
             ast::Module(it) => decl(it),
             ast::TypeAlias(it) => decl(it),
             ast::Const(it) => decl(it),
diff --git a/crates/ra_parser/src/grammar.rs b/crates/ra_parser/src/grammar.rs
index 22a7acdf3..cd4b2381d 100644
--- a/crates/ra_parser/src/grammar.rs
+++ b/crates/ra_parser/src/grammar.rs
@@ -151,7 +151,7 @@ pub(crate) fn reparser(
         TOKEN_TREE if first_child? == T!['{'] => items::token_tree,
         ASSOC_ITEM_LIST => match parent? {
             IMPL_DEF => items::impl_item_list,
-            TRAIT_DEF => items::trait_item_list,
+            TRAIT => items::trait_item_list,
             _ => return None,
         },
         ITEM_LIST => items::mod_item_list,
diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs
index 664b23f6a..5603d61a9 100644
--- a/crates/ra_parser/src/grammar/items.rs
+++ b/crates/ra_parser/src/grammar/items.rs
@@ -193,7 +193,7 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         // unsafe auto trait T {}
         T![trait] => {
             traits::trait_def(p);
-            m.complete(p, TRAIT_DEF);
+            m.complete(p, TRAIT);
         }
 
         // test unsafe_impl
diff --git a/crates/ra_parser/src/syntax_kind/generated.rs b/crates/ra_parser/src/syntax_kind/generated.rs
index 64889676e..27eed0090 100644
--- a/crates/ra_parser/src/syntax_kind/generated.rs
+++ b/crates/ra_parser/src/syntax_kind/generated.rs
@@ -133,7 +133,7 @@ pub enum SyntaxKind {
     USE,
     STATIC,
     CONST,
-    TRAIT_DEF,
+    TRAIT,
     IMPL_DEF,
     TYPE_ALIAS,
     MACRO_CALL,
diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs
index 00a70fce0..3adb6b2d4 100644
--- a/crates/ra_syntax/src/ast/generated/nodes.rs
+++ b/crates/ra_syntax/src/ast/generated/nodes.rs
@@ -169,15 +169,15 @@ impl Struct {
     pub fn field_list(&self) -> Option<FieldList> { support::child(&self.syntax) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct TraitDef {
+pub struct Trait {
     pub(crate) syntax: SyntaxNode,
 }
-impl ast::AttrsOwner for TraitDef {}
-impl ast::NameOwner for TraitDef {}
-impl ast::VisibilityOwner for TraitDef {}
-impl ast::GenericParamsOwner for TraitDef {}
-impl ast::TypeBoundsOwner for TraitDef {}
-impl TraitDef {
+impl ast::AttrsOwner for Trait {}
+impl ast::NameOwner for Trait {}
+impl ast::VisibilityOwner for Trait {}
+impl ast::GenericParamsOwner for Trait {}
+impl ast::TypeBoundsOwner for Trait {}
+impl Trait {
     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]) }
@@ -1283,7 +1283,7 @@ pub enum Item {
     Module(Module),
     Static(Static),
     Struct(Struct),
-    TraitDef(TraitDef),
+    Trait(Trait),
     TypeAlias(TypeAlias),
     Union(Union),
     Use(Use),
@@ -1532,8 +1532,8 @@ impl AstNode for Struct {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
-impl AstNode for TraitDef {
-    fn can_cast(kind: SyntaxKind) -> bool { kind == TRAIT_DEF }
+impl AstNode for Trait {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == TRAIT }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
         if Self::can_cast(syntax.kind()) {
             Some(Self { syntax })
@@ -2805,8 +2805,8 @@ impl From<Static> for Item {
 impl From<Struct> for Item {
     fn from(node: Struct) -> Item { Item::Struct(node) }
 }
-impl From<TraitDef> for Item {
-    fn from(node: TraitDef) -> Item { Item::TraitDef(node) }
+impl From<Trait> for Item {
+    fn from(node: Trait) -> Item { Item::Trait(node) }
 }
 impl From<TypeAlias> for Item {
     fn from(node: TypeAlias) -> Item { Item::TypeAlias(node) }
@@ -2821,7 +2821,7 @@ impl AstNode for Item {
     fn can_cast(kind: SyntaxKind) -> bool {
         match kind {
             CONST | ENUM | EXTERN_BLOCK | EXTERN_CRATE | FN | IMPL_DEF | MACRO_CALL | MODULE
-            | STATIC | STRUCT | TRAIT_DEF | TYPE_ALIAS | UNION | USE => true,
+            | STATIC | STRUCT | TRAIT | TYPE_ALIAS | UNION | USE => true,
             _ => false,
         }
     }
@@ -2837,7 +2837,7 @@ impl AstNode for Item {
             MODULE => Item::Module(Module { syntax }),
             STATIC => Item::Static(Static { syntax }),
             STRUCT => Item::Struct(Struct { syntax }),
-            TRAIT_DEF => Item::TraitDef(TraitDef { syntax }),
+            TRAIT => Item::Trait(Trait { syntax }),
             TYPE_ALIAS => Item::TypeAlias(TypeAlias { syntax }),
             UNION => Item::Union(Union { syntax }),
             USE => Item::Use(Use { syntax }),
@@ -2857,7 +2857,7 @@ impl AstNode for Item {
             Item::Module(it) => &it.syntax,
             Item::Static(it) => &it.syntax,
             Item::Struct(it) => &it.syntax,
-            Item::TraitDef(it) => &it.syntax,
+            Item::Trait(it) => &it.syntax,
             Item::TypeAlias(it) => &it.syntax,
             Item::Union(it) => &it.syntax,
             Item::Use(it) => &it.syntax,
@@ -3516,7 +3516,7 @@ impl std::fmt::Display for Struct {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
-impl std::fmt::Display for TraitDef {
+impl std::fmt::Display for Trait {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
     }
diff --git a/crates/ra_syntax/src/ast/node_ext.rs b/crates/ra_syntax/src/ast/node_ext.rs
index 4da1d5c11..a8d8955de 100644
--- a/crates/ra_syntax/src/ast/node_ext.rs
+++ b/crates/ra_syntax/src/ast/node_ext.rs
@@ -481,7 +481,7 @@ impl ast::DocCommentsOwner for ast::RecordField {}
 impl ast::DocCommentsOwner for ast::TupleField {}
 impl ast::DocCommentsOwner for ast::Enum {}
 impl ast::DocCommentsOwner for ast::Variant {}
-impl ast::DocCommentsOwner for ast::TraitDef {}
+impl ast::DocCommentsOwner for ast::Trait {}
 impl ast::DocCommentsOwner for ast::Module {}
 impl ast::DocCommentsOwner for ast::Static {}
 impl ast::DocCommentsOwner for ast::Const {}
diff --git a/crates/ra_syntax/src/parsing/text_tree_sink.rs b/crates/ra_syntax/src/parsing/text_tree_sink.rs
index 95581a84b..6d1828d20 100644
--- a/crates/ra_syntax/src/parsing/text_tree_sink.rs
+++ b/crates/ra_syntax/src/parsing/text_tree_sink.rs
@@ -146,7 +146,7 @@ fn n_attached_trivias<'a>(
     trivias: impl Iterator<Item = (SyntaxKind, &'a str)>,
 ) -> usize {
     match kind {
-        MACRO_CALL | CONST | TYPE_ALIAS | STRUCT | ENUM | VARIANT | FN | TRAIT_DEF | MODULE
+        MACRO_CALL | CONST | TYPE_ALIAS | STRUCT | ENUM | VARIANT | FN | TRAIT | MODULE
         | RECORD_FIELD | STATIC => {
             let mut res = 0;
             let mut trivias = trivias.enumerate().peekable();
diff --git a/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast b/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast
index 02339d035..a6e304b78 100644
--- a/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast
+++ b/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast
@@ -133,7 +133,7 @@ SOURCE_FILE@0..112
         ERROR@96..97
           COMMA@96..97 ","
       WHITESPACE@97..98 " "
-      TRAIT_DEF@98..104
+      TRAIT@98..104
         TRAIT_KW@98..103 "trait"
         ERROR@103..104
           COMMA@103..104 ","
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 f041fa6f7..51ad2a846 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..39
-  TRAIT_DEF@0..38
+  TRAIT@0..38
     TRAIT_KW@0..5 "trait"
     WHITESPACE@5..6 " "
     NAME@6..7
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 22c7c5f0d..acd72094b 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..62
-  TRAIT_DEF@0..61
+  TRAIT@0..61
     TRAIT_KW@0..5 "trait"
     WHITESPACE@5..6 " "
     NAME@6..7
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 69b82e33c..625ab4c2d 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..18
-  TRAIT_DEF@0..17
+  TRAIT@0..17
     UNSAFE_KW@0..6 "unsafe"
     WHITESPACE@6..7 " "
     TRAIT_KW@7..12 "trait"
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 8f20ccaa3..3638462f8 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..101
-  TRAIT_DEF@0..41
+  TRAIT@0..41
     TRAIT_KW@0..5 "trait"
     WHITESPACE@5..6 " "
     NAME@6..7
@@ -52,7 +52,7 @@ SOURCE_FILE@0..101
       L_CURLY@39..40 "{"
       R_CURLY@40..41 "}"
   WHITESPACE@41..42 "\n"
-  TRAIT_DEF@42..100
+  TRAIT@42..100
     TRAIT_KW@42..47 "trait"
     WHITESPACE@47..48 " "
     NAME@48..49
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 02c57079f..a5bf55131 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..22
-  TRAIT_DEF@0..21
+  TRAIT@0..21
     TRAIT_KW@0..5 "trait"
     WHITESPACE@5..6 " "
     NAME@6..7
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 7efa4c34d..0cac9ac43 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..16
-  TRAIT_DEF@0..15
+  TRAIT@0..15
     AUTO_KW@0..4 "auto"
     WHITESPACE@4..5 " "
     TRAIT_KW@5..10 "trait"
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 fad27be66..0ef11c682 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..23
-  TRAIT_DEF@0..22
+  TRAIT@0..22
     UNSAFE_KW@0..6 "unsafe"
     WHITESPACE@6..7 " "
     AUTO_KW@7..11 "auto"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rast b/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rast
index e2a770a37..cc220e534 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rast
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..83
-  TRAIT_DEF@0..18
+  TRAIT@0..18
     TRAIT_KW@0..5 "trait"
     WHITESPACE@5..6 " "
     NAME@6..7
@@ -31,7 +31,7 @@ SOURCE_FILE@0..83
                 R_ANGLE@16..17 ">"
     SEMICOLON@17..18 ";"
   WHITESPACE@18..19 "\n"
-  TRAIT_DEF@19..51
+  TRAIT@19..51
     TRAIT_KW@19..24 "trait"
     WHITESPACE@24..25 " "
     NAME@25..26
@@ -82,7 +82,7 @@ SOURCE_FILE@0..83
                     IDENT@46..50 "Copy"
     SEMICOLON@50..51 ";"
   WHITESPACE@51..52 "\n"
-  TRAIT_DEF@52..82
+  TRAIT@52..82
     TRAIT_KW@52..57 "trait"
     WHITESPACE@57..58 " "
     NAME@58..59
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 4bcf07ffb..280d4cb82 100644
--- a/crates/ra_syntax/test_data/parser/ok/0030_traits.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0030_traits.rast
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..96
-  TRAIT_DEF@0..36
+  TRAIT@0..36
     TRAIT_KW@0..5 "trait"
     WHITESPACE@5..6 " "
     NAME@6..14
@@ -20,7 +20,7 @@ SOURCE_FILE@0..96
       WHITESPACE@34..35 "\n"
       R_CURLY@35..36 "}"
   WHITESPACE@36..38 "\n\n"
-  TRAIT_DEF@38..95
+  TRAIT@38..95
     TRAIT_KW@38..43 "trait"
     WHITESPACE@43..44 " "
     NAME@44..57
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 8081eefbc..7a574ebb4 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
@@ -186,7 +186,7 @@ SOURCE_FILE@0..519
       L_CURLY@170..171 "{"
       R_CURLY@171..172 "}"
   WHITESPACE@172..174 "\n\n"
-  TRAIT_DEF@174..236
+  TRAIT@174..236
     TRAIT_KW@174..179 "trait"
     WHITESPACE@179..180 " "
     NAME@180..183
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 a87bbf4eb..facce8167 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..170
-  TRAIT_DEF@0..169
+  TRAIT@0..169
     TRAIT_KW@0..5 "trait"
     WHITESPACE@5..6 " "
     NAME@6..7
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs
index df4969b80..62ed6880b 100644
--- a/crates/rust-analyzer/src/handlers.rs
+++ b/crates/rust-analyzer/src/handlers.rs
@@ -924,7 +924,7 @@ pub(crate) fn handle_code_lens(
                 .filter(|it| {
                     matches!(
                         it.kind,
-                        SyntaxKind::TRAIT_DEF
+                        SyntaxKind::TRAIT
                             | SyntaxKind::STRUCT
                             | SyntaxKind::ENUM
                             | SyntaxKind::UNION
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs
index fd5123301..3889ebed1 100644
--- a/crates/rust-analyzer/src/to_proto.rs
+++ b/crates/rust-analyzer/src/to_proto.rs
@@ -35,7 +35,7 @@ pub(crate) fn symbol_kind(syntax_kind: SyntaxKind) -> lsp_types::SymbolKind {
         SyntaxKind::STRUCT => lsp_types::SymbolKind::Struct,
         SyntaxKind::ENUM => lsp_types::SymbolKind::Enum,
         SyntaxKind::VARIANT => lsp_types::SymbolKind::EnumMember,
-        SyntaxKind::TRAIT_DEF => lsp_types::SymbolKind::Interface,
+        SyntaxKind::TRAIT => lsp_types::SymbolKind::Interface,
         SyntaxKind::MACRO_CALL => lsp_types::SymbolKind::Function,
         SyntaxKind::MODULE => lsp_types::SymbolKind::Module,
         SyntaxKind::TYPE_ALIAS => lsp_types::SymbolKind::TypeParameter,
diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs
index 56e3f4b0a..ea8bf50ed 100644
--- a/xtask/src/ast_src.rs
+++ b/xtask/src/ast_src.rs
@@ -103,7 +103,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
         "USE",
         "STATIC",
         "CONST",
-        "TRAIT_DEF",
+        "TRAIT",
         "IMPL_DEF",
         "TYPE_ALIAS",
         "MACRO_CALL",
diff --git a/xtask/src/codegen/rust.ungram b/xtask/src/codegen/rust.ungram
index 4f7f6403e..b30658397 100644
--- a/xtask/src/codegen/rust.ungram
+++ b/xtask/src/codegen/rust.ungram
@@ -14,7 +14,7 @@ Item =
 | Module
 | Static
 | Struct
-| TraitDef
+| Trait
 | TypeAlias
 | Union
 | Use
@@ -123,7 +123,7 @@ Static =
   Attr* Visibility? 'static'? 'mut'? Name ':' ascribed_type:TypeRef
   '=' body:Expr ';'
 
-TraitDef =
+Trait =
   Attr* Visibility? 'unsafe'? 'auto'? 'trait' Name GenericParamList
   (':' TypeBoundList?)? WhereClause
   AssocItemList
-- 
cgit v1.2.3


From c5798c4d75aa807aec47208a49101bdec3affcca Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Thu, 30 Jul 2020 18:28:28 +0200
Subject: Finalize impl Grammar

---
 crates/ra_assists/src/ast_transform.rs             |  4 +--
 .../src/handlers/add_missing_impl_members.rs       |  2 +-
 crates/ra_assists/src/handlers/generate_new.rs     |  6 ++---
 .../src/handlers/introduce_named_lifetime.rs       |  4 +--
 crates/ra_assists/src/handlers/move_bounds.rs      |  2 +-
 crates/ra_assists/src/utils.rs                     |  4 +--
 crates/ra_hir/src/has_source.rs                    |  4 +--
 crates/ra_hir/src/semantics.rs                     |  2 +-
 crates/ra_hir/src/semantics/source_to_def.rs       |  6 ++---
 crates/ra_hir_def/src/body/lower.rs                |  2 +-
 crates/ra_hir_def/src/item_tree.rs                 |  4 +--
 crates/ra_hir_def/src/item_tree/lower.rs           |  6 ++---
 crates/ra_hir_def/src/item_tree/tests.rs           |  6 ++---
 crates/ra_hir_def/src/keys.rs                      |  2 +-
 .../ra_ide/src/completion/complete_trait_impl.rs   |  8 +++---
 crates/ra_ide/src/completion/completion_context.rs |  4 +--
 crates/ra_ide/src/completion/patterns.rs           |  4 +--
 crates/ra_ide/src/file_structure.rs                |  6 ++---
 crates/ra_ide/src/references/rename.rs             |  5 ++--
 crates/ra_ide/src/syntax_highlighting.rs           |  2 +-
 crates/ra_parser/src/grammar.rs                    |  2 +-
 crates/ra_parser/src/grammar/items.rs              |  2 +-
 crates/ra_parser/src/syntax_kind/generated.rs      |  2 +-
 crates/ra_syntax/src/ast/generated/nodes.rs        | 31 +++++++++++-----------
 crates/ra_syntax/src/ast/node_ext.rs               |  4 +--
 crates/ra_syntax/src/validation.rs                 |  2 +-
 .../test_data/parser/err/0018_incomplete_fn.rast   |  2 +-
 .../test_data/parser/err/0022_bad_exprs.rast       |  2 +-
 .../test_data/parser/err/0026_imp_recovery.rast    |  4 +--
 .../parser/err/0037_visibility_in_traits.rast      |  2 +-
 .../inline/err/0002_misplaced_label_err.rast       |  2 +-
 .../parser/inline/err/0004_impl_type.rast          | 12 ++++-----
 .../parser/inline/ok/0001_trait_item_list.rast     |  2 +-
 .../parser/inline/ok/0006_self_param.rast          |  2 +-
 .../parser/inline/ok/0018_arb_self_types.rast      |  2 +-
 .../parser/inline/ok/0021_impl_item_list.rast      |  2 +-
 .../parser/inline/ok/0047_unsafe_default_impl.rast |  2 +-
 .../parser/inline/ok/0063_impl_def_neg.rast        |  2 +-
 .../test_data/parser/inline/ok/0079_impl_def.rast  |  2 +-
 .../parser/inline/ok/0087_unsafe_impl.rast         |  2 +-
 .../parser/inline/ok/0097_default_impl.rast        |  2 +-
 .../inline/ok/0118_impl_inner_attributes.rast      |  2 +-
 .../parser/inline/ok/0132_default_fn_type.rast     |  2 +-
 .../parser/inline/ok/0150_impl_type_params.rast    |  2 +-
 .../parser/inline/ok/0163_default_unsafe_fn.rast   |  2 +-
 .../parser/inline/ok/0163_default_unsafe_impl.rast |  2 +-
 .../test_data/parser/ok/0042_ufcs_call_list.rast   |  2 +-
 .../parser/ok/0045_block_inner_attrs.rast          |  2 +-
 .../test_data/parser/ok/0051_parameter_attrs.rast  |  2 +-
 .../test_data/parser/ok/0064_impl_fn_params.rast   |  2 +-
 .../test_data/parser/ok/0066_default_const.rast    |  2 +-
 crates/rust-analyzer/src/to_proto.rs               |  2 +-
 xtask/src/ast_src.rs                               |  2 +-
 xtask/src/codegen/rust.ungram                      | 11 +++++---
 54 files changed, 103 insertions(+), 100 deletions(-)

diff --git a/crates/ra_assists/src/ast_transform.rs b/crates/ra_assists/src/ast_transform.rs
index 01adb834c..5ea4f9f5b 100644
--- a/crates/ra_assists/src/ast_transform.rs
+++ b/crates/ra_assists/src/ast_transform.rs
@@ -41,7 +41,7 @@ impl<'a> SubstituteTypeParams<'a> {
         source_scope: &'a SemanticsScope<'a>,
         // FIXME: there's implicit invariant that `trait_` and  `source_scope` match...
         trait_: hir::Trait,
-        impl_def: ast::ImplDef,
+        impl_def: ast::Impl,
     ) -> SubstituteTypeParams<'a> {
         let substs = get_syntactic_substs(impl_def).unwrap_or_default();
         let generic_def: hir::GenericDef = trait_.into();
@@ -80,7 +80,7 @@ impl<'a> SubstituteTypeParams<'a> {
 
         // FIXME: It would probably be nicer if we could get this via HIR (i.e. get the
         // trait ref, and then go from the types in the substs back to the syntax)
-        fn get_syntactic_substs(impl_def: ast::ImplDef) -> Option<Vec<ast::TypeRef>> {
+        fn get_syntactic_substs(impl_def: ast::Impl) -> Option<Vec<ast::TypeRef>> {
             let target_trait = impl_def.target_trait()?;
             let path_type = match target_trait {
                 ast::TypeRef::PathType(path) => path,
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 1ab176c26..95a750aee 100644
--- a/crates/ra_assists/src/handlers/add_missing_impl_members.rs
+++ b/crates/ra_assists/src/handlers/add_missing_impl_members.rs
@@ -111,7 +111,7 @@ fn add_missing_impl_members_inner(
     label: &'static str,
 ) -> Option<()> {
     let _p = ra_prof::profile("add_missing_impl_members_inner");
-    let impl_def = ctx.find_node_at_offset::<ast::ImplDef>()?;
+    let impl_def = ctx.find_node_at_offset::<ast::Impl>()?;
     let impl_item_list = impl_def.assoc_item_list()?;
 
     let trait_ = resolve_target_trait(&ctx.sema, &impl_def)?;
diff --git a/crates/ra_assists/src/handlers/generate_new.rs b/crates/ra_assists/src/handlers/generate_new.rs
index 22b47d254..3c67749ee 100644
--- a/crates/ra_assists/src/handlers/generate_new.rs
+++ b/crates/ra_assists/src/handlers/generate_new.rs
@@ -122,7 +122,7 @@ fn generate_impl_text(strukt: &ast::Struct, code: &str) -> String {
 //
 // FIXME: change the new fn checking to a more semantic approach when that's more
 // viable (e.g. we process proc macros, etc)
-fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<ast::ImplDef>> {
+fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<ast::Impl>> {
     let db = ctx.db();
     let module = strukt.syntax().ancestors().find(|node| {
         ast::Module::can_cast(node.kind()) || ast::SourceFile::can_cast(node.kind())
@@ -130,7 +130,7 @@ fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<
 
     let struct_def = ctx.sema.to_def(strukt)?;
 
-    let block = module.descendants().filter_map(ast::ImplDef::cast).find_map(|impl_blk| {
+    let block = module.descendants().filter_map(ast::Impl::cast).find_map(|impl_blk| {
         let blk = ctx.sema.to_def(&impl_blk)?;
 
         // FIXME: handle e.g. `struct S<T>; impl<U> S<U> {}`
@@ -158,7 +158,7 @@ fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<
     Some(block)
 }
 
-fn has_new_fn(imp: &ast::ImplDef) -> bool {
+fn has_new_fn(imp: &ast::Impl) -> bool {
     if let Some(il) = imp.assoc_item_list() {
         for item in il.assoc_items() {
             if let ast::AssocItem::Fn(f) = item {
diff --git a/crates/ra_assists/src/handlers/introduce_named_lifetime.rs b/crates/ra_assists/src/handlers/introduce_named_lifetime.rs
index 4ad173ef0..92a1a5925 100644
--- a/crates/ra_assists/src/handlers/introduce_named_lifetime.rs
+++ b/crates/ra_assists/src/handlers/introduce_named_lifetime.rs
@@ -40,7 +40,7 @@ pub(crate) fn introduce_named_lifetime(acc: &mut Assists, ctx: &AssistContext) -
         .filter(|lifetime| lifetime.text() == "'_")?;
     if let Some(fn_def) = lifetime_token.ancestors().find_map(ast::Fn::cast) {
         generate_fn_def_assist(acc, &fn_def, lifetime_token.text_range())
-    } else if let Some(impl_def) = lifetime_token.ancestors().find_map(ast::ImplDef::cast) {
+    } else if let Some(impl_def) = lifetime_token.ancestors().find_map(ast::Impl::cast) {
         generate_impl_def_assist(acc, &impl_def, lifetime_token.text_range())
     } else {
         None
@@ -93,7 +93,7 @@ fn generate_fn_def_assist(
 /// Generate the assist for the impl def case
 fn generate_impl_def_assist(
     acc: &mut Assists,
-    impl_def: &ast::ImplDef,
+    impl_def: &ast::Impl,
     lifetime_loc: TextRange,
 ) -> Option<()> {
     let new_lifetime_param = generate_unique_lifetime_param_name(&impl_def.generic_param_list())?;
diff --git a/crates/ra_assists/src/handlers/move_bounds.rs b/crates/ra_assists/src/handlers/move_bounds.rs
index fd1d87423..6d394443e 100644
--- a/crates/ra_assists/src/handlers/move_bounds.rs
+++ b/crates/ra_assists/src/handlers/move_bounds.rs
@@ -39,7 +39,7 @@ pub(crate) fn move_bounds_to_where_clause(acc: &mut Assists, ctx: &AssistContext
         match parent {
             ast::Fn(it) => it.body()?.syntax().clone().into(),
             ast::Trait(it) => it.assoc_item_list()?.syntax().clone().into(),
-            ast::ImplDef(it) => it.assoc_item_list()?.syntax().clone().into(),
+            ast::Impl(it) => it.assoc_item_list()?.syntax().clone().into(),
             ast::Enum(it) => it.variant_list()?.syntax().clone().into(),
             ast::Struct(it) => {
                 it.syntax().children_with_tokens()
diff --git a/crates/ra_assists/src/utils.rs b/crates/ra_assists/src/utils.rs
index 337e3474f..bb16ebd4e 100644
--- a/crates/ra_assists/src/utils.rs
+++ b/crates/ra_assists/src/utils.rs
@@ -56,7 +56,7 @@ pub(crate) fn render_snippet(_cap: SnippetCap, node: &SyntaxNode, cursor: Cursor
 
 pub fn get_missing_assoc_items(
     sema: &Semantics<RootDatabase>,
-    impl_def: &ast::ImplDef,
+    impl_def: &ast::Impl,
 ) -> Vec<hir::AssocItem> {
     // Names must be unique between constants and functions. However, type aliases
     // may share the same name as a function or constant.
@@ -109,7 +109,7 @@ pub fn get_missing_assoc_items(
 
 pub(crate) fn resolve_target_trait(
     sema: &Semantics<RootDatabase>,
-    impl_def: &ast::ImplDef,
+    impl_def: &ast::Impl,
 ) -> Option<hir::Trait> {
     let ast_path = impl_def
         .target_trait()
diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs
index 057f6e32f..1c691d961 100644
--- a/crates/ra_hir/src/has_source.rs
+++ b/crates/ra_hir/src/has_source.rs
@@ -120,8 +120,8 @@ impl HasSource for MacroDef {
     }
 }
 impl HasSource for ImplDef {
-    type Ast = ast::ImplDef;
-    fn source(self, db: &dyn HirDatabase) -> InFile<ast::ImplDef> {
+    type Ast = ast::Impl;
+    fn source(self, db: &dyn HirDatabase) -> InFile<ast::Impl> {
         self.id.lookup(db.upcast()).source(db.upcast())
     }
 }
diff --git a/crates/ra_hir/src/semantics.rs b/crates/ra_hir/src/semantics.rs
index 5f5104dab..6f3b3dc9a 100644
--- a/crates/ra_hir/src/semantics.rs
+++ b/crates/ra_hir/src/semantics.rs
@@ -584,7 +584,7 @@ to_def_impls![
     (crate::Enum, ast::Enum, enum_to_def),
     (crate::Union, ast::Union, union_to_def),
     (crate::Trait, ast::Trait, trait_to_def),
-    (crate::ImplDef, ast::ImplDef, impl_to_def),
+    (crate::ImplDef, ast::Impl, impl_to_def),
     (crate::TypeAlias, ast::TypeAlias, type_alias_to_def),
     (crate::Const, ast::Const, const_to_def),
     (crate::Static, ast::Static, static_to_def),
diff --git a/crates/ra_hir/src/semantics/source_to_def.rs b/crates/ra_hir/src/semantics/source_to_def.rs
index ae41d3ddf..d1994e2e7 100644
--- a/crates/ra_hir/src/semantics/source_to_def.rs
+++ b/crates/ra_hir/src/semantics/source_to_def.rs
@@ -68,7 +68,7 @@ impl SourceToDefCtx<'_, '_> {
     pub(super) fn trait_to_def(&mut self, src: InFile<ast::Trait>) -> Option<TraitId> {
         self.to_def(src, keys::TRAIT)
     }
-    pub(super) fn impl_to_def(&mut self, src: InFile<ast::ImplDef>) -> Option<ImplId> {
+    pub(super) fn impl_to_def(&mut self, src: InFile<ast::Impl>) -> Option<ImplId> {
         self.to_def(src, keys::IMPL)
     }
     pub(super) fn fn_to_def(&mut self, src: InFile<ast::Fn>) -> Option<FunctionId> {
@@ -158,7 +158,7 @@ impl SourceToDefCtx<'_, '_> {
                         let def = self.trait_to_def(container.with_value(it))?;
                         def.into()
                     },
-                    ast::ImplDef(it) => {
+                    ast::Impl(it) => {
                         let def = self.impl_to_def(container.with_value(it))?;
                         def.into()
                     },
@@ -209,7 +209,7 @@ impl SourceToDefCtx<'_, '_> {
                     ast::Enum(it) => self.enum_to_def(container.with_value(it))?.into(),
                     ast::Trait(it) => self.trait_to_def(container.with_value(it))?.into(),
                     ast::TypeAlias(it) => self.type_alias_to_def(container.with_value(it))?.into(),
-                    ast::ImplDef(it) => self.impl_to_def(container.with_value(it))?.into(),
+                    ast::Impl(it) => self.impl_to_def(container.with_value(it))?.into(),
                     _ => continue,
                 }
             };
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs
index 0d0242173..78f6da5b8 100644
--- a/crates/ra_hir_def/src/body/lower.rs
+++ b/crates/ra_hir_def/src/body/lower.rs
@@ -669,7 +669,7 @@ impl ExprCollector<'_> {
                         (TraitLoc { container, id }.intern(self.db).into(), def.name())
                     }
                     ast::Item::ExternBlock(_) => return None, // FIXME: collect from extern blocks
-                    ast::Item::ImplDef(_)
+                    ast::Item::Impl(_)
                     | ast::Item::Use(_)
                     | ast::Item::ExternCrate(_)
                     | ast::Item::Module(_)
diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs
index 11002b1ad..63b56405c 100644
--- a/crates/ra_hir_def/src/item_tree.rs
+++ b/crates/ra_hir_def/src/item_tree.rs
@@ -420,7 +420,7 @@ mod_items! {
     Const in consts -> ast::Const,
     Static in statics -> ast::Static,
     Trait in traits -> ast::Trait,
-    Impl in impls -> ast::ImplDef,
+    Impl in impls -> ast::Impl,
     TypeAlias in type_aliases -> ast::TypeAlias,
     Mod in mods -> ast::Module,
     MacroCall in macro_calls -> ast::MacroCall,
@@ -581,7 +581,7 @@ pub struct Impl {
     pub target_type: TypeRef,
     pub is_negative: bool,
     pub items: Box<[AssocItem]>,
-    pub ast_id: FileAstId<ast::ImplDef>,
+    pub ast_id: FileAstId<ast::Impl>,
 }
 
 #[derive(Debug, Clone, PartialEq, Eq)]
diff --git a/crates/ra_hir_def/src/item_tree/lower.rs b/crates/ra_hir_def/src/item_tree/lower.rs
index aaf3cfd3a..b0cf94956 100644
--- a/crates/ra_hir_def/src/item_tree/lower.rs
+++ b/crates/ra_hir_def/src/item_tree/lower.rs
@@ -95,7 +95,7 @@ impl Ctx {
 
             // These are handled in their respective `lower_X` method (since we can't just blindly
             // walk them).
-            ast::Item::Trait(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {}
+            ast::Item::Trait(_) | ast::Item::Impl(_) | ast::Item::ExternBlock(_) => {}
 
             // These don't have inner items.
             ast::Item::Module(_) | ast::Item::ExternCrate(_) | ast::Item::Use(_) => {}
@@ -112,7 +112,7 @@ impl Ctx {
             ast::Item::Const(ast) => Some(self.lower_const(ast).into()),
             ast::Item::Module(ast) => self.lower_module(ast).map(Into::into),
             ast::Item::Trait(ast) => self.lower_trait(ast).map(Into::into),
-            ast::Item::ImplDef(ast) => self.lower_impl(ast).map(Into::into),
+            ast::Item::Impl(ast) => self.lower_impl(ast).map(Into::into),
             ast::Item::Use(ast) => Some(ModItems(
                 self.lower_use(ast).into_iter().map(Into::into).collect::<SmallVec<_>>(),
             )),
@@ -445,7 +445,7 @@ impl Ctx {
         Some(id(self.data().traits.alloc(res)))
     }
 
-    fn lower_impl(&mut self, impl_def: &ast::ImplDef) -> Option<FileItemTreeId<Impl>> {
+    fn lower_impl(&mut self, impl_def: &ast::Impl) -> Option<FileItemTreeId<Impl>> {
         let generic_params =
             self.lower_generic_params_and_inner_items(GenericsOwner::Impl, impl_def);
         let target_trait = impl_def.target_trait().map(|tr| self.lower_type_ref(&tr));
diff --git a/crates/ra_hir_def/src/item_tree/tests.rs b/crates/ra_hir_def/src/item_tree/tests.rs
index 40a9bd53d..a81497fa8 100644
--- a/crates/ra_hir_def/src/item_tree/tests.rs
+++ b/crates/ra_hir_def/src/item_tree/tests.rs
@@ -274,7 +274,7 @@ fn simple_inner_items() {
             inner attrs: Attrs { entries: None }
 
             top-level items:
-            Impl { generic_params: GenericParamsId(0), target_trait: Some(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("D"))] }, generic_args: [None] })), target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Response"))] }, generic_args: [Some(GenericArgs { args: [Type(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("T"))] }, generic_args: [None] }))], has_self_type: false, bindings: [] })] }), is_negative: false, items: [Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::ImplDef>(0) }
+            Impl { generic_params: GenericParamsId(0), target_trait: Some(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("D"))] }, generic_args: [None] })), target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Response"))] }, generic_args: [Some(GenericArgs { args: [Type(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("T"))] }, generic_args: [None] }))], has_self_type: false, bindings: [] })] }), is_negative: false, items: [Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Impl>(0) }
             > Function { name: Name(Text("foo")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(4294967295), has_self_param: false, is_unsafe: false, params: [], is_varargs: false, ret_type: Tuple([]), ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Fn>(1) }
 
             inner items:
@@ -353,7 +353,7 @@ fn impl_attrs() {
 
             top-level items:
             #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("impl_attr"))] }, input: None }]) }]
-            Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Ty"))] }, generic_args: [None] }), is_negative: false, items: [Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::ImplDef>(0) }
+            Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Ty"))] }, generic_args: [None] }), is_negative: false, items: [Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Impl>(0) }
             > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_a"))] }, input: None }]) }]
             > Function { name: Name(Text("a")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(4294967295), has_self_param: false, is_unsafe: false, params: [], is_varargs: false, ret_type: Tuple([]), ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Fn>(1) }
             > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_b"))] }, input: None }]) }]
@@ -432,7 +432,7 @@ fn assoc_item_macros() {
             inner attrs: Attrs { entries: None }
 
             top-level items:
-            Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("S"))] }, generic_args: [None] }), is_negative: false, items: [MacroCall(Idx::<MacroCall>(0))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::ImplDef>(0) }
+            Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("S"))] }, generic_args: [None] }), is_negative: false, items: [MacroCall(Idx::<MacroCall>(0))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Impl>(0) }
             > MacroCall { name: None, path: ModPath { kind: Plain, segments: [Name(Text("items"))] }, is_export: false, is_local_inner: false, is_builtin: false, ast_id: FileAstId::<ra_syntax::ast::generated::nodes::MacroCall>(1) }
         "#]],
     );
diff --git a/crates/ra_hir_def/src/keys.rs b/crates/ra_hir_def/src/keys.rs
index 0bed08875..441bdbead 100644
--- a/crates/ra_hir_def/src/keys.rs
+++ b/crates/ra_hir_def/src/keys.rs
@@ -18,7 +18,7 @@ pub const FUNCTION: Key<ast::Fn, FunctionId> = Key::new();
 pub const CONST: Key<ast::Const, ConstId> = Key::new();
 pub const STATIC: Key<ast::Static, StaticId> = Key::new();
 pub const TYPE_ALIAS: Key<ast::TypeAlias, TypeAliasId> = Key::new();
-pub const IMPL: Key<ast::ImplDef, ImplId> = Key::new();
+pub const IMPL: Key<ast::Impl, ImplId> = Key::new();
 pub const TRAIT: Key<ast::Trait, TraitId> = Key::new();
 pub const STRUCT: Key<ast::Struct, StructId> = Key::new();
 pub const UNION: Key<ast::Union, UnionId> = Key::new();
diff --git a/crates/ra_ide/src/completion/complete_trait_impl.rs b/crates/ra_ide/src/completion/complete_trait_impl.rs
index 87221d964..d9a0ef167 100644
--- a/crates/ra_ide/src/completion/complete_trait_impl.rs
+++ b/crates/ra_ide/src/completion/complete_trait_impl.rs
@@ -3,7 +3,7 @@
 //! This module adds the completion items related to implementing associated
 //! items within a `impl Trait for Struct` block. The current context node
 //! must be within either a `FN`, `TYPE_ALIAS`, or `CONST` node
-//! and an direct child of an `IMPL_DEF`.
+//! and an direct child of an `IMPL`.
 //!
 //! # Examples
 //!
@@ -34,7 +34,7 @@
 use hir::{self, Docs, HasSource};
 use ra_assists::utils::get_missing_assoc_items;
 use ra_syntax::{
-    ast::{self, edit, ImplDef},
+    ast::{self, edit, Impl},
     AstNode, SyntaxKind, SyntaxNode, TextRange, T,
 };
 use ra_text_edit::TextEdit;
@@ -104,7 +104,7 @@ pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext
     }
 }
 
-fn completion_match(ctx: &CompletionContext) -> Option<(SyntaxNode, ImplDef)> {
+fn completion_match(ctx: &CompletionContext) -> Option<(SyntaxNode, Impl)> {
     let (trigger, impl_def_offset) = ctx.token.ancestors().find_map(|p| match p.kind() {
         SyntaxKind::FN | SyntaxKind::TYPE_ALIAS | SyntaxKind::CONST | SyntaxKind::BLOCK_EXPR => {
             Some((p, 2))
@@ -114,7 +114,7 @@ fn completion_match(ctx: &CompletionContext) -> Option<(SyntaxNode, ImplDef)> {
     })?;
     let impl_def = (0..impl_def_offset - 1)
         .try_fold(trigger.parent()?, |t, _| t.parent())
-        .and_then(ast::ImplDef::cast)?;
+        .and_then(ast::Impl::cast)?;
     Some((trigger, impl_def))
 }
 
diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs
index c8704eb3e..2113abbb2 100644
--- a/crates/ra_ide/src/completion/completion_context.rs
+++ b/crates/ra_ide/src/completion/completion_context.rs
@@ -40,7 +40,7 @@ pub(crate) struct CompletionContext<'a> {
     pub(super) record_lit_syntax: Option<ast::RecordExpr>,
     pub(super) record_pat_syntax: Option<ast::RecordPat>,
     pub(super) record_field_syntax: Option<ast::RecordExprField>,
-    pub(super) impl_def: Option<ast::ImplDef>,
+    pub(super) impl_def: Option<ast::Impl>,
     /// FIXME: `ActiveParameter` is string-based, which is very very wrong
     pub(super) active_parameter: Option<ActiveParameter>,
     pub(super) is_param: bool,
@@ -325,7 +325,7 @@ impl<'a> CompletionContext<'a> {
             .sema
             .ancestors_with_macros(self.token.parent())
             .take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE)
-            .find_map(ast::ImplDef::cast);
+            .find_map(ast::Impl::cast);
 
         let top_node = name_ref
             .syntax()
diff --git a/crates/ra_ide/src/completion/patterns.rs b/crates/ra_ide/src/completion/patterns.rs
index 6c11f5830..a68861e1c 100644
--- a/crates/ra_ide/src/completion/patterns.rs
+++ b/crates/ra_ide/src/completion/patterns.rs
@@ -27,7 +27,7 @@ pub(crate) fn has_impl_parent(element: SyntaxElement) -> bool {
     not_same_range_ancestor(element)
         .filter(|it| it.kind() == ASSOC_ITEM_LIST)
         .and_then(|it| it.parent())
-        .filter(|it| it.kind() == IMPL_DEF)
+        .filter(|it| it.kind() == IMPL)
         .is_some()
 }
 #[test]
@@ -121,7 +121,7 @@ fn test_has_trait_as_prev_sibling() {
 }
 
 pub(crate) fn has_impl_as_prev_sibling(element: SyntaxElement) -> bool {
-    previous_sibling_or_ancestor_sibling(element).filter(|it| it.kind() == IMPL_DEF).is_some()
+    previous_sibling_or_ancestor_sibling(element).filter(|it| it.kind() == IMPL).is_some()
 }
 #[test]
 fn test_has_impl_as_prev_sibling() {
diff --git a/crates/ra_ide/src/file_structure.rs b/crates/ra_ide/src/file_structure.rs
index 3fc972460..7d378f2d0 100644
--- a/crates/ra_ide/src/file_structure.rs
+++ b/crates/ra_ide/src/file_structure.rs
@@ -139,7 +139,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
             ast::RecordField(it) => decl_with_ascription(it),
             ast::Const(it) => decl_with_ascription(it),
             ast::Static(it) => decl_with_ascription(it),
-            ast::ImplDef(it) => {
+            ast::Impl(it) => {
                 let target_type = it.target_type()?;
                 let target_trait = it.target_trait();
                 let label = match target_trait {
@@ -372,7 +372,7 @@ fn very_obsolete() {}
                         label: "impl E",
                         navigation_range: 239..240,
                         node_range: 234..243,
-                        kind: IMPL_DEF,
+                        kind: IMPL,
                         detail: None,
                         deprecated: false,
                     },
@@ -381,7 +381,7 @@ fn very_obsolete() {}
                         label: "impl fmt::Debug for E",
                         navigation_range: 265..266,
                         node_range: 245..269,
-                        kind: IMPL_DEF,
+                        kind: IMPL,
                         detail: None,
                         deprecated: false,
                     },
diff --git a/crates/ra_ide/src/references/rename.rs b/crates/ra_ide/src/references/rename.rs
index d8ffb8c84..d330109f1 100644
--- a/crates/ra_ide/src/references/rename.rs
+++ b/crates/ra_ide/src/references/rename.rs
@@ -192,15 +192,14 @@ fn text_edit_from_self_param(
     self_param: &ast::SelfParam,
     new_name: &str,
 ) -> Option<TextEdit> {
-    fn target_type_name(impl_def: &ast::ImplDef) -> Option<String> {
+    fn target_type_name(impl_def: &ast::Impl) -> Option<String> {
         if let Some(ast::TypeRef::PathType(p)) = impl_def.target_type() {
             return Some(p.path()?.segment()?.name_ref()?.text().to_string());
         }
         None
     }
 
-    let impl_def =
-        find_node_at_offset::<ast::ImplDef>(syn, self_param.syntax().text_range().start())?;
+    let impl_def = find_node_at_offset::<ast::Impl>(syn, self_param.syntax().text_range().start())?;
     let type_name = target_type_name(&impl_def)?;
 
     let mut replacement_text = String::from(new_name);
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs
index a66453c04..e3a96f9d5 100644
--- a/crates/ra_ide/src/syntax_highlighting.rs
+++ b/crates/ra_ide/src/syntax_highlighting.rs
@@ -647,7 +647,7 @@ fn highlight_element(
 
 fn is_child_of_impl(element: &SyntaxElement) -> bool {
     match element.parent() {
-        Some(e) => e.kind() == IMPL_DEF,
+        Some(e) => e.kind() == IMPL,
         _ => false,
     }
 }
diff --git a/crates/ra_parser/src/grammar.rs b/crates/ra_parser/src/grammar.rs
index cd4b2381d..c2e1d701e 100644
--- a/crates/ra_parser/src/grammar.rs
+++ b/crates/ra_parser/src/grammar.rs
@@ -150,7 +150,7 @@ pub(crate) fn reparser(
         EXTERN_ITEM_LIST => items::extern_item_list,
         TOKEN_TREE if first_child? == T!['{'] => items::token_tree,
         ASSOC_ITEM_LIST => match parent? {
-            IMPL_DEF => items::impl_item_list,
+            IMPL => items::impl_item_list,
             TRAIT => items::trait_item_list,
             _ => return None,
         },
diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs
index 5603d61a9..cca524cea 100644
--- a/crates/ra_parser/src/grammar/items.rs
+++ b/crates/ra_parser/src/grammar/items.rs
@@ -221,7 +221,7 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         // unsafe default impl Foo {}
         T![impl] => {
             traits::impl_def(p);
-            m.complete(p, IMPL_DEF);
+            m.complete(p, IMPL);
         }
 
         // test existential_type
diff --git a/crates/ra_parser/src/syntax_kind/generated.rs b/crates/ra_parser/src/syntax_kind/generated.rs
index 27eed0090..d1b22f08a 100644
--- a/crates/ra_parser/src/syntax_kind/generated.rs
+++ b/crates/ra_parser/src/syntax_kind/generated.rs
@@ -134,7 +134,7 @@ pub enum SyntaxKind {
     STATIC,
     CONST,
     TRAIT,
-    IMPL_DEF,
+    IMPL,
     TYPE_ALIAS,
     MACRO_CALL,
     TOKEN_TREE,
diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs
index 3adb6b2d4..ba00742f0 100644
--- a/crates/ra_syntax/src/ast/generated/nodes.rs
+++ b/crates/ra_syntax/src/ast/generated/nodes.rs
@@ -100,17 +100,18 @@ impl Fn {
     pub fn semicolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![;]) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ImplDef {
+pub struct Impl {
     pub(crate) syntax: SyntaxNode,
 }
-impl ast::AttrsOwner for ImplDef {}
-impl ast::VisibilityOwner for ImplDef {}
-impl ast::GenericParamsOwner for ImplDef {}
-impl ImplDef {
-    pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
+impl ast::AttrsOwner for Impl {}
+impl ast::VisibilityOwner for Impl {}
+impl ast::GenericParamsOwner for Impl {}
+impl Impl {
     pub fn default_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![default]) }
     pub fn unsafe_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![unsafe]) }
     pub fn impl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![impl]) }
+    pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
+    pub fn type_ref(&self) -> Option<TypeRef> { support::child(&self.syntax) }
     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 assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
@@ -1278,7 +1279,7 @@ pub enum Item {
     ExternBlock(ExternBlock),
     ExternCrate(ExternCrate),
     Fn(Fn),
-    ImplDef(ImplDef),
+    Impl(Impl),
     MacroCall(MacroCall),
     Module(Module),
     Static(Static),
@@ -1477,8 +1478,8 @@ impl AstNode for Fn {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
-impl AstNode for ImplDef {
-    fn can_cast(kind: SyntaxKind) -> bool { kind == IMPL_DEF }
+impl AstNode for Impl {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == IMPL }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
         if Self::can_cast(syntax.kind()) {
             Some(Self { syntax })
@@ -2790,8 +2791,8 @@ impl From<ExternCrate> for Item {
 impl From<Fn> for Item {
     fn from(node: Fn) -> Item { Item::Fn(node) }
 }
-impl From<ImplDef> for Item {
-    fn from(node: ImplDef) -> Item { Item::ImplDef(node) }
+impl From<Impl> for Item {
+    fn from(node: Impl) -> Item { Item::Impl(node) }
 }
 impl From<MacroCall> for Item {
     fn from(node: MacroCall) -> Item { Item::MacroCall(node) }
@@ -2820,7 +2821,7 @@ impl From<Use> for Item {
 impl AstNode for Item {
     fn can_cast(kind: SyntaxKind) -> bool {
         match kind {
-            CONST | ENUM | EXTERN_BLOCK | EXTERN_CRATE | FN | IMPL_DEF | MACRO_CALL | MODULE
+            CONST | ENUM | EXTERN_BLOCK | EXTERN_CRATE | FN | IMPL | MACRO_CALL | MODULE
             | STATIC | STRUCT | TRAIT | TYPE_ALIAS | UNION | USE => true,
             _ => false,
         }
@@ -2832,7 +2833,7 @@ impl AstNode for Item {
             EXTERN_BLOCK => Item::ExternBlock(ExternBlock { syntax }),
             EXTERN_CRATE => Item::ExternCrate(ExternCrate { syntax }),
             FN => Item::Fn(Fn { syntax }),
-            IMPL_DEF => Item::ImplDef(ImplDef { syntax }),
+            IMPL => Item::Impl(Impl { syntax }),
             MACRO_CALL => Item::MacroCall(MacroCall { syntax }),
             MODULE => Item::Module(Module { syntax }),
             STATIC => Item::Static(Static { syntax }),
@@ -2852,7 +2853,7 @@ impl AstNode for Item {
             Item::ExternBlock(it) => &it.syntax,
             Item::ExternCrate(it) => &it.syntax,
             Item::Fn(it) => &it.syntax,
-            Item::ImplDef(it) => &it.syntax,
+            Item::Impl(it) => &it.syntax,
             Item::MacroCall(it) => &it.syntax,
             Item::Module(it) => &it.syntax,
             Item::Static(it) => &it.syntax,
@@ -3491,7 +3492,7 @@ impl std::fmt::Display for Fn {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
-impl std::fmt::Display for ImplDef {
+impl std::fmt::Display for Impl {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
     }
diff --git a/crates/ra_syntax/src/ast/node_ext.rs b/crates/ra_syntax/src/ast/node_ext.rs
index a8d8955de..313f52226 100644
--- a/crates/ra_syntax/src/ast/node_ext.rs
+++ b/crates/ra_syntax/src/ast/node_ext.rs
@@ -141,7 +141,7 @@ impl ast::UseTreeList {
     }
 }
 
-impl ast::ImplDef {
+impl ast::Impl {
     pub fn target_type(&self) -> Option<ast::TypeRef> {
         match self.target() {
             (Some(t), None) | (_, Some(t)) => Some(t),
@@ -486,5 +486,5 @@ impl ast::DocCommentsOwner for ast::Module {}
 impl ast::DocCommentsOwner for ast::Static {}
 impl ast::DocCommentsOwner for ast::Const {}
 impl ast::DocCommentsOwner for ast::TypeAlias {}
-impl ast::DocCommentsOwner for ast::ImplDef {}
+impl ast::DocCommentsOwner for ast::Impl {}
 impl ast::DocCommentsOwner for ast::MacroCall {}
diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs
index a666b18db..0325ab0b4 100644
--- a/crates/ra_syntax/src/validation.rs
+++ b/crates/ra_syntax/src/validation.rs
@@ -204,7 +204,7 @@ fn validate_visibility(vis: ast::Visibility, errors: &mut Vec<SyntaxError>) {
         _ => return,
     }
 
-    let impl_def = match parent.parent().and_then(|it| it.parent()).and_then(ast::ImplDef::cast) {
+    let impl_def = match parent.parent().and_then(|it| it.parent()).and_then(ast::Impl::cast) {
         Some(it) => it,
         None => return,
     };
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 1ce5f188f..bc95b8512 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..183
-  IMPL_DEF@0..182
+  IMPL@0..182
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..13
diff --git a/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast b/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast
index a6e304b78..71fb19783 100644
--- a/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast
+++ b/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.rast
@@ -75,7 +75,7 @@ SOURCE_FILE@0..112
         ERROR@54..55
           COMMA@54..55 ","
       WHITESPACE@55..56 " "
-      IMPL_DEF@56..60
+      IMPL@56..60
         IMPL_KW@56..60 "impl"
       EXPR_STMT@60..61
         ERROR@60..61
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 8c8bf7b7e..7e4b11c27 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..38
-  IMPL_DEF@0..14
+  IMPL@0..14
     IMPL_KW@0..4 "impl"
     GENERIC_PARAM_LIST@4..14
       L_ANGLE@4..5 "<"
@@ -17,7 +17,7 @@ SOURCE_FILE@0..38
                     IDENT@8..13 "Clone"
       R_ANGLE@13..14 ">"
   WHITESPACE@14..15 "\n"
-  IMPL_DEF@15..37
+  IMPL@15..37
     IMPL_KW@15..19 "impl"
     GENERIC_PARAM_LIST@19..22
       L_ANGLE@19..20 "<"
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 b1400aa5f..faf87d6e5 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..118
-  IMPL_DEF@0..117
+  IMPL@0..117
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast b/crates/ra_syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
index 8b0a888fd..a4271fc87 100644
--- a/crates/ra_syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
+++ b/crates/ra_syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
@@ -17,7 +17,7 @@ SOURCE_FILE@0..30
             LIFETIME@16..21 "\'loop"
             COLON@21..22 ":"
       WHITESPACE@22..23 " "
-      IMPL_DEF@23..27
+      IMPL@23..27
         IMPL_KW@23..27 "impl"
       WHITESPACE@27..28 "\n"
       R_CURLY@28..29 "}"
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 2d0253aa0..29d6b3974 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..87
-  IMPL_DEF@0..12
+  IMPL@0..12
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..9
@@ -12,7 +12,7 @@ SOURCE_FILE@0..87
       L_CURLY@10..11 "{"
       R_CURLY@11..12 "}"
   WHITESPACE@12..13 "\n"
-  IMPL_DEF@13..33
+  IMPL@13..33
     IMPL_KW@13..17 "impl"
     WHITESPACE@17..18 " "
     PATH_TYPE@18..24
@@ -33,10 +33,10 @@ SOURCE_FILE@0..87
       L_CURLY@31..32 "{"
       R_CURLY@32..33 "}"
   WHITESPACE@33..34 "\n"
-  IMPL_DEF@34..38
+  IMPL@34..38
     IMPL_KW@34..38 "impl"
   WHITESPACE@38..39 " "
-  IMPL_DEF@39..54
+  IMPL@39..54
     IMPL_KW@39..43 "impl"
     WHITESPACE@43..44 " "
     PATH_TYPE@44..51
@@ -49,7 +49,7 @@ SOURCE_FILE@0..87
       L_CURLY@52..53 "{"
       R_CURLY@53..54 "}"
   WHITESPACE@54..55 "\n"
-  IMPL_DEF@55..70
+  IMPL@55..70
     IMPL_KW@55..59 "impl"
     WHITESPACE@59..60 " "
     PATH_TYPE@60..66
@@ -60,7 +60,7 @@ SOURCE_FILE@0..87
     WHITESPACE@66..67 " "
     FOR_KW@67..70 "for"
   WHITESPACE@70..71 " "
-  IMPL_DEF@71..86
+  IMPL@71..86
     IMPL_KW@71..75 "impl"
     WHITESPACE@75..76 " "
     PATH_TYPE@76..83
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 955e00dde..c7289e400 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..83
-  IMPL_DEF@0..82
+  IMPL@0..82
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
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 87c170707..ae61cbad8 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..128
-  IMPL_DEF@0..127
+  IMPL@0..127
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
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 e75180900..20b2b6c19 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..69
-  IMPL_DEF@0..68
+  IMPL@0..68
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
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 52181ca0c..ca0702aba 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..89
-  IMPL_DEF@0..88
+  IMPL@0..88
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
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 8a6b5a8fc..d6dfa83b7 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..27
-  IMPL_DEF@0..26
+  IMPL@0..26
     UNSAFE_KW@0..6 "unsafe"
     WHITESPACE@6..7 " "
     DEFAULT_KW@7..14 "default"
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 31178f86e..4368930cc 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..20
-  IMPL_DEF@0..19
+  IMPL@0..19
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     BANG@5..6 "!"
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 26825ef86..209711fc4 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..12
-  IMPL_DEF@0..11
+  IMPL@0..11
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..8
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 e3223cee5..43c09affe 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..19
-  IMPL_DEF@0..18
+  IMPL@0..18
     UNSAFE_KW@0..6 "unsafe"
     WHITESPACE@6..7 " "
     IMPL_KW@7..11 "impl"
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 8a839a4a6..0a1b21d6e 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..20
-  IMPL_DEF@0..19
+  IMPL@0..19
     DEFAULT_KW@0..7 "default"
     WHITESPACE@7..8 " "
     IMPL_KW@8..12 "impl"
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 f2561abd6..141a7b203 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
@@ -8,7 +8,7 @@ SOURCE_FILE@0..94
       L_CURLY@6..7 "{"
       R_CURLY@7..8 "}"
   WHITESPACE@8..9 "\n"
-  IMPL_DEF@9..93
+  IMPL@9..93
     IMPL_KW@9..13 "impl"
     WHITESPACE@13..14 " "
     PATH_TYPE@14..15
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 de02238df..b8d26a53a 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..69
-  IMPL_DEF@0..68
+  IMPL@0..68
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
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 07e555d63..8f197a19d 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..29
-  IMPL_DEF@0..28
+  IMPL@0..28
     IMPL_KW@0..4 "impl"
     GENERIC_PARAM_LIST@4..18
       L_ANGLE@4..5 "<"
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 680f35445..1269621dc 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..50
-  IMPL_DEF@0..49
+  IMPL@0..49
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
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 e0c338297..6bfe925af 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..27
-  IMPL_DEF@0..26
+  IMPL@0..26
     DEFAULT_KW@0..7 "default"
     WHITESPACE@7..8 " "
     UNSAFE_KW@8..14 "unsafe"
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 c4ffc0a3d..ed29b0812 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
@@ -8,7 +8,7 @@ SOURCE_FILE@0..199
       IDENT@69..72 "Foo"
     SEMICOLON@72..73 ";"
   WHITESPACE@73..75 "\n\n"
-  IMPL_DEF@75..141
+  IMPL@75..141
     IMPL_KW@75..79 "impl"
     WHITESPACE@79..80 " "
     PATH_TYPE@80..83
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 5ebc53618..139ce9046 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
@@ -89,7 +89,7 @@ SOURCE_FILE@0..686
   WHITESPACE@461..463 "\n\n"
   COMMENT@463..523 "// https://github.com ..."
   WHITESPACE@523..524 "\n"
-  IMPL_DEF@524..685
+  IMPL@524..685
     IMPL_KW@524..528 "impl"
     WHITESPACE@528..529 " "
     PATH_TYPE@529..537
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 7a574ebb4..2cc849784 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
@@ -251,7 +251,7 @@ SOURCE_FILE@0..519
       WHITESPACE@234..235 "\n"
       R_CURLY@235..236 "}"
   WHITESPACE@236..238 "\n\n"
-  IMPL_DEF@238..519
+  IMPL@238..519
     IMPL_KW@238..242 "impl"
     WHITESPACE@242..243 " "
     PATH_TYPE@243..244
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 ef0eca47c..453757c3c 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..137
-  IMPL_DEF@0..136
+  IMPL@0..136
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
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 485efe20c..6246a31a6 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
@@ -1,5 +1,5 @@
 SOURCE_FILE@0..46
-  IMPL_DEF@0..45
+  IMPL@0..45
     IMPL_KW@0..4 "impl"
     WHITESPACE@4..5 " "
     PATH_TYPE@5..6
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs
index 3889ebed1..fadcc5853 100644
--- a/crates/rust-analyzer/src/to_proto.rs
+++ b/crates/rust-analyzer/src/to_proto.rs
@@ -42,7 +42,7 @@ pub(crate) fn symbol_kind(syntax_kind: SyntaxKind) -> lsp_types::SymbolKind {
         SyntaxKind::RECORD_FIELD => lsp_types::SymbolKind::Field,
         SyntaxKind::STATIC => lsp_types::SymbolKind::Constant,
         SyntaxKind::CONST => lsp_types::SymbolKind::Constant,
-        SyntaxKind::IMPL_DEF => lsp_types::SymbolKind::Object,
+        SyntaxKind::IMPL => lsp_types::SymbolKind::Object,
         _ => lsp_types::SymbolKind::Variable,
     }
 }
diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs
index ea8bf50ed..c7087a14e 100644
--- a/xtask/src/ast_src.rs
+++ b/xtask/src/ast_src.rs
@@ -104,7 +104,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
         "STATIC",
         "CONST",
         "TRAIT",
-        "IMPL_DEF",
+        "IMPL",
         "TYPE_ALIAS",
         "MACRO_CALL",
         "TOKEN_TREE",
diff --git a/xtask/src/codegen/rust.ungram b/xtask/src/codegen/rust.ungram
index b30658397..cda0e8fbb 100644
--- a/xtask/src/codegen/rust.ungram
+++ b/xtask/src/codegen/rust.ungram
@@ -9,7 +9,7 @@ Item =
 | ExternBlock
 | ExternCrate
 | Fn
-| ImplDef
+| Impl
 | MacroCall
 | Module
 | Static
@@ -131,9 +131,12 @@ Trait =
 AssocItemList =
   '{' AssocItem* '}'
 
-ImplDef =
- Attr* Visibility? 'const'? 'default'? 'unsafe'? 'impl' GenericParamList? '!'? 'for'
- WhereClause?
+Impl =
+ Attr* Visibility?
+ 'default'? 'unsafe'? 'impl' 'const'? GenericParamList? (
+   TypeRef
+ | '!'? TypeRef 'for' TypeRef
+ ) WhereClause?
  AssocItemList
 
 ParenType =
-- 
cgit v1.2.3