Finish extern crates grammar

This commit is contained in:
Aleksey Kladov 2020-07-30 12:26:57 +02:00
parent 570fdf26c9
commit d032f872b6
8 changed files with 75 additions and 75 deletions

View file

@ -671,7 +671,7 @@ impl ExprCollector<'_> {
ast::Item::ExternBlock(_) => return None, // FIXME: collect from extern blocks ast::Item::ExternBlock(_) => return None, // FIXME: collect from extern blocks
ast::Item::ImplDef(_) ast::Item::ImplDef(_)
| ast::Item::UseItem(_) | ast::Item::UseItem(_)
| ast::Item::ExternCrateItem(_) | ast::Item::ExternCrate(_)
| ast::Item::Module(_) | ast::Item::Module(_)
| ast::Item::MacroCall(_) => return None, | ast::Item::MacroCall(_) => return None,
}; };

View file

@ -412,7 +412,7 @@ macro_rules! mod_items {
mod_items! { mod_items! {
Import in imports -> ast::UseItem, Import in imports -> ast::UseItem,
ExternCrate in extern_crates -> ast::ExternCrateItem, ExternCrate in extern_crates -> ast::ExternCrate,
Function in functions -> ast::FnDef, Function in functions -> ast::FnDef,
Struct in structs -> ast::StructDef, Struct in structs -> ast::StructDef,
Union in unions -> ast::UnionDef, Union in unions -> ast::UnionDef,
@ -492,7 +492,7 @@ pub struct ExternCrate {
pub visibility: RawVisibilityId, pub visibility: RawVisibilityId,
/// Whether this is a `#[macro_use] extern crate ...`. /// Whether this is a `#[macro_use] extern crate ...`.
pub is_macro_use: bool, pub is_macro_use: bool,
pub ast_id: FileAstId<ast::ExternCrateItem>, pub ast_id: FileAstId<ast::ExternCrate>,
} }
#[derive(Debug, Clone, Eq, PartialEq)] #[derive(Debug, Clone, Eq, PartialEq)]

View file

@ -95,7 +95,7 @@ impl Ctx {
ast::Item::TraitDef(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {} ast::Item::TraitDef(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {}
// These don't have inner items. // These don't have inner items.
ast::Item::Module(_) | ast::Item::ExternCrateItem(_) | ast::Item::UseItem(_) => {} ast::Item::Module(_) | ast::Item::ExternCrate(_) | ast::Item::UseItem(_) => {}
}; };
let attrs = Attrs::new(item, &self.hygiene); let attrs = Attrs::new(item, &self.hygiene);
@ -113,7 +113,7 @@ impl Ctx {
ast::Item::UseItem(ast) => Some(ModItems( ast::Item::UseItem(ast) => Some(ModItems(
self.lower_use(ast).into_iter().map(Into::into).collect::<SmallVec<_>>(), self.lower_use(ast).into_iter().map(Into::into).collect::<SmallVec<_>>(),
)), )),
ast::Item::ExternCrateItem(ast) => self.lower_extern_crate(ast).map(Into::into), ast::Item::ExternCrate(ast) => self.lower_extern_crate(ast).map(Into::into),
ast::Item::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into), ast::Item::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into),
ast::Item::ExternBlock(ast) => { ast::Item::ExternBlock(ast) => {
Some(ModItems(self.lower_extern_block(ast).into_iter().collect::<SmallVec<_>>())) Some(ModItems(self.lower_extern_block(ast).into_iter().collect::<SmallVec<_>>()))
@ -498,7 +498,7 @@ impl Ctx {
fn lower_extern_crate( fn lower_extern_crate(
&mut self, &mut self,
extern_crate: &ast::ExternCrateItem, extern_crate: &ast::ExternCrate,
) -> Option<FileItemTreeId<ExternCrate>> { ) -> Option<FileItemTreeId<ExternCrate>> {
let path = ModPath::from_name_ref(&extern_crate.name_ref()?); let path = ModPath::from_name_ref(&extern_crate.name_ref()?);
let alias = extern_crate.rename().map(|a| { let alias = extern_crate.rename().map(|a| {

View file

@ -313,7 +313,7 @@ fn extern_crate_item(p: &mut Parser, m: Marker) {
opt_alias(p); opt_alias(p);
p.expect(T![;]); p.expect(T![;]);
m.complete(p, EXTERN_CRATE_ITEM); m.complete(p, EXTERN_CRATE);
} }
pub(crate) fn extern_item_list(p: &mut Parser) { pub(crate) fn extern_item_list(p: &mut Parser) {

View file

@ -128,7 +128,7 @@ pub enum SyntaxKind {
ENUM_DEF, ENUM_DEF,
FN_DEF, FN_DEF,
RET_TYPE, RET_TYPE,
EXTERN_CRATE_ITEM, EXTERN_CRATE,
MODULE, MODULE,
USE_ITEM, USE_ITEM,
STATIC_DEF, STATIC_DEF,

View file

@ -65,12 +65,12 @@ impl ExternBlock {
pub fn extern_item_list(&self) -> Option<ExternItemList> { support::child(&self.syntax) } pub fn extern_item_list(&self) -> Option<ExternItemList> { support::child(&self.syntax) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ExternCrateItem { pub struct ExternCrate {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
impl ast::AttrsOwner for ExternCrateItem {} impl ast::AttrsOwner for ExternCrate {}
impl ast::VisibilityOwner for ExternCrateItem {} impl ast::VisibilityOwner for ExternCrate {}
impl ExternCrateItem { impl ExternCrate {
pub fn extern_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![extern]) } pub fn extern_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![extern]) }
pub fn crate_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![crate]) } pub fn crate_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![crate]) }
pub fn name_ref(&self) -> Option<NameRef> { support::child(&self.syntax) } pub fn name_ref(&self) -> Option<NameRef> { support::child(&self.syntax) }
@ -255,6 +255,21 @@ impl ItemList {
pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) } pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct NameRef {
pub(crate) syntax: SyntaxNode,
}
impl NameRef {
pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Rename {
pub(crate) syntax: SyntaxNode,
}
impl ast::NameOwner for Rename {}
impl Rename {
pub fn as_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![as]) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Abi { pub struct Abi {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
@ -699,13 +714,6 @@ impl MethodCallExpr {
pub fn type_arg_list(&self) -> Option<TypeArgList> { support::child(&self.syntax) } pub fn type_arg_list(&self) -> Option<TypeArgList> { support::child(&self.syntax) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct NameRef {
pub(crate) syntax: SyntaxNode,
}
impl NameRef {
pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TypeArgList { pub struct TypeArgList {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
@ -1190,14 +1198,6 @@ impl UseTreeList {
pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) } pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Rename {
pub(crate) syntax: SyntaxNode,
}
impl ast::NameOwner for Rename {}
impl Rename {
pub fn as_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![as]) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct PathSegment { pub struct PathSegment {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
@ -1272,7 +1272,7 @@ pub enum Item {
ConstDef(ConstDef), ConstDef(ConstDef),
EnumDef(EnumDef), EnumDef(EnumDef),
ExternBlock(ExternBlock), ExternBlock(ExternBlock),
ExternCrateItem(ExternCrateItem), ExternCrate(ExternCrate),
FnDef(FnDef), FnDef(FnDef),
ImplDef(ImplDef), ImplDef(ImplDef),
MacroCall(MacroCall), MacroCall(MacroCall),
@ -1451,8 +1451,8 @@ impl AstNode for ExternBlock {
} }
fn syntax(&self) -> &SyntaxNode { &self.syntax } fn syntax(&self) -> &SyntaxNode { &self.syntax }
} }
impl AstNode for ExternCrateItem { impl AstNode for ExternCrate {
fn can_cast(kind: SyntaxKind) -> bool { kind == EXTERN_CRATE_ITEM } fn can_cast(kind: SyntaxKind) -> bool { kind == EXTERN_CRATE }
fn cast(syntax: SyntaxNode) -> Option<Self> { fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) { if Self::can_cast(syntax.kind()) {
Some(Self { syntax }) Some(Self { syntax })
@ -1605,6 +1605,28 @@ impl AstNode for ItemList {
} }
fn syntax(&self) -> &SyntaxNode { &self.syntax } fn syntax(&self) -> &SyntaxNode { &self.syntax }
} }
impl AstNode for NameRef {
fn can_cast(kind: SyntaxKind) -> bool { kind == NAME_REF }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
} else {
None
}
}
fn syntax(&self) -> &SyntaxNode { &self.syntax }
}
impl AstNode for Rename {
fn can_cast(kind: SyntaxKind) -> bool { kind == RENAME }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
} else {
None
}
}
fn syntax(&self) -> &SyntaxNode { &self.syntax }
}
impl AstNode for Abi { impl AstNode for Abi {
fn can_cast(kind: SyntaxKind) -> bool { kind == ABI } fn can_cast(kind: SyntaxKind) -> bool { kind == ABI }
fn cast(syntax: SyntaxNode) -> Option<Self> { fn cast(syntax: SyntaxNode) -> Option<Self> {
@ -2111,17 +2133,6 @@ impl AstNode for MethodCallExpr {
} }
fn syntax(&self) -> &SyntaxNode { &self.syntax } fn syntax(&self) -> &SyntaxNode { &self.syntax }
} }
impl AstNode for NameRef {
fn can_cast(kind: SyntaxKind) -> bool { kind == NAME_REF }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
} else {
None
}
}
fn syntax(&self) -> &SyntaxNode { &self.syntax }
}
impl AstNode for TypeArgList { impl AstNode for TypeArgList {
fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_ARG_LIST } fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_ARG_LIST }
fn cast(syntax: SyntaxNode) -> Option<Self> { fn cast(syntax: SyntaxNode) -> Option<Self> {
@ -2683,17 +2694,6 @@ impl AstNode for UseTreeList {
} }
fn syntax(&self) -> &SyntaxNode { &self.syntax } fn syntax(&self) -> &SyntaxNode { &self.syntax }
} }
impl AstNode for Rename {
fn can_cast(kind: SyntaxKind) -> bool { kind == RENAME }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
} else {
None
}
}
fn syntax(&self) -> &SyntaxNode { &self.syntax }
}
impl AstNode for PathSegment { impl AstNode for PathSegment {
fn can_cast(kind: SyntaxKind) -> bool { kind == PATH_SEGMENT } fn can_cast(kind: SyntaxKind) -> bool { kind == PATH_SEGMENT }
fn cast(syntax: SyntaxNode) -> Option<Self> { fn cast(syntax: SyntaxNode) -> Option<Self> {
@ -2780,8 +2780,8 @@ impl From<EnumDef> for Item {
impl From<ExternBlock> for Item { impl From<ExternBlock> for Item {
fn from(node: ExternBlock) -> Item { Item::ExternBlock(node) } fn from(node: ExternBlock) -> Item { Item::ExternBlock(node) }
} }
impl From<ExternCrateItem> for Item { impl From<ExternCrate> for Item {
fn from(node: ExternCrateItem) -> Item { Item::ExternCrateItem(node) } fn from(node: ExternCrate) -> Item { Item::ExternCrate(node) }
} }
impl From<FnDef> for Item { impl From<FnDef> for Item {
fn from(node: FnDef) -> Item { Item::FnDef(node) } fn from(node: FnDef) -> Item { Item::FnDef(node) }
@ -2816,9 +2816,9 @@ impl From<UseItem> for Item {
impl AstNode for Item { impl AstNode for Item {
fn can_cast(kind: SyntaxKind) -> bool { fn can_cast(kind: SyntaxKind) -> bool {
match kind { match kind {
CONST_DEF | ENUM_DEF | EXTERN_BLOCK | EXTERN_CRATE_ITEM | FN_DEF | IMPL_DEF CONST_DEF | ENUM_DEF | EXTERN_BLOCK | EXTERN_CRATE | FN_DEF | IMPL_DEF | MACRO_CALL
| MACRO_CALL | MODULE | STATIC_DEF | STRUCT_DEF | TRAIT_DEF | TYPE_ALIAS_DEF | MODULE | STATIC_DEF | STRUCT_DEF | TRAIT_DEF | TYPE_ALIAS_DEF | UNION_DEF
| UNION_DEF | USE_ITEM => true, | USE_ITEM => true,
_ => false, _ => false,
} }
} }
@ -2827,7 +2827,7 @@ impl AstNode for Item {
CONST_DEF => Item::ConstDef(ConstDef { syntax }), CONST_DEF => Item::ConstDef(ConstDef { syntax }),
ENUM_DEF => Item::EnumDef(EnumDef { syntax }), ENUM_DEF => Item::EnumDef(EnumDef { syntax }),
EXTERN_BLOCK => Item::ExternBlock(ExternBlock { syntax }), EXTERN_BLOCK => Item::ExternBlock(ExternBlock { syntax }),
EXTERN_CRATE_ITEM => Item::ExternCrateItem(ExternCrateItem { syntax }), EXTERN_CRATE => Item::ExternCrate(ExternCrate { syntax }),
FN_DEF => Item::FnDef(FnDef { syntax }), FN_DEF => Item::FnDef(FnDef { syntax }),
IMPL_DEF => Item::ImplDef(ImplDef { syntax }), IMPL_DEF => Item::ImplDef(ImplDef { syntax }),
MACRO_CALL => Item::MacroCall(MacroCall { syntax }), MACRO_CALL => Item::MacroCall(MacroCall { syntax }),
@ -2847,7 +2847,7 @@ impl AstNode for Item {
Item::ConstDef(it) => &it.syntax, Item::ConstDef(it) => &it.syntax,
Item::EnumDef(it) => &it.syntax, Item::EnumDef(it) => &it.syntax,
Item::ExternBlock(it) => &it.syntax, Item::ExternBlock(it) => &it.syntax,
Item::ExternCrateItem(it) => &it.syntax, Item::ExternCrate(it) => &it.syntax,
Item::FnDef(it) => &it.syntax, Item::FnDef(it) => &it.syntax,
Item::ImplDef(it) => &it.syntax, Item::ImplDef(it) => &it.syntax,
Item::MacroCall(it) => &it.syntax, Item::MacroCall(it) => &it.syntax,
@ -3480,7 +3480,7 @@ impl std::fmt::Display for ExternBlock {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
} }
} }
impl std::fmt::Display for ExternCrateItem { impl std::fmt::Display for ExternCrate {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
} }
@ -3550,6 +3550,16 @@ impl std::fmt::Display for ItemList {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
} }
} }
impl std::fmt::Display for NameRef {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
impl std::fmt::Display for Rename {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
impl std::fmt::Display for Abi { impl std::fmt::Display for Abi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
@ -3780,11 +3790,6 @@ impl std::fmt::Display for MethodCallExpr {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
} }
} }
impl std::fmt::Display for NameRef {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
impl std::fmt::Display for TypeArgList { impl std::fmt::Display for TypeArgList {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
@ -4040,11 +4045,6 @@ impl std::fmt::Display for UseTreeList {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
} }
} }
impl std::fmt::Display for Rename {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
impl std::fmt::Display for PathSegment { impl std::fmt::Display for PathSegment {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)

View file

@ -98,7 +98,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
"ENUM_DEF", "ENUM_DEF",
"FN_DEF", "FN_DEF",
"RET_TYPE", "RET_TYPE",
"EXTERN_CRATE_ITEM", "EXTERN_CRATE",
"MODULE", "MODULE",
"USE_ITEM", "USE_ITEM",
"STATIC_DEF", "STATIC_DEF",

View file

@ -7,7 +7,7 @@ Item =
ConstDef ConstDef
| EnumDef | EnumDef
| ExternBlock | ExternBlock
| ExternCrateItem | ExternCrate
| FnDef | FnDef
| ImplDef | ImplDef
| MacroCall | MacroCall
@ -26,6 +26,9 @@ Module =
ItemList = ItemList =
'{' Attr* Item* '}' '{' Attr* Item* '}'
ExternCrate =
Attr* Visibility? 'extern' 'crate' (NameRef | 'self') Rename? ';'
FnDef = FnDef =
Attr* Visibility? Abi? 'const' 'default' 'async' 'unsafe' 'fn' Name TypeParamList? Attr* Visibility? Abi? 'const' 'default' 'async' 'unsafe' 'fn' Name TypeParamList?
ParamList RetType? ParamList RetType?
@ -404,9 +407,6 @@ UseTreeList =
Rename = Rename =
'as' Name 'as' Name
ExternCrateItem =
Attr* Visibility? 'extern' 'crate' (NameRef | 'self') Rename? ';'
Path = Path =
(qualifier:Path '::')? segment:PathSegment (qualifier:Path '::')? segment:PathSegment