sway_parse/item/
item_trait.rs1use 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}