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::{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_types::{span::Source, SourceId};
37
38pub fn parse_file(
39    handler: &Handler,
40    src: Source,
41    source_id: Option<SourceId>,
42) -> Result<Annotated<Module>, ErrorEmitted> {
43    let end = src.text.len();
44    let ts = lex(handler, src, 0, end, source_id)?;
45    let (m, _) = Parser::new(handler, &ts).parse_to_end()?;
46    Ok(m)
47}
48
49pub fn parse_module_kind(
50    handler: &Handler,
51    src: Source,
52    source_id: Option<SourceId>,
53) -> Result<ModuleKind, ErrorEmitted> {
54    let end = src.text.len();
55    let ts = lex(handler, src, 0, end, source_id)?;
56    let mut parser = Parser::new(handler, &ts);
57    while let Some(DocComment {
58        doc_style: DocStyle::Inner,
59        ..
60    }) = parser.peek()
61    {
62        parser.parse::<DocComment>()?;
63    }
64    parser.parse()
65}
66
67#[cfg(test)]
68mod tests {
69    use crate::*;
70
71    #[test]
72    fn parse_invalid() {
73        // just make sure these do not panic
74        let _res = parse_file(&Handler::default(), "script; fn main(256߄".into(), None);
75        let _res = parse_file(
76            &Handler::default(),
77            "script;
78            fn karr() {
79                let c: f828 =  0x00000000000000000000000vncifxp;
80            abi Zezybt {
81                #[mfzbezc, storage(r#
82            true }
83            }
84            cug"
85            .into(),
86            None,
87        );
88        let _res = parse_file(
89            &Handler::default(),
90            "script;
91
92            stdfn main() {
93                let a: b256 =  0x000>0000000scri s = \"flibrary I24;
94
95            use std::primitives::*;
96            use std::assert::assert;
97
98            ///\u{7eb}"
99                .into(),
100            None,
101        );
102        let _res = parse_file(&Handler::default(), "script; \"\u{7eb}\u{7eb}".into(), None);
103    }
104}