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 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}