sway_parse/item/
item_use.rs1use crate::{Parse, ParseBracket, ParseResult, Parser};
2
3use sway_ast::{Braces, ItemUse, UseTree};
4use sway_error::parser_error::ParseErrorKind;
5use sway_types::Spanned;
6
7impl Parse for UseTree {
8 fn parse(parser: &mut Parser) -> ParseResult<UseTree> {
9 if let Some(imports) = Braces::try_parse(parser)? {
10 return Ok(UseTree::Group { imports });
11 }
12 if let Some(star_token) = parser.take() {
13 return Ok(UseTree::Glob { star_token });
14 }
15 let name = parser
16 .take()
17 .ok_or_else(|| parser.emit_error(ParseErrorKind::ExpectedImportNameGroupOrGlob))?;
18 if let Some(as_token) = parser.take() {
19 let alias = parser.parse()?;
20 return Ok(UseTree::Rename {
21 name,
22 as_token,
23 alias,
24 });
25 }
26 if let Some(double_colon_token) = parser.take() {
27 if let Ok(suffix) = parser.parse() {
28 return Ok(UseTree::Path {
29 prefix: name,
30 double_colon_token,
31 suffix,
32 });
33 } else {
34 return Ok(UseTree::Error {
36 spans: Box::new([name.span(), double_colon_token.span()]),
37 });
38 }
39 }
40 Ok(UseTree::Name { name })
41 }
42}
43
44impl Parse for ItemUse {
45 fn parse(parser: &mut Parser) -> ParseResult<ItemUse> {
46 let use_token = parser.parse()?;
47 let root_import = parser.take();
48 let tree = parser.parse()?;
49 let semicolon_token = parser.parse()?;
50 Ok(ItemUse {
51 visibility: None,
52 use_token,
53 root_import,
54 tree,
55 semicolon_token,
56 })
57 }
58}