aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-07-30 12:30:00 +0100
committerGitHub <[email protected]>2020-07-30 12:30:00 +0100
commitbe803efb7c7ba257716fcc97c57ecfd07e278b07 (patch)
tree7618dd660346f62715e908355e51917c0b70f914
parent570fdf26c90758c04b90fadfe1b0e6ee684c6dbe (diff)
parent96313283cd6cb7732ad4f6498f938dcd428d1864 (diff)
Merge #5585
5585: Finish extern crate grammar r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
-rw-r--r--crates/ra_hir_def/src/body/lower.rs2
-rw-r--r--crates/ra_hir_def/src/item_tree.rs4
-rw-r--r--crates/ra_hir_def/src/item_tree/lower.rs6
-rw-r--r--crates/ra_hir_def/src/item_tree/tests.rs2
-rw-r--r--crates/ra_parser/src/grammar/items.rs2
-rw-r--r--crates/ra_parser/src/syntax_kind/generated.rs2
-rw-r--r--crates/ra_syntax/src/ast/generated/nodes.rs124
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0060_extern_crate.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0007_extern_crate.rast6
-rw-r--r--xtask/src/ast_src.rs2
-rw-r--r--xtask/src/codegen/rust.ungram8
11 files changed, 80 insertions, 80 deletions
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs
index c33b645f3..bfd574c5d 100644
--- a/crates/ra_hir_def/src/body/lower.rs
+++ b/crates/ra_hir_def/src/body/lower.rs
@@ -671,7 +671,7 @@ impl ExprCollector<'_> {
671 ast::Item::ExternBlock(_) => return None, // FIXME: collect from extern blocks 671 ast::Item::ExternBlock(_) => return None, // FIXME: collect from extern blocks
672 ast::Item::ImplDef(_) 672 ast::Item::ImplDef(_)
673 | ast::Item::UseItem(_) 673 | ast::Item::UseItem(_)
674 | ast::Item::ExternCrateItem(_) 674 | ast::Item::ExternCrate(_)
675 | ast::Item::Module(_) 675 | ast::Item::Module(_)
676 | ast::Item::MacroCall(_) => return None, 676 | ast::Item::MacroCall(_) => return None,
677 }; 677 };
diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs
index 615c1e14c..4db7b2793 100644
--- a/crates/ra_hir_def/src/item_tree.rs
+++ b/crates/ra_hir_def/src/item_tree.rs
@@ -412,7 +412,7 @@ macro_rules! mod_items {
412 412
413mod_items! { 413mod_items! {
414 Import in imports -> ast::UseItem, 414 Import in imports -> ast::UseItem,
415 ExternCrate in extern_crates -> ast::ExternCrateItem, 415 ExternCrate in extern_crates -> ast::ExternCrate,
416 Function in functions -> ast::FnDef, 416 Function in functions -> ast::FnDef,
417 Struct in structs -> ast::StructDef, 417 Struct in structs -> ast::StructDef,
418 Union in unions -> ast::UnionDef, 418 Union in unions -> ast::UnionDef,
@@ -492,7 +492,7 @@ pub struct ExternCrate {
492 pub visibility: RawVisibilityId, 492 pub visibility: RawVisibilityId,
493 /// Whether this is a `#[macro_use] extern crate ...`. 493 /// Whether this is a `#[macro_use] extern crate ...`.
494 pub is_macro_use: bool, 494 pub is_macro_use: bool,
495 pub ast_id: FileAstId<ast::ExternCrateItem>, 495 pub ast_id: FileAstId<ast::ExternCrate>,
496} 496}
497 497
498#[derive(Debug, Clone, Eq, PartialEq)] 498#[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 6c58c6378..8a36de311 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 {
95 ast::Item::TraitDef(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {} 95 ast::Item::TraitDef(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {}
96 96
97 // These don't have inner items. 97 // These don't have inner items.
98 ast::Item::Module(_) | ast::Item::ExternCrateItem(_) | ast::Item::UseItem(_) => {} 98 ast::Item::Module(_) | ast::Item::ExternCrate(_) | ast::Item::UseItem(_) => {}
99 }; 99 };
100 100
101 let attrs = Attrs::new(item, &self.hygiene); 101 let attrs = Attrs::new(item, &self.hygiene);
@@ -113,7 +113,7 @@ impl Ctx {
113 ast::Item::UseItem(ast) => Some(ModItems( 113 ast::Item::UseItem(ast) => Some(ModItems(
114 self.lower_use(ast).into_iter().map(Into::into).collect::<SmallVec<_>>(), 114 self.lower_use(ast).into_iter().map(Into::into).collect::<SmallVec<_>>(),
115 )), 115 )),
116 ast::Item::ExternCrateItem(ast) => self.lower_extern_crate(ast).map(Into::into), 116 ast::Item::ExternCrate(ast) => self.lower_extern_crate(ast).map(Into::into),
117 ast::Item::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into), 117 ast::Item::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into),
118 ast::Item::ExternBlock(ast) => { 118 ast::Item::ExternBlock(ast) => {
119 Some(ModItems(self.lower_extern_block(ast).into_iter().collect::<SmallVec<_>>())) 119 Some(ModItems(self.lower_extern_block(ast).into_iter().collect::<SmallVec<_>>()))
@@ -498,7 +498,7 @@ impl Ctx {
498 498
499 fn lower_extern_crate( 499 fn lower_extern_crate(
500 &mut self, 500 &mut self,
501 extern_crate: &ast::ExternCrateItem, 501 extern_crate: &ast::ExternCrate,
502 ) -> Option<FileItemTreeId<ExternCrate>> { 502 ) -> Option<FileItemTreeId<ExternCrate>> {
503 let path = ModPath::from_name_ref(&extern_crate.name_ref()?); 503 let path = ModPath::from_name_ref(&extern_crate.name_ref()?);
504 let alias = extern_crate.rename().map(|a| { 504 let alias = extern_crate.rename().map(|a| {
diff --git a/crates/ra_hir_def/src/item_tree/tests.rs b/crates/ra_hir_def/src/item_tree/tests.rs
index a6057ceab..68be1cb40 100644
--- a/crates/ra_hir_def/src/item_tree/tests.rs
+++ b/crates/ra_hir_def/src/item_tree/tests.rs
@@ -232,7 +232,7 @@ fn smoke() {
232 #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_on_use"))] }, input: None }]) }] 232 #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_on_use"))] }, input: None }]) }]
233 Import { path: ModPath { kind: Plain, segments: [Name(Text("b"))] }, alias: None, visibility: RawVisibilityId("pub(self)"), is_glob: true, is_prelude: false, ast_id: FileAstId::<ra_syntax::ast::generated::nodes::UseItem>(0) } 233 Import { path: ModPath { kind: Plain, segments: [Name(Text("b"))] }, alias: None, visibility: RawVisibilityId("pub(self)"), is_glob: true, is_prelude: false, ast_id: FileAstId::<ra_syntax::ast::generated::nodes::UseItem>(0) }
234 #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("ext_crate"))] }, input: None }]) }] 234 #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("ext_crate"))] }, input: None }]) }]
235 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::ExternCrateItem>(1) } 235 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) }
236 #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("on_trait"))] }, input: None }]) }] 236 #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("on_trait"))] }, input: None }]) }]
237 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) } 237 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) }
238 > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("assoc_ty"))] }, input: None }]) }] 238 > #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("assoc_ty"))] }, input: None }]) }]
diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs
index ffcdaaa99..3b73e5346 100644
--- a/crates/ra_parser/src/grammar/items.rs
+++ b/crates/ra_parser/src/grammar/items.rs
@@ -313,7 +313,7 @@ fn extern_crate_item(p: &mut Parser, m: Marker) {
313 313
314 opt_alias(p); 314 opt_alias(p);
315 p.expect(T![;]); 315 p.expect(T![;]);
316 m.complete(p, EXTERN_CRATE_ITEM); 316 m.complete(p, EXTERN_CRATE);
317} 317}
318 318
319pub(crate) fn extern_item_list(p: &mut Parser) { 319pub(crate) fn extern_item_list(p: &mut Parser) {
diff --git a/crates/ra_parser/src/syntax_kind/generated.rs b/crates/ra_parser/src/syntax_kind/generated.rs
index f14b60b65..116b58858 100644
--- a/crates/ra_parser/src/syntax_kind/generated.rs
+++ b/crates/ra_parser/src/syntax_kind/generated.rs
@@ -128,7 +128,7 @@ pub enum SyntaxKind {
128 ENUM_DEF, 128 ENUM_DEF,
129 FN_DEF, 129 FN_DEF,
130 RET_TYPE, 130 RET_TYPE,
131 EXTERN_CRATE_ITEM, 131 EXTERN_CRATE,
132 MODULE, 132 MODULE,
133 USE_ITEM, 133 USE_ITEM,
134 STATIC_DEF, 134 STATIC_DEF,
diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs
index 01e8111b0..3fd761367 100644
--- a/crates/ra_syntax/src/ast/generated/nodes.rs
+++ b/crates/ra_syntax/src/ast/generated/nodes.rs
@@ -65,12 +65,12 @@ impl ExternBlock {
65 pub fn extern_item_list(&self) -> Option<ExternItemList> { support::child(&self.syntax) } 65 pub fn extern_item_list(&self) -> Option<ExternItemList> { support::child(&self.syntax) }
66} 66}
67#[derive(Debug, Clone, PartialEq, Eq, Hash)] 67#[derive(Debug, Clone, PartialEq, Eq, Hash)]
68pub struct ExternCrateItem { 68pub struct ExternCrate {
69 pub(crate) syntax: SyntaxNode, 69 pub(crate) syntax: SyntaxNode,
70} 70}
71impl ast::AttrsOwner for ExternCrateItem {} 71impl ast::AttrsOwner for ExternCrate {}
72impl ast::VisibilityOwner for ExternCrateItem {} 72impl ast::VisibilityOwner for ExternCrate {}
73impl ExternCrateItem { 73impl ExternCrate {
74 pub fn extern_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![extern]) } 74 pub fn extern_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![extern]) }
75 pub fn crate_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![crate]) } 75 pub fn crate_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![crate]) }
76 pub fn name_ref(&self) -> Option<NameRef> { support::child(&self.syntax) } 76 pub fn name_ref(&self) -> Option<NameRef> { support::child(&self.syntax) }
@@ -255,6 +255,21 @@ impl ItemList {
255 pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) } 255 pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
256} 256}
257#[derive(Debug, Clone, PartialEq, Eq, Hash)] 257#[derive(Debug, Clone, PartialEq, Eq, Hash)]
258pub struct NameRef {
259 pub(crate) syntax: SyntaxNode,
260}
261impl NameRef {
262 pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
263}
264#[derive(Debug, Clone, PartialEq, Eq, Hash)]
265pub struct Rename {
266 pub(crate) syntax: SyntaxNode,
267}
268impl ast::NameOwner for Rename {}
269impl Rename {
270 pub fn as_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![as]) }
271}
272#[derive(Debug, Clone, PartialEq, Eq, Hash)]
258pub struct Abi { 273pub struct Abi {
259 pub(crate) syntax: SyntaxNode, 274 pub(crate) syntax: SyntaxNode,
260} 275}
@@ -699,13 +714,6 @@ impl MethodCallExpr {
699 pub fn type_arg_list(&self) -> Option<TypeArgList> { support::child(&self.syntax) } 714 pub fn type_arg_list(&self) -> Option<TypeArgList> { support::child(&self.syntax) }
700} 715}
701#[derive(Debug, Clone, PartialEq, Eq, Hash)] 716#[derive(Debug, Clone, PartialEq, Eq, Hash)]
702pub struct NameRef {
703 pub(crate) syntax: SyntaxNode,
704}
705impl NameRef {
706 pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
707}
708#[derive(Debug, Clone, PartialEq, Eq, Hash)]
709pub struct TypeArgList { 717pub struct TypeArgList {
710 pub(crate) syntax: SyntaxNode, 718 pub(crate) syntax: SyntaxNode,
711} 719}
@@ -1190,14 +1198,6 @@ impl UseTreeList {
1190 pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) } 1198 pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
1191} 1199}
1192#[derive(Debug, Clone, PartialEq, Eq, Hash)] 1200#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1193pub struct Rename {
1194 pub(crate) syntax: SyntaxNode,
1195}
1196impl ast::NameOwner for Rename {}
1197impl Rename {
1198 pub fn as_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![as]) }
1199}
1200#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1201pub struct PathSegment { 1201pub struct PathSegment {
1202 pub(crate) syntax: SyntaxNode, 1202 pub(crate) syntax: SyntaxNode,
1203} 1203}
@@ -1272,7 +1272,7 @@ pub enum Item {
1272 ConstDef(ConstDef), 1272 ConstDef(ConstDef),
1273 EnumDef(EnumDef), 1273 EnumDef(EnumDef),
1274 ExternBlock(ExternBlock), 1274 ExternBlock(ExternBlock),
1275 ExternCrateItem(ExternCrateItem), 1275 ExternCrate(ExternCrate),
1276 FnDef(FnDef), 1276 FnDef(FnDef),
1277 ImplDef(ImplDef), 1277 ImplDef(ImplDef),
1278 MacroCall(MacroCall), 1278 MacroCall(MacroCall),
@@ -1451,8 +1451,8 @@ impl AstNode for ExternBlock {
1451 } 1451 }
1452 fn syntax(&self) -> &SyntaxNode { &self.syntax } 1452 fn syntax(&self) -> &SyntaxNode { &self.syntax }
1453} 1453}
1454impl AstNode for ExternCrateItem { 1454impl AstNode for ExternCrate {
1455 fn can_cast(kind: SyntaxKind) -> bool { kind == EXTERN_CRATE_ITEM } 1455 fn can_cast(kind: SyntaxKind) -> bool { kind == EXTERN_CRATE }
1456 fn cast(syntax: SyntaxNode) -> Option<Self> { 1456 fn cast(syntax: SyntaxNode) -> Option<Self> {
1457 if Self::can_cast(syntax.kind()) { 1457 if Self::can_cast(syntax.kind()) {
1458 Some(Self { syntax }) 1458 Some(Self { syntax })
@@ -1605,6 +1605,28 @@ impl AstNode for ItemList {
1605 } 1605 }
1606 fn syntax(&self) -> &SyntaxNode { &self.syntax } 1606 fn syntax(&self) -> &SyntaxNode { &self.syntax }
1607} 1607}
1608impl AstNode for NameRef {
1609 fn can_cast(kind: SyntaxKind) -> bool { kind == NAME_REF }
1610 fn cast(syntax: SyntaxNode) -> Option<Self> {
1611 if Self::can_cast(syntax.kind()) {
1612 Some(Self { syntax })
1613 } else {
1614 None
1615 }
1616 }
1617 fn syntax(&self) -> &SyntaxNode { &self.syntax }
1618}
1619impl AstNode for Rename {
1620 fn can_cast(kind: SyntaxKind) -> bool { kind == RENAME }
1621 fn cast(syntax: SyntaxNode) -> Option<Self> {
1622 if Self::can_cast(syntax.kind()) {
1623 Some(Self { syntax })
1624 } else {
1625 None
1626 }
1627 }
1628 fn syntax(&self) -> &SyntaxNode { &self.syntax }
1629}
1608impl AstNode for Abi { 1630impl AstNode for Abi {
1609 fn can_cast(kind: SyntaxKind) -> bool { kind == ABI } 1631 fn can_cast(kind: SyntaxKind) -> bool { kind == ABI }
1610 fn cast(syntax: SyntaxNode) -> Option<Self> { 1632 fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -2111,17 +2133,6 @@ impl AstNode for MethodCallExpr {
2111 } 2133 }
2112 fn syntax(&self) -> &SyntaxNode { &self.syntax } 2134 fn syntax(&self) -> &SyntaxNode { &self.syntax }
2113} 2135}
2114impl AstNode for NameRef {
2115 fn can_cast(kind: SyntaxKind) -> bool { kind == NAME_REF }
2116 fn cast(syntax: SyntaxNode) -> Option<Self> {
2117 if Self::can_cast(syntax.kind()) {
2118 Some(Self { syntax })
2119 } else {
2120 None
2121 }
2122 }
2123 fn syntax(&self) -> &SyntaxNode { &self.syntax }
2124}
2125impl AstNode for TypeArgList { 2136impl AstNode for TypeArgList {
2126 fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_ARG_LIST } 2137 fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_ARG_LIST }
2127 fn cast(syntax: SyntaxNode) -> Option<Self> { 2138 fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -2683,17 +2694,6 @@ impl AstNode for UseTreeList {
2683 } 2694 }
2684 fn syntax(&self) -> &SyntaxNode { &self.syntax } 2695 fn syntax(&self) -> &SyntaxNode { &self.syntax }
2685} 2696}
2686impl AstNode for Rename {
2687 fn can_cast(kind: SyntaxKind) -> bool { kind == RENAME }
2688 fn cast(syntax: SyntaxNode) -> Option<Self> {
2689 if Self::can_cast(syntax.kind()) {
2690 Some(Self { syntax })
2691 } else {
2692 None
2693 }
2694 }
2695 fn syntax(&self) -> &SyntaxNode { &self.syntax }
2696}
2697impl AstNode for PathSegment { 2697impl AstNode for PathSegment {
2698 fn can_cast(kind: SyntaxKind) -> bool { kind == PATH_SEGMENT } 2698 fn can_cast(kind: SyntaxKind) -> bool { kind == PATH_SEGMENT }
2699 fn cast(syntax: SyntaxNode) -> Option<Self> { 2699 fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -2780,8 +2780,8 @@ impl From<EnumDef> for Item {
2780impl From<ExternBlock> for Item { 2780impl From<ExternBlock> for Item {
2781 fn from(node: ExternBlock) -> Item { Item::ExternBlock(node) } 2781 fn from(node: ExternBlock) -> Item { Item::ExternBlock(node) }
2782} 2782}
2783impl From<ExternCrateItem> for Item { 2783impl From<ExternCrate> for Item {
2784 fn from(node: ExternCrateItem) -> Item { Item::ExternCrateItem(node) } 2784 fn from(node: ExternCrate) -> Item { Item::ExternCrate(node) }
2785} 2785}
2786impl From<FnDef> for Item { 2786impl From<FnDef> for Item {
2787 fn from(node: FnDef) -> Item { Item::FnDef(node) } 2787 fn from(node: FnDef) -> Item { Item::FnDef(node) }
@@ -2816,9 +2816,9 @@ impl From<UseItem> for Item {
2816impl AstNode for Item { 2816impl AstNode for Item {
2817 fn can_cast(kind: SyntaxKind) -> bool { 2817 fn can_cast(kind: SyntaxKind) -> bool {
2818 match kind { 2818 match kind {
2819 CONST_DEF | ENUM_DEF | EXTERN_BLOCK | EXTERN_CRATE_ITEM | FN_DEF | IMPL_DEF 2819 CONST_DEF | ENUM_DEF | EXTERN_BLOCK | EXTERN_CRATE | FN_DEF | IMPL_DEF | MACRO_CALL
2820 | MACRO_CALL | MODULE | STATIC_DEF | STRUCT_DEF | TRAIT_DEF | TYPE_ALIAS_DEF 2820 | MODULE | STATIC_DEF | STRUCT_DEF | TRAIT_DEF | TYPE_ALIAS_DEF | UNION_DEF
2821 | UNION_DEF | USE_ITEM => true, 2821 | USE_ITEM => true,
2822 _ => false, 2822 _ => false,
2823 } 2823 }
2824 } 2824 }
@@ -2827,7 +2827,7 @@ impl AstNode for Item {
2827 CONST_DEF => Item::ConstDef(ConstDef { syntax }), 2827 CONST_DEF => Item::ConstDef(ConstDef { syntax }),
2828 ENUM_DEF => Item::EnumDef(EnumDef { syntax }), 2828 ENUM_DEF => Item::EnumDef(EnumDef { syntax }),
2829 EXTERN_BLOCK => Item::ExternBlock(ExternBlock { syntax }), 2829 EXTERN_BLOCK => Item::ExternBlock(ExternBlock { syntax }),
2830 EXTERN_CRATE_ITEM => Item::ExternCrateItem(ExternCrateItem { syntax }), 2830 EXTERN_CRATE => Item::ExternCrate(ExternCrate { syntax }),
2831 FN_DEF => Item::FnDef(FnDef { syntax }), 2831 FN_DEF => Item::FnDef(FnDef { syntax }),
2832 IMPL_DEF => Item::ImplDef(ImplDef { syntax }), 2832 IMPL_DEF => Item::ImplDef(ImplDef { syntax }),
2833 MACRO_CALL => Item::MacroCall(MacroCall { syntax }), 2833 MACRO_CALL => Item::MacroCall(MacroCall { syntax }),
@@ -2847,7 +2847,7 @@ impl AstNode for Item {
2847 Item::ConstDef(it) => &it.syntax, 2847 Item::ConstDef(it) => &it.syntax,
2848 Item::EnumDef(it) => &it.syntax, 2848 Item::EnumDef(it) => &it.syntax,
2849 Item::ExternBlock(it) => &it.syntax, 2849 Item::ExternBlock(it) => &it.syntax,
2850 Item::ExternCrateItem(it) => &it.syntax, 2850 Item::ExternCrate(it) => &it.syntax,
2851 Item::FnDef(it) => &it.syntax, 2851 Item::FnDef(it) => &it.syntax,
2852 Item::ImplDef(it) => &it.syntax, 2852 Item::ImplDef(it) => &it.syntax,
2853 Item::MacroCall(it) => &it.syntax, 2853 Item::MacroCall(it) => &it.syntax,
@@ -3480,7 +3480,7 @@ impl std::fmt::Display for ExternBlock {
3480 std::fmt::Display::fmt(self.syntax(), f) 3480 std::fmt::Display::fmt(self.syntax(), f)
3481 } 3481 }
3482} 3482}
3483impl std::fmt::Display for ExternCrateItem { 3483impl std::fmt::Display for ExternCrate {
3484 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 3484 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3485 std::fmt::Display::fmt(self.syntax(), f) 3485 std::fmt::Display::fmt(self.syntax(), f)
3486 } 3486 }
@@ -3550,6 +3550,16 @@ impl std::fmt::Display for ItemList {
3550 std::fmt::Display::fmt(self.syntax(), f) 3550 std::fmt::Display::fmt(self.syntax(), f)
3551 } 3551 }
3552} 3552}
3553impl std::fmt::Display for NameRef {
3554 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3555 std::fmt::Display::fmt(self.syntax(), f)
3556 }
3557}
3558impl std::fmt::Display for Rename {
3559 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3560 std::fmt::Display::fmt(self.syntax(), f)
3561 }
3562}
3553impl std::fmt::Display for Abi { 3563impl std::fmt::Display for Abi {
3554 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 3564 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3555 std::fmt::Display::fmt(self.syntax(), f) 3565 std::fmt::Display::fmt(self.syntax(), f)
@@ -3780,11 +3790,6 @@ impl std::fmt::Display for MethodCallExpr {
3780 std::fmt::Display::fmt(self.syntax(), f) 3790 std::fmt::Display::fmt(self.syntax(), f)
3781 } 3791 }
3782} 3792}
3783impl std::fmt::Display for NameRef {
3784 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3785 std::fmt::Display::fmt(self.syntax(), f)
3786 }
3787}
3788impl std::fmt::Display for TypeArgList { 3793impl std::fmt::Display for TypeArgList {
3789 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 3794 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3790 std::fmt::Display::fmt(self.syntax(), f) 3795 std::fmt::Display::fmt(self.syntax(), f)
@@ -4040,11 +4045,6 @@ impl std::fmt::Display for UseTreeList {
4040 std::fmt::Display::fmt(self.syntax(), f) 4045 std::fmt::Display::fmt(self.syntax(), f)
4041 } 4046 }
4042} 4047}
4043impl std::fmt::Display for Rename {
4044 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4045 std::fmt::Display::fmt(self.syntax(), f)
4046 }
4047}
4048impl std::fmt::Display for PathSegment { 4048impl std::fmt::Display for PathSegment {
4049 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 4049 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4050 std::fmt::Display::fmt(self.syntax(), f) 4050 std::fmt::Display::fmt(self.syntax(), f)
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0060_extern_crate.rast b/crates/ra_syntax/test_data/parser/inline/ok/0060_extern_crate.rast
index d06fc0be5..25e1777d1 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0060_extern_crate.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0060_extern_crate.rast
@@ -1,5 +1,5 @@
1[email protected] 1[email protected]
2 EXTERN_CRATE_ITEM@0..17 2 [email protected]
3 [email protected] "extern" 3 [email protected] "extern"
4 [email protected] " " 4 [email protected] " "
5 [email protected] "crate" 5 [email protected] "crate"
diff --git a/crates/ra_syntax/test_data/parser/ok/0007_extern_crate.rast b/crates/ra_syntax/test_data/parser/ok/0007_extern_crate.rast
index 948c4ddb3..594c2f8f2 100644
--- a/crates/ra_syntax/test_data/parser/ok/0007_extern_crate.rast
+++ b/crates/ra_syntax/test_data/parser/ok/0007_extern_crate.rast
@@ -1,5 +1,5 @@
1[email protected] 1[email protected]
2 EXTERN_CRATE_ITEM@0..17 2 [email protected]
3 [email protected] "extern" 3 [email protected] "extern"
4 [email protected] " " 4 [email protected] " "
5 [email protected] "crate" 5 [email protected] "crate"
@@ -8,7 +8,7 @@ [email protected]
8 [email protected] "foo" 8 [email protected] "foo"
9 [email protected] ";" 9 [email protected] ";"
10 [email protected] "\n" 10 [email protected] "\n"
11 EXTERN_CRATE_ITEM@18..42 11 [email protected]
12 [email protected] "extern" 12 [email protected] "extern"
13 [email protected] " " 13 [email protected] " "
14 [email protected] "crate" 14 [email protected] "crate"
@@ -23,7 +23,7 @@ [email protected]
23 [email protected] "bar" 23 [email protected] "bar"
24 [email protected] ";" 24 [email protected] ";"
25 [email protected] "\n" 25 [email protected] "\n"
26 EXTERN_CRATE_ITEM@43..68 26 [email protected]
27 [email protected] "extern" 27 [email protected] "extern"
28 [email protected] " " 28 [email protected] " "
29 [email protected] "crate" 29 [email protected] "crate"
diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs
index bcd92c3bc..083727c5c 100644
--- a/xtask/src/ast_src.rs
+++ b/xtask/src/ast_src.rs
@@ -98,7 +98,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
98 "ENUM_DEF", 98 "ENUM_DEF",
99 "FN_DEF", 99 "FN_DEF",
100 "RET_TYPE", 100 "RET_TYPE",
101 "EXTERN_CRATE_ITEM", 101 "EXTERN_CRATE",
102 "MODULE", 102 "MODULE",
103 "USE_ITEM", 103 "USE_ITEM",
104 "STATIC_DEF", 104 "STATIC_DEF",
diff --git a/xtask/src/codegen/rust.ungram b/xtask/src/codegen/rust.ungram
index 76c070402..e6e7c7518 100644
--- a/xtask/src/codegen/rust.ungram
+++ b/xtask/src/codegen/rust.ungram
@@ -7,7 +7,7 @@ Item =
7 ConstDef 7 ConstDef
8| EnumDef 8| EnumDef
9| ExternBlock 9| ExternBlock
10| ExternCrateItem 10| ExternCrate
11| FnDef 11| FnDef
12| ImplDef 12| ImplDef
13| MacroCall 13| MacroCall
@@ -26,6 +26,9 @@ Module =
26ItemList = 26ItemList =
27 '{' Attr* Item* '}' 27 '{' Attr* Item* '}'
28 28
29ExternCrate =
30 Attr* Visibility? 'extern' 'crate' (NameRef | 'self') Rename? ';'
31
29FnDef = 32FnDef =
30 Attr* Visibility? Abi? 'const' 'default' 'async' 'unsafe' 'fn' Name TypeParamList? 33 Attr* Visibility? Abi? 'const' 'default' 'async' 'unsafe' 'fn' Name TypeParamList?
31 ParamList RetType? 34 ParamList RetType?
@@ -404,9 +407,6 @@ UseTreeList =
404Rename = 407Rename =
405 'as' Name 408 'as' Name
406 409
407ExternCrateItem =
408 Attr* Visibility? 'extern' 'crate' (NameRef | 'self') Rename? ';'
409
410Path = 410Path =
411 (qualifier:Path '::')? segment:PathSegment 411 (qualifier:Path '::')? segment:PathSegment
412 412