Skip to main content

svelte_syntax/parse/
mod.rs

1mod component;
2mod css;
3mod oxc;
4mod oxc_query;
5mod scan;
6
7use std::sync::Arc;
8use std::cell::Cell;
9
10use crate::ast::{CssAst, modern::CssNode};
11use crate::error::CompileError;
12use crate::js::JsProgram;
13
14// Thread-local parse timing counters for profiling.
15thread_local! {
16    static OXC_EXPR_TIME_US: Cell<u64> = const { Cell::new(0) };
17    static OXC_EXPR_COUNT: Cell<u64> = const { Cell::new(0) };
18    static OXC_PROGRAM_TIME_US: Cell<u64> = const { Cell::new(0) };
19    static OXC_PROGRAM_COUNT: Cell<u64> = const { Cell::new(0) };
20}
21
22/// Reset all thread-local parse timing counters.
23pub fn reset_parse_counters() {
24    OXC_EXPR_TIME_US.set(0);
25    OXC_EXPR_COUNT.set(0);
26    OXC_PROGRAM_TIME_US.set(0);
27    OXC_PROGRAM_COUNT.set(0);
28}
29
30/// Snapshot of thread-local parse timing counters.
31#[derive(Debug, Clone)]
32pub struct ParseCounters {
33    pub oxc_expr_us: u64,
34    pub oxc_expr_count: u64,
35    pub oxc_program_us: u64,
36    pub oxc_program_count: u64,
37}
38
39/// Read current thread-local parse timing counters.
40pub fn read_parse_counters() -> ParseCounters {
41    ParseCounters {
42        oxc_expr_us: OXC_EXPR_TIME_US.get(),
43        oxc_expr_count: OXC_EXPR_COUNT.get(),
44        oxc_program_us: OXC_PROGRAM_TIME_US.get(),
45        oxc_program_count: OXC_PROGRAM_COUNT.get(),
46    }
47}
48pub use component::modern::{
49    find_matching_brace_close, legacy_expression_from_modern_expression, line_column_at_offset,
50    parse_modern_expression_from_text, parse_modern_expression_tag,
51};
52pub use component::{
53    AttributeKind, ElementKind, SvelteElementKind, classify_attribute_name, classify_element_name,
54    is_component_name, is_custom_element_name, is_valid_component_name, is_valid_element_name,
55    is_void_element_name,
56};
57pub use component::{
58    ParseMode, ParseOptions, ParseTimings, legacy_root_from_modern, parse,
59    parse_legacy_root_from_cst, parse_modern_root, parse_modern_root_incremental,
60    parse_modern_root_timed,
61};
62pub(crate) use scan::find_valid_legacy_closing_tag_start;
63pub use scan::parse_svelte_ignores;
64
65pub(crate) struct ParsedProgramContent {
66    pub parsed: Arc<JsProgram>,
67}
68
69pub fn parse_css(source: &str) -> Result<CssAst, CompileError> {
70    css::parse_css_stylesheet(source)
71}
72
73pub fn parse_modern_css_nodes(source: &str, start: usize, end: usize) -> Vec<CssNode> {
74    css::parse_modern_css_nodes(source, start, end)
75}
76
77pub(crate) fn parse_modern_program_content_with_offsets(
78    snippet: &str,
79    global_start: usize,
80    _start_line: usize,
81    _start_column: usize,
82    _end_line: usize,
83    _end_column: usize,
84    is_ts: bool,
85) -> Option<ParsedProgramContent> {
86    let t = std::time::Instant::now();
87    let result = oxc::SvelteOxcParser::new(snippet)
88        .with_offsets(oxc::OxcProgramOffsets { global_start })
89        .parse_program_for_compile(is_ts);
90    let elapsed = t.elapsed().as_micros() as u64;
91    OXC_PROGRAM_TIME_US.set(OXC_PROGRAM_TIME_US.get() + elapsed);
92    OXC_PROGRAM_COUNT.set(OXC_PROGRAM_COUNT.get() + 1);
93    result
94}
95
96pub(crate) fn parse_modern_expression_with_oxc(
97    expression: &str,
98    global_start: usize,
99    _base_line: usize,
100    _base_column: usize,
101) -> Option<crate::ast::modern::Expression> {
102    let t = std::time::Instant::now();
103    let result = oxc::SvelteOxcParser::new(expression)
104        .with_offsets(oxc::OxcProgramOffsets { global_start })
105        .parse_expression_for_template();
106    let elapsed = t.elapsed().as_micros() as u64;
107    OXC_EXPR_TIME_US.set(OXC_EXPR_TIME_US.get() + elapsed);
108    OXC_EXPR_COUNT.set(OXC_EXPR_COUNT.get() + 1);
109    result
110}
111
112pub(crate) fn parse_modern_expression_error_with_oxc(
113    expression: &str,
114    global_start: usize,
115    _base_line: usize,
116    _base_column: usize,
117) -> Option<std::sync::Arc<str>> {
118    oxc::SvelteOxcParser::new(expression)
119        .with_offsets(oxc::OxcProgramOffsets { global_start })
120        .parse_expression_error_for_template()
121}
122
123pub(crate) fn parse_modern_expression_error_detail_with_oxc(
124    expression: &str,
125    global_start: usize,
126    _base_line: usize,
127    _base_column: usize,
128) -> Option<(usize, std::sync::Arc<str>)> {
129    oxc::SvelteOxcParser::new(expression)
130        .with_offsets(oxc::OxcProgramOffsets { global_start })
131        .parse_expression_error_detail_for_template()
132}