sway_parse/item/
item_abi.rs

1use crate::{Parse, ParseBracket, ParseResult, Parser};
2
3use sway_ast::attribute::Annotated;
4use sway_ast::{Braces, ItemAbi, ItemFn, ItemTraitItem};
5
6impl Parse for ItemAbi {
7    fn parse(parser: &mut Parser) -> ParseResult<ItemAbi> {
8        let abi_token = parser.parse()?;
9        let name = parser.parse()?;
10        let super_traits = match parser.take() {
11            Some(colon_token) => {
12                let traits = parser.parse()?;
13                Some((colon_token, traits))
14            }
15            None => None,
16        };
17
18        let abi_items: Braces<Vec<Annotated<ItemTraitItem>>> = parser.parse()?;
19        for annotated in abi_items.get().iter() {
20            #[allow(irrefutable_let_patterns)]
21            if let ItemTraitItem::Fn(fn_signature, _) = &annotated.value {
22                parser.ban_visibility_qualifier(&fn_signature.visibility)?;
23            }
24        }
25
26        let abi_defs_opt: Option<Braces<Vec<Annotated<ItemFn>>>> = Braces::try_parse(parser)?;
27        if let Some(abi_defs) = &abi_defs_opt {
28            for item_fn in abi_defs.get().iter() {
29                parser.ban_visibility_qualifier(&item_fn.value.fn_signature.visibility)?;
30            }
31        }
32        Ok(ItemAbi {
33            abi_token,
34            name,
35            super_traits,
36            abi_items,
37            abi_defs_opt,
38        })
39    }
40}