sway_parse/item/
item_use.rs

1use 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                // parser recovery for foo::
35                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}