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::SourceId;
37
38use std::sync::Arc;
39
40pub fn parse_file(
41    handler: &Handler,
42    src: Arc<str>,
43    source_id: Option<SourceId>,
44) -> Result<Annotated<Module>, ErrorEmitted> {
45    let ts = lex(handler, &src, 0, src.len(), source_id)?;
46    let (m, _) = Parser::new(handler, &ts).parse_to_end()?;
47    Ok(m)
48}
49
50pub fn parse_module_kind(
51    handler: &Handler,
52    src: Arc<str>,
53    source_id: Option<SourceId>,
54) -> Result<ModuleKind, ErrorEmitted> {
55    let ts = lex(handler, &src, 0, src.len(), 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(), Arc::from("script; fn main(256߄"), None);
75        let _res = parse_file(
76            &Handler::default(),
77            Arc::from(
78                "script;
79            fn karr() {
80                let c: f828 =  0x00000000000000000000000vncifxp;
81            abi Zezybt {
82                #[mfzbezc, storage(r#
83            true }
84            }
85            cug",
86            ),
87            None,
88        );
89        let _res = parse_file(
90            &Handler::default(),
91            Arc::from(
92                "script;
93
94            stdfn main() {
95                let a: b256 =  0x000>0000000scri s = \"flibrary I24;
96
97            use std::primitives::*;
98            use std::assert::assert;
99
100            ///\u{7eb}",
101            ),
102            None,
103        );
104        let _res = parse_file(
105            &Handler::default(),
106            Arc::from("script; \"\u{7eb}\u{7eb}"),
107            None,
108        );
109    }
110}