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