Split ItemList & AssocItemList

This commit is contained in:
Aleksey Kladov 2020-07-30 11:42:51 +02:00
parent 72ffd851dd
commit 2984da672e
14 changed files with 131 additions and 89 deletions

View file

@ -112,7 +112,7 @@ fn add_missing_impl_members_inner(
) -> Option<()> { ) -> Option<()> {
let _p = ra_prof::profile("add_missing_impl_members_inner"); 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::ImplDef>()?;
let impl_item_list = impl_def.item_list()?; let impl_item_list = impl_def.assoc_item_list()?;
let trait_ = resolve_target_trait(&ctx.sema, &impl_def)?; let trait_ = resolve_target_trait(&ctx.sema, &impl_def)?;
@ -121,6 +121,7 @@ fn add_missing_impl_members_inner(
ast::AssocItem::FnDef(def) => def.name(), ast::AssocItem::FnDef(def) => def.name(),
ast::AssocItem::TypeAliasDef(def) => def.name(), ast::AssocItem::TypeAliasDef(def) => def.name(),
ast::AssocItem::ConstDef(def) => def.name(), ast::AssocItem::ConstDef(def) => def.name(),
ast::AssocItem::MacroCall(_) => None,
} }
.map(|it| it.text().clone()) .map(|it| it.text().clone())
}; };

View file

@ -158,7 +158,7 @@ fn find_struct_impl(ctx: &AssistContext, strukt: &ast::StructDef) -> Option<Opti
} }
fn has_new_fn(imp: &ast::ImplDef) -> bool { fn has_new_fn(imp: &ast::ImplDef) -> bool {
if let Some(il) = imp.item_list() { if let Some(il) = imp.assoc_item_list() {
for item in il.assoc_items() { for item in il.assoc_items() {
if let ast::AssocItem::FnDef(f) = item { if let ast::AssocItem::FnDef(f) = item {
if let Some(name) = f.name() { if let Some(name) = f.name() {

View file

@ -38,8 +38,8 @@ pub(crate) fn move_bounds_to_where_clause(acc: &mut Assists, ctx: &AssistContext
let anchor = match_ast! { let anchor = match_ast! {
match parent { match parent {
ast::FnDef(it) => it.body()?.syntax().clone().into(), ast::FnDef(it) => it.body()?.syntax().clone().into(),
ast::TraitDef(it) => it.item_list()?.syntax().clone().into(), ast::TraitDef(it) => it.assoc_item_list()?.syntax().clone().into(),
ast::ImplDef(it) => it.item_list()?.syntax().clone().into(), ast::ImplDef(it) => it.assoc_item_list()?.syntax().clone().into(),
ast::EnumDef(it) => it.variant_list()?.syntax().clone().into(), ast::EnumDef(it) => it.variant_list()?.syntax().clone().into(),
ast::StructDef(it) => { ast::StructDef(it) => {
it.syntax().children_with_tokens() it.syntax().children_with_tokens()

View file

@ -63,7 +63,7 @@ pub fn get_missing_assoc_items(
let mut impl_fns_consts = FxHashSet::default(); let mut impl_fns_consts = FxHashSet::default();
let mut impl_type = FxHashSet::default(); let mut impl_type = FxHashSet::default();
if let Some(item_list) = impl_def.item_list() { if let Some(item_list) = impl_def.assoc_item_list() {
for item in item_list.assoc_items() { for item in item_list.assoc_items() {
match item { match item {
ast::AssocItem::FnDef(f) => { ast::AssocItem::FnDef(f) => {
@ -83,6 +83,7 @@ pub fn get_missing_assoc_items(
impl_fns_consts.insert(n.syntax().to_string()); impl_fns_consts.insert(n.syntax().to_string());
} }
} }
ast::AssocItem::MacroCall(_) => (),
} }
} }
} }

View file

@ -153,13 +153,12 @@ impl Ctx {
self.forced_visibility = forced_vis; self.forced_visibility = forced_vis;
} }
fn lower_assoc_item(&mut self, item: &ast::Item) -> Option<AssocItem> { fn lower_assoc_item(&mut self, item: &ast::AssocItem) -> Option<AssocItem> {
match item { match item {
ast::Item::FnDef(ast) => self.lower_function(ast).map(Into::into), ast::AssocItem::FnDef(ast) => self.lower_function(ast).map(Into::into),
ast::Item::TypeAliasDef(ast) => self.lower_type_alias(ast).map(Into::into), ast::AssocItem::TypeAliasDef(ast) => self.lower_type_alias(ast).map(Into::into),
ast::Item::ConstDef(ast) => Some(self.lower_const(ast).into()), ast::AssocItem::ConstDef(ast) => Some(self.lower_const(ast).into()),
ast::Item::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into), ast::AssocItem::MacroCall(ast) => self.lower_macro_call(ast).map(Into::into),
_ => None,
} }
} }
@ -419,9 +418,9 @@ impl Ctx {
let generic_params = let generic_params =
self.lower_generic_params_and_inner_items(GenericsOwner::Trait(trait_def), trait_def); self.lower_generic_params_and_inner_items(GenericsOwner::Trait(trait_def), trait_def);
let auto = trait_def.auto_token().is_some(); let auto = trait_def.auto_token().is_some();
let items = trait_def.item_list().map(|list| { let items = trait_def.assoc_item_list().map(|list| {
self.with_inherited_visibility(visibility, |this| { self.with_inherited_visibility(visibility, |this| {
list.items() list.assoc_items()
.filter_map(|item| { .filter_map(|item| {
let attrs = Attrs::new(&item, &this.hygiene); let attrs = Attrs::new(&item, &this.hygiene);
this.collect_inner_items(item.syntax()); this.collect_inner_items(item.syntax());
@ -454,9 +453,9 @@ impl Ctx {
// We cannot use `assoc_items()` here as that does not include macro calls. // We cannot use `assoc_items()` here as that does not include macro calls.
let items = impl_def let items = impl_def
.item_list() .assoc_item_list()
.into_iter() .into_iter()
.flat_map(|it| it.items()) .flat_map(|it| it.assoc_items())
.filter_map(|item| { .filter_map(|item| {
self.collect_inner_items(item.syntax()); self.collect_inner_items(item.syntax());
let assoc = self.lower_assoc_item(&item)?; let assoc = self.lower_assoc_item(&item)?;

View file

@ -18,26 +18,36 @@ pub(super) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
} }
let mut params = FxHashMap::default(); let mut params = FxHashMap::default();
let me = ctx.token.ancestors().find_map(ast::FnDef::cast); let me = ctx.token.ancestors().find_map(ast::FnDef::cast);
let mut process_fn = |func: ast::FnDef| {
if Some(&func) == me.as_ref() {
return;
}
func.param_list().into_iter().flat_map(|it| it.params()).for_each(|param| {
let text = param.syntax().text().to_string();
params.entry(text).or_insert(param);
})
};
for node in ctx.token.parent().ancestors() { for node in ctx.token.parent().ancestors() {
let items = match_ast! { match_ast! {
match node { match node {
ast::SourceFile(it) => it.items(), ast::SourceFile(it) => it.items().filter_map(|item| match item {
ast::ItemList(it) => it.items(), ast::Item::FnDef(it) => Some(it),
_ => None,
}).for_each(&mut process_fn),
ast::ItemList(it) => it.items().filter_map(|item| match item {
ast::Item::FnDef(it) => Some(it),
_ => None,
}).for_each(&mut process_fn),
ast::AssocItemList(it) => it.assoc_items().filter_map(|item| match item {
ast::AssocItem::FnDef(it) => Some(it),
_ => None,
}).for_each(&mut process_fn),
_ => continue, _ => continue,
} }
}; };
for item in items {
if let ast::Item::FnDef(func) = item {
if Some(&func) == me.as_ref() {
continue;
}
func.param_list().into_iter().flat_map(|it| it.params()).for_each(|param| {
let text = param.syntax().text().to_string();
params.entry(text).or_insert(param);
})
}
}
} }
params params

View file

@ -66,27 +66,24 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
add_keyword(ctx, acc, "fn", "fn $0() {}") add_keyword(ctx, acc, "fn", "fn $0() {}")
} }
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
|| ctx.block_expr_parent
{
add_keyword(ctx, acc, "trait", "trait $0 {}"); add_keyword(ctx, acc, "trait", "trait $0 {}");
add_keyword(ctx, acc, "impl", "impl $0 {}"); add_keyword(ctx, acc, "impl", "impl $0 {}");
} }
return; return;
} }
if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent { if ctx.has_item_list_or_source_file_parent || has_trait_or_impl_parent || ctx.block_expr_parent
{
add_keyword(ctx, acc, "fn", "fn $0() {}"); add_keyword(ctx, acc, "fn", "fn $0() {}");
} }
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
|| ctx.block_expr_parent
{
add_keyword(ctx, acc, "use", "use "); add_keyword(ctx, acc, "use", "use ");
add_keyword(ctx, acc, "impl", "impl $0 {}"); add_keyword(ctx, acc, "impl", "impl $0 {}");
add_keyword(ctx, acc, "trait", "trait $0 {}"); add_keyword(ctx, acc, "trait", "trait $0 {}");
} }
if ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent { if ctx.has_item_list_or_source_file_parent {
add_keyword(ctx, acc, "enum", "enum $0 {}"); add_keyword(ctx, acc, "enum", "enum $0 {}");
add_keyword(ctx, acc, "struct", "struct $0"); add_keyword(ctx, acc, "struct", "struct $0");
add_keyword(ctx, acc, "union", "union $0 {}"); add_keyword(ctx, acc, "union", "union $0 {}");
@ -108,29 +105,28 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
add_keyword(ctx, acc, "else", "else {$0}"); add_keyword(ctx, acc, "else", "else {$0}");
add_keyword(ctx, acc, "else if", "else if $0 {}"); add_keyword(ctx, acc, "else if", "else if $0 {}");
} }
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
|| ctx.block_expr_parent
{
add_keyword(ctx, acc, "mod", "mod $0 {}"); add_keyword(ctx, acc, "mod", "mod $0 {}");
} }
if ctx.bind_pat_parent || ctx.ref_pat_parent { if ctx.bind_pat_parent || ctx.ref_pat_parent {
add_keyword(ctx, acc, "mut", "mut "); add_keyword(ctx, acc, "mut", "mut ");
} }
if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent { if ctx.has_item_list_or_source_file_parent || has_trait_or_impl_parent || ctx.block_expr_parent
{
add_keyword(ctx, acc, "const", "const "); add_keyword(ctx, acc, "const", "const ");
add_keyword(ctx, acc, "type", "type "); add_keyword(ctx, acc, "type", "type ");
} }
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
|| ctx.block_expr_parent
{
add_keyword(ctx, acc, "static", "static "); add_keyword(ctx, acc, "static", "static ");
}; };
if (ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent) if (ctx.has_item_list_or_source_file_parent) || ctx.block_expr_parent {
|| ctx.block_expr_parent
{
add_keyword(ctx, acc, "extern", "extern "); add_keyword(ctx, acc, "extern", "extern ");
} }
if ctx.has_item_list_or_source_file_parent || ctx.block_expr_parent || ctx.is_match_arm { if ctx.has_item_list_or_source_file_parent
|| has_trait_or_impl_parent
|| ctx.block_expr_parent
|| ctx.is_match_arm
{
add_keyword(ctx, acc, "unsafe", "unsafe "); add_keyword(ctx, acc, "unsafe", "unsafe ");
} }
if ctx.in_loop_body { if ctx.in_loop_body {
@ -142,7 +138,7 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
add_keyword(ctx, acc, "break", "break"); add_keyword(ctx, acc, "break", "break");
} }
} }
if ctx.has_item_list_or_source_file_parent && !ctx.has_trait_parent { if ctx.has_item_list_or_source_file_parent || ctx.has_impl_parent {
add_keyword(ctx, acc, "pub", "pub ") add_keyword(ctx, acc, "pub", "pub ")
} }

View file

@ -13,7 +13,7 @@ use crate::completion::test_utils::check_pattern_is_applicable;
pub(crate) fn has_trait_parent(element: SyntaxElement) -> bool { pub(crate) fn has_trait_parent(element: SyntaxElement) -> bool {
not_same_range_ancestor(element) not_same_range_ancestor(element)
.filter(|it| it.kind() == ITEM_LIST) .filter(|it| it.kind() == ASSOC_ITEM_LIST)
.and_then(|it| it.parent()) .and_then(|it| it.parent())
.filter(|it| it.kind() == TRAIT_DEF) .filter(|it| it.kind() == TRAIT_DEF)
.is_some() .is_some()
@ -25,7 +25,7 @@ fn test_has_trait_parent() {
pub(crate) fn has_impl_parent(element: SyntaxElement) -> bool { pub(crate) fn has_impl_parent(element: SyntaxElement) -> bool {
not_same_range_ancestor(element) not_same_range_ancestor(element)
.filter(|it| it.kind() == ITEM_LIST) .filter(|it| it.kind() == ASSOC_ITEM_LIST)
.and_then(|it| it.parent()) .and_then(|it| it.parent())
.filter(|it| it.kind() == IMPL_DEF) .filter(|it| it.kind() == IMPL_DEF)
.is_some() .is_some()
@ -73,7 +73,7 @@ pub(crate) fn has_item_list_or_source_file_parent(element: SyntaxElement) -> boo
#[test] #[test]
fn test_has_item_list_or_source_file_parent() { fn test_has_item_list_or_source_file_parent() {
check_pattern_is_applicable(r"i<|>", has_item_list_or_source_file_parent); check_pattern_is_applicable(r"i<|>", has_item_list_or_source_file_parent);
check_pattern_is_applicable(r"impl { f<|> }", has_item_list_or_source_file_parent); check_pattern_is_applicable(r"mod foo { f<|> }", has_item_list_or_source_file_parent);
} }
pub(crate) fn is_match_arm(element: SyntaxElement) -> bool { pub(crate) fn is_match_arm(element: SyntaxElement) -> bool {

View file

@ -50,7 +50,7 @@ pub(crate) fn trait_item_list(p: &mut Parser) {
item_or_macro(p, true, ItemFlavor::Trait); item_or_macro(p, true, ItemFlavor::Trait);
} }
p.expect(T!['}']); p.expect(T!['}']);
m.complete(p, ITEM_LIST); m.complete(p, ASSOC_ITEM_LIST);
} }
// test impl_def // test impl_def
@ -107,7 +107,7 @@ pub(crate) fn impl_item_list(p: &mut Parser) {
item_or_macro(p, true, ItemFlavor::Mod); item_or_macro(p, true, ItemFlavor::Mod);
} }
p.expect(T!['}']); p.expect(T!['}']);
m.complete(p, ITEM_LIST); m.complete(p, ASSOC_ITEM_LIST);
} }
// test impl_type_params // test impl_type_params

View file

@ -213,6 +213,7 @@ pub enum SyntaxKind {
TUPLE_FIELD_DEF, TUPLE_FIELD_DEF,
ENUM_VARIANT_LIST, ENUM_VARIANT_LIST,
ITEM_LIST, ITEM_LIST,
ASSOC_ITEM_LIST,
ATTR, ATTR,
META_ITEM, META_ITEM,
USE_TREE, USE_TREE,

View file

@ -80,9 +80,12 @@ where
} }
} }
impl ast::ItemList { impl ast::AssocItemList {
#[must_use] #[must_use]
pub fn append_items(&self, items: impl IntoIterator<Item = ast::AssocItem>) -> ast::ItemList { pub fn append_items(
&self,
items: impl IntoIterator<Item = ast::AssocItem>,
) -> ast::AssocItemList {
let mut res = self.clone(); let mut res = self.clone();
if !self.syntax().text().contains_char('\n') { if !self.syntax().text().contains_char('\n') {
res = make_multiline(res); res = make_multiline(res);
@ -92,7 +95,7 @@ impl ast::ItemList {
} }
#[must_use] #[must_use]
pub fn append_item(&self, item: ast::AssocItem) -> ast::ItemList { pub fn append_item(&self, item: ast::AssocItem) -> ast::AssocItemList {
let (indent, position) = match self.assoc_items().last() { let (indent, position) = match self.assoc_items().last() {
Some(it) => ( Some(it) => (
leading_indent(it.syntax()).unwrap_or_default().to_string(), leading_indent(it.syntax()).unwrap_or_default().to_string(),

View file

@ -112,7 +112,7 @@ impl ImplDef {
pub fn impl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![impl]) } pub fn impl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![impl]) }
pub fn excl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![!]) } pub fn 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 for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
pub fn item_list(&self) -> Option<ItemList> { support::child(&self.syntax) } pub fn assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MacroCall { pub struct MacroCall {
@ -180,7 +180,7 @@ impl TraitDef {
pub fn unsafe_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![unsafe]) } 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 auto_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![auto]) }
pub fn trait_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![trait]) } pub fn trait_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![trait]) }
pub fn item_list(&self) -> Option<ItemList> { support::child(&self.syntax) } pub fn assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TypeAliasDef { pub struct TypeAliasDef {
@ -238,11 +238,6 @@ impl Visibility {
pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) } pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Abi {
pub(crate) syntax: SyntaxNode,
}
impl Abi {}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Name { pub struct Name {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
@ -250,6 +245,20 @@ impl Name {
pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) } pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ItemList {
pub(crate) syntax: SyntaxNode,
}
impl ast::ModuleItemOwner for ItemList {}
impl ItemList {
pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Abi {
pub(crate) syntax: SyntaxNode,
}
impl Abi {}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TypeParamList { pub struct TypeParamList {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
@ -367,11 +376,10 @@ impl TypeBoundList {
pub fn bounds(&self) -> AstChildren<TypeBound> { support::children(&self.syntax) } pub fn bounds(&self) -> AstChildren<TypeBound> { support::children(&self.syntax) }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ItemList { pub struct AssocItemList {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
impl ast::ModuleItemOwner for ItemList {} impl AssocItemList {
impl ItemList {
pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) } pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
pub fn assoc_items(&self) -> AstChildren<AssocItem> { support::children(&self.syntax) } pub fn assoc_items(&self) -> AstChildren<AssocItem> { support::children(&self.syntax) }
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!['}']) }
@ -1336,10 +1344,10 @@ pub enum AssocItem {
FnDef(FnDef), FnDef(FnDef),
TypeAliasDef(TypeAliasDef), TypeAliasDef(TypeAliasDef),
ConstDef(ConstDef), ConstDef(ConstDef),
MacroCall(MacroCall),
} }
impl ast::AttrsOwner for AssocItem {} impl ast::AttrsOwner for AssocItem {}
impl ast::NameOwner for AssocItem {} impl ast::NameOwner for AssocItem {}
impl ast::VisibilityOwner for AssocItem {}
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Pat { pub enum Pat {
OrPat(OrPat), OrPat(OrPat),
@ -1574,8 +1582,8 @@ impl AstNode for Visibility {
} }
fn syntax(&self) -> &SyntaxNode { &self.syntax } fn syntax(&self) -> &SyntaxNode { &self.syntax }
} }
impl AstNode for Abi { impl AstNode for Name {
fn can_cast(kind: SyntaxKind) -> bool { kind == ABI } fn can_cast(kind: SyntaxKind) -> bool { kind == NAME }
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 })
@ -1585,8 +1593,19 @@ impl AstNode for Abi {
} }
fn syntax(&self) -> &SyntaxNode { &self.syntax } fn syntax(&self) -> &SyntaxNode { &self.syntax }
} }
impl AstNode for Name { impl AstNode for ItemList {
fn can_cast(kind: SyntaxKind) -> bool { kind == NAME } fn can_cast(kind: SyntaxKind) -> bool { kind == ITEM_LIST }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
} else {
None
}
}
fn syntax(&self) -> &SyntaxNode { &self.syntax }
}
impl AstNode for Abi {
fn can_cast(kind: SyntaxKind) -> bool { kind == ABI }
fn cast(syntax: SyntaxNode) -> Option<Self> { fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) { if Self::can_cast(syntax.kind()) {
Some(Self { syntax }) Some(Self { syntax })
@ -1728,8 +1747,8 @@ impl AstNode for TypeBoundList {
} }
fn syntax(&self) -> &SyntaxNode { &self.syntax } fn syntax(&self) -> &SyntaxNode { &self.syntax }
} }
impl AstNode for ItemList { impl AstNode for AssocItemList {
fn can_cast(kind: SyntaxKind) -> bool { kind == ITEM_LIST } fn can_cast(kind: SyntaxKind) -> bool { kind == ASSOC_ITEM_LIST }
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 })
@ -3144,10 +3163,13 @@ impl From<TypeAliasDef> for AssocItem {
impl From<ConstDef> for AssocItem { impl From<ConstDef> for AssocItem {
fn from(node: ConstDef) -> AssocItem { AssocItem::ConstDef(node) } fn from(node: ConstDef) -> AssocItem { AssocItem::ConstDef(node) }
} }
impl From<MacroCall> for AssocItem {
fn from(node: MacroCall) -> AssocItem { AssocItem::MacroCall(node) }
}
impl AstNode for AssocItem { impl AstNode for AssocItem {
fn can_cast(kind: SyntaxKind) -> bool { fn can_cast(kind: SyntaxKind) -> bool {
match kind { match kind {
FN_DEF | TYPE_ALIAS_DEF | CONST_DEF => true, FN_DEF | TYPE_ALIAS_DEF | CONST_DEF | MACRO_CALL => true,
_ => false, _ => false,
} }
} }
@ -3156,6 +3178,7 @@ impl AstNode for AssocItem {
FN_DEF => AssocItem::FnDef(FnDef { syntax }), FN_DEF => AssocItem::FnDef(FnDef { syntax }),
TYPE_ALIAS_DEF => AssocItem::TypeAliasDef(TypeAliasDef { syntax }), TYPE_ALIAS_DEF => AssocItem::TypeAliasDef(TypeAliasDef { syntax }),
CONST_DEF => AssocItem::ConstDef(ConstDef { syntax }), CONST_DEF => AssocItem::ConstDef(ConstDef { syntax }),
MACRO_CALL => AssocItem::MacroCall(MacroCall { syntax }),
_ => return None, _ => return None,
}; };
Some(res) Some(res)
@ -3165,6 +3188,7 @@ impl AstNode for AssocItem {
AssocItem::FnDef(it) => &it.syntax, AssocItem::FnDef(it) => &it.syntax,
AssocItem::TypeAliasDef(it) => &it.syntax, AssocItem::TypeAliasDef(it) => &it.syntax,
AssocItem::ConstDef(it) => &it.syntax, AssocItem::ConstDef(it) => &it.syntax,
AssocItem::MacroCall(it) => &it.syntax,
} }
} }
} }
@ -3515,12 +3539,17 @@ impl std::fmt::Display for Visibility {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
} }
} }
impl std::fmt::Display for Abi { impl std::fmt::Display for Name {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 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)
} }
} }
impl std::fmt::Display for Name { impl std::fmt::Display for ItemList {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}
}
impl std::fmt::Display for Abi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 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)
} }
@ -3585,7 +3614,7 @@ impl std::fmt::Display for TypeBoundList {
std::fmt::Display::fmt(self.syntax(), f) std::fmt::Display::fmt(self.syntax(), f)
} }
} }
impl std::fmt::Display for ItemList { impl std::fmt::Display for AssocItemList {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 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

@ -186,6 +186,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
"TUPLE_FIELD_DEF", "TUPLE_FIELD_DEF",
"ENUM_VARIANT_LIST", "ENUM_VARIANT_LIST",
"ITEM_LIST", "ITEM_LIST",
"ASSOC_ITEM_LIST",
"ATTR", "ATTR",
"META_ITEM", // not an item actually "META_ITEM", // not an item actually
"USE_TREE", "USE_TREE",

View file

@ -19,6 +19,13 @@ Item =
| UnionDef | UnionDef
| UseItem | UseItem
Module =
Attr* Visibility? 'mod' Name
(ItemList | ';')
ItemList =
'{' Item* '}'
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?
@ -67,17 +74,10 @@ EnumVariant =
TraitDef = TraitDef =
Attr* Visibility? 'unsafe'? 'auto'? 'trait' Name TypeParamList Attr* Visibility? 'unsafe'? 'auto'? 'trait' Name TypeParamList
(':' TypeBoundList?)? WhereClause (':' TypeBoundList?)? WhereClause
ItemList AssocItemList
Module = AssocItemList =
Attr* Visibility? 'mod' Name '{' AssocItem* '}'
(ItemList | ';')
ItemList =
'{'
AssocItem*
Item*
'}'
ConstDef = ConstDef =
Attr* Visibility? 'default'? 'const' Name ':' ascribed_type:TypeRef Attr* Visibility? 'default'? 'const' Name ':' ascribed_type:TypeRef
@ -94,7 +94,7 @@ TypeAliasDef =
ImplDef = ImplDef =
Attr* Visibility? 'const'? 'default'? 'unsafe'? 'impl' TypeParamList? '!'? 'for' Attr* Visibility? 'const'? 'default'? 'unsafe'? 'impl' TypeParamList? '!'? 'for'
WhereClause? WhereClause?
ItemList AssocItemList
ParenType = ParenType =
'(' TypeRef ')' '(' TypeRef ')'
@ -467,6 +467,7 @@ AssocItem =
FnDef FnDef
| TypeAliasDef | TypeAliasDef
| ConstDef | ConstDef
| MacroCall
ExternItem = ExternItem =
FnDef | StaticDef FnDef | StaticDef