sway_parse/item/
item_trait.rs

1use crate::{Parse, ParseBracket, ParseResult, Parser};
2
3use sway_ast::attribute::Annotated;
4use sway_ast::keywords::{ConstToken, FnToken, OpenAngleBracketToken, TypeToken, WhereToken};
5use sway_ast::{Braces, ItemFn, ItemTrait, ItemTraitItem, PubToken, Traits};
6use sway_error::parser_error::ParseErrorKind;
7
8impl Parse for ItemTraitItem {
9    fn parse(parser: &mut Parser) -> ParseResult<ItemTraitItem> {
10        if parser.peek::<PubToken>().is_some() || parser.peek::<FnToken>().is_some() {
11            let fn_decl = parser.parse()?;
12            let semicolon = parser.parse().ok();
13            Ok(ItemTraitItem::Fn(fn_decl, semicolon))
14        } else if let Some(_const_keyword) = parser.peek::<ConstToken>() {
15            let const_decl = parser.parse()?;
16            let semicolon = parser.parse().ok();
17            Ok(ItemTraitItem::Const(const_decl, semicolon))
18        } else if let Some(_type_keyword) = parser.peek::<TypeToken>() {
19            let type_decl = parser.parse()?;
20            let semicolon = parser.parse().ok();
21            Ok(ItemTraitItem::Type(type_decl, semicolon))
22        } else {
23            Err(parser.emit_error(ParseErrorKind::ExpectedAnItem))
24        }
25    }
26
27    fn error(
28        spans: Box<[sway_types::Span]>,
29        error: sway_error::handler::ErrorEmitted,
30    ) -> Option<Self>
31    where
32        Self: Sized,
33    {
34        Some(ItemTraitItem::Error(spans, error))
35    }
36}
37
38impl Parse for ItemTrait {
39    fn parse(parser: &mut Parser) -> ParseResult<ItemTrait> {
40        let visibility = parser.take();
41        let trait_token = parser.parse()?;
42        let name = parser.parse()?;
43        let generics = parser.guarded_parse::<OpenAngleBracketToken, _>()?;
44        let super_traits = match parser.take() {
45            Some(colon_token) => {
46                let traits = parser.parse()?;
47                Some((colon_token, traits))
48            }
49            None => None,
50        };
51        let where_clause_opt = parser.guarded_parse::<WhereToken, _>()?;
52
53        let trait_items: Braces<Vec<Annotated<ItemTraitItem>>> = parser.parse()?;
54        for item in trait_items.get().iter() {
55            if let ItemTraitItem::Fn(fn_sig, _) = &item.value {
56                parser.ban_visibility_qualifier(&fn_sig.visibility)?;
57            }
58        }
59
60        let trait_defs_opt: Option<Braces<Vec<Annotated<ItemFn>>>> = Braces::try_parse(parser)?;
61        if let Some(trait_defs) = &trait_defs_opt {
62            for item in trait_defs.get().iter() {
63                parser.ban_visibility_qualifier(&item.value.fn_signature.visibility)?;
64            }
65        }
66
67        Ok(ItemTrait {
68            visibility,
69            trait_token,
70            name,
71            generics,
72            where_clause_opt,
73            super_traits,
74            trait_items,
75            trait_defs_opt,
76        })
77    }
78}
79
80impl Parse for Traits {
81    fn parse(parser: &mut Parser) -> ParseResult<Traits> {
82        let prefix = parser.parse()?;
83        let mut suffixes = Vec::new();
84        while let Some(add_token) = parser.take() {
85            let suffix = parser.parse()?;
86            suffixes.push((add_token, suffix));
87        }
88        let traits = Traits { prefix, suffixes };
89        Ok(traits)
90    }
91}