sway_parse/
lib.rs

1mod attribute;
2mod brackets;
3mod expr;
4mod generics;
5mod item;
6mod keywords;
7mod literal;
8mod module;
9mod parse;
10mod parser;
11mod path;
12mod pattern;
13mod priv_prelude;
14mod punctuated;
15mod submodule;
16#[cfg(test)]
17mod test_utils;
18mod token;
19mod ty;
20mod where_clause;
21
22use crate::priv_prelude::*;
23pub use crate::{
24    keywords::RESERVED_KEYWORDS,
25    parse::Parse,
26    parser::Parser,
27    token::{is_valid_identifier_or_path, lex, lex_commented, parse_int_suffix},
28};
29
30use sway_ast::{
31    attribute::Annotated,
32    token::{DocComment, DocStyle},
33    Module, ModuleKind,
34};
35use sway_error::handler::{ErrorEmitted, Handler};
36use sway_features::ExperimentalFeatures;
37use sway_types::{span::Source, SourceId};
38
39pub fn parse_file(
40    handler: &Handler,
41    src: Source,
42    source_id: Option<SourceId>,
43    experimental: ExperimentalFeatures,
44) -> Result<Annotated<Module>, ErrorEmitted> {
45    let end = src.text.len();
46    let ts = lex(handler, src, 0, end, source_id)?;
47    let (m, _) = Parser::new(handler, &ts, experimental).parse_to_end()?;
48    Ok(m)
49}
50
51pub fn parse_module_kind(
52    handler: &Handler,
53    src: Source,
54    source_id: Option<SourceId>,
55    experimental: ExperimentalFeatures,
56) -> Result<ModuleKind, ErrorEmitted> {
57    let end = src.text.len();
58    let ts = lex(handler, src, 0, end, source_id)?;
59    let mut parser = Parser::new(handler, &ts, experimental);
60    while let Some(DocComment {
61        doc_style: DocStyle::Inner,
62        ..
63    }) = parser.peek()
64    {
65        parser.parse::<DocComment>()?;
66    }
67    parser.parse()
68}
69
70#[cfg(test)]
71mod tests {
72    use crate::*;
73
74    #[test]
75    fn parse_invalid() {
76        // just make sure these do not panic
77        let _res = parse_file(
78            &Handler::default(),
79            "script; fn main(256߄".into(),
80            None,
81            ExperimentalFeatures::default(),
82        );
83        let _res = parse_file(
84            &Handler::default(),
85            "script;
86            fn karr() {
87                let c: f828 =  0x00000000000000000000000vncifxp;
88            abi Zezybt {
89                #[mfzbezc, storage(r#
90            true }
91            }
92            cug"
93            .into(),
94            None,
95            ExperimentalFeatures::default(),
96        );
97        let _res = parse_file(
98            &Handler::default(),
99            "script;
100
101            stdfn main() {
102                let a: b256 =  0x000>0000000scri s = \"flibrary I24;
103
104            use std::primitives::*;
105            use std::assert::assert;
106
107            ///\u{7eb}"
108                .into(),
109            None,
110            ExperimentalFeatures::default(),
111        );
112        let _res = parse_file(
113            &Handler::default(),
114            "script; \"\u{7eb}\u{7eb}".into(),
115            None,
116            ExperimentalFeatures::default(),
117        );
118    }
119}