Skip to content

Commit 396d1d8

Browse files
Enable macro invocation in statement position (#7843)
1 parent ecb0c78 commit 396d1d8

File tree

4 files changed

+347
-137
lines changed

4 files changed

+347
-137
lines changed

crates/cairo-lang-parser/src/db.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder, Maybe, ToMaybe};
22
use cairo_lang_filesystem::db::FilesGroup;
33
use cairo_lang_filesystem::ids::{FileId, FileKind};
4-
use cairo_lang_syntax::node::ast::{Expr, SyntaxFile};
4+
use cairo_lang_syntax::node::ast::{Expr, StatementList, SyntaxFile};
55
use cairo_lang_syntax::node::db::SyntaxGroup;
66
use cairo_lang_syntax::node::{SyntaxNode, TypedSyntaxNode};
77
use cairo_lang_utils::Upcast;
@@ -69,3 +69,16 @@ pub fn file_syntax_diagnostics(
6969
) -> Diagnostics<ParserDiagnostic> {
7070
db.priv_file_syntax_data(file_id).diagnostics
7171
}
72+
73+
/// Parses the given file content as a list of statements using the statement-list parser.
74+
pub fn file_statement_list_syntax(db: &dyn ParserGroup, file_id: FileId) -> Maybe<StatementList> {
75+
let content = db.file_content(file_id).to_maybe()?;
76+
let mut diagnostics = DiagnosticsBuilder::default();
77+
let statement_list = crate::parser::Parser::parse_file_statement_list(
78+
db.upcast(),
79+
&mut diagnostics,
80+
file_id,
81+
&content,
82+
);
83+
Ok(statement_list)
84+
}

crates/cairo-lang-parser/src/parser.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,26 @@ impl<'a> Parser<'a> {
176176
Expr::from_syntax_node(db, SyntaxNode::new_root(db, file_id, green.0))
177177
}
178178

179+
/// Parses a file as a list of statements.
180+
pub fn parse_file_statement_list(
181+
db: &'a dyn SyntaxGroup,
182+
diagnostics: &'a mut DiagnosticsBuilder<ParserDiagnostic>,
183+
file_id: FileId,
184+
text: &'a str,
185+
) -> StatementList {
186+
let mut parser = Parser::new(db, file_id, text, diagnostics);
187+
let statements = StatementList::new_green(
188+
db,
189+
parser.parse_list(Self::try_parse_statement, Self::is_eof, "statement"),
190+
);
191+
StatementList::from_syntax_node(db, SyntaxNode::new_root(db, file_id, statements.0))
192+
}
193+
194+
/// Checks if the given kind is an end of file token.
195+
pub fn is_eof(kind: SyntaxKind) -> bool {
196+
kind == SyntaxKind::TerminalEndOfFile
197+
}
198+
179199
/// Parses a token stream.
180200
pub fn parse_token_stream(
181201
db: &'a dyn SyntaxGroup,

0 commit comments

Comments
 (0)