Skip to main content

tsz_parser/parser/
mod.rs

1//! Parser types - AST node definitions for TypeScript.
2//!
3//! This module defines the AST node types that match TypeScript's parser output.
4//! The goal is to produce an identical AST structure that can be serialized and
5//! consumed by the TypeScript type checker.
6//!
7//! DESIGN NOTES:
8//! - We use arena allocation (indices) rather than Box/Rc for node references
9//! - All nodes have common fields: kind, flags, pos, end
10//! - Node-specific data is stored in enum variants
11//! - This design allows efficient serialization to/from JavaScript
12//!
13//! PERFORMANCE NOTES:
14//! - The `node` module provides a cache-optimized 16-byte node representation
15//! - Current `Node` enum is 208 bytes (0.31 nodes/cache-line)
16//! - Node is 16 bytes (4 nodes/cache-line) - 13x better cache locality
17
18pub mod base;
19pub mod flags;
20pub mod node;
21mod node_access;
22mod node_arena;
23mod node_modifiers;
24pub mod parse_rules;
25pub(crate) mod spelling;
26pub mod state;
27mod state_declarations;
28mod state_declarations_exports;
29mod state_expressions;
30mod state_expressions_literals;
31mod state_statements;
32mod state_statements_class;
33mod state_statements_class_members;
34mod state_types;
35mod state_types_jsx;
36
37#[cfg(test)]
38#[path = "../../tests/parser_improvement_tests.rs"]
39mod parser_improvement_tests;
40#[cfg(test)]
41#[path = "../../tests/tests.rs"]
42mod tests;
43
44#[cfg(test)]
45#[path = "../../tests/trailing_comma_tests.rs"]
46mod trailing_comma_tests;
47
48#[cfg(test)]
49#[path = "../../tests/spelling_integration_tests.rs"]
50mod spelling_integration_tests;
51
52#[cfg(test)]
53#[path = "../../tests/duplicate_label_tests.rs"]
54mod duplicate_label_tests;
55
56#[cfg(test)]
57#[path = "../../tests/jsx_unclosed_tag_tests.rs"]
58mod jsx_unclosed_tag_tests;
59
60#[cfg(test)]
61#[path = "../../tests/state_expression_tests.rs"]
62mod state_expression_tests;
63
64#[cfg(test)]
65#[path = "../../tests/state_statement_tests.rs"]
66mod state_statement_tests;
67
68#[cfg(test)]
69#[path = "../../tests/state_type_tests.rs"]
70mod state_type_tests;
71
72#[cfg(test)]
73#[path = "../../tests/state_declaration_tests.rs"]
74mod state_declaration_tests;
75
76#[cfg(test)]
77#[path = "../../tests/decorator_tests.rs"]
78mod decorator_tests;
79
80// Re-export flags
81pub use flags::{modifier_flags, node_flags, transform_flags};
82
83// Re-export base types used throughout the thin pipeline
84pub use base::{NodeIndex, NodeList, TextRange};
85
86// Legacy fat AST has been removed; NodeArena is the only AST representation.
87pub use node::NodeArena;
88
89// Parser implementation (NodeArena-based).
90pub use state::{ParseDiagnostic, ParserState};
91
92/// Extended `SyntaxKind` values for AST nodes that are not tokens.
93/// These match TypeScript's `SyntaxKind` enum values exactly.
94pub mod syntax_kind_ext {
95    // First AST node kinds (after tokens, starting at 167)
96    pub const QUALIFIED_NAME: u16 = 167;
97    pub const COMPUTED_PROPERTY_NAME: u16 = 168;
98    pub const TYPE_PARAMETER: u16 = 169;
99    pub const PARAMETER: u16 = 170;
100    pub const DECORATOR: u16 = 171;
101    pub const PROPERTY_SIGNATURE: u16 = 172;
102    pub const PROPERTY_DECLARATION: u16 = 173;
103    pub const METHOD_SIGNATURE: u16 = 174;
104    pub const METHOD_DECLARATION: u16 = 175;
105    pub const CLASS_STATIC_BLOCK_DECLARATION: u16 = 176;
106    pub const CONSTRUCTOR: u16 = 177;
107    pub const GET_ACCESSOR: u16 = 178;
108    pub const SET_ACCESSOR: u16 = 179;
109    pub const CALL_SIGNATURE: u16 = 180;
110    pub const CONSTRUCT_SIGNATURE: u16 = 181;
111    pub const INDEX_SIGNATURE: u16 = 182;
112
113    // Type nodes
114    pub const TYPE_PREDICATE: u16 = 183;
115    pub const TYPE_REFERENCE: u16 = 184;
116    pub const FUNCTION_TYPE: u16 = 185;
117    pub const CONSTRUCTOR_TYPE: u16 = 186;
118    pub const TYPE_QUERY: u16 = 187;
119    pub const TYPE_LITERAL: u16 = 188;
120    pub const ARRAY_TYPE: u16 = 189;
121    pub const TUPLE_TYPE: u16 = 190;
122    pub const OPTIONAL_TYPE: u16 = 191;
123    pub const REST_TYPE: u16 = 192;
124    pub const UNION_TYPE: u16 = 193;
125    pub const INTERSECTION_TYPE: u16 = 194;
126    pub const CONDITIONAL_TYPE: u16 = 195;
127    pub const INFER_TYPE: u16 = 196;
128    pub const PARENTHESIZED_TYPE: u16 = 197;
129    pub const THIS_TYPE: u16 = 198;
130    pub const TYPE_OPERATOR: u16 = 199;
131    pub const INDEXED_ACCESS_TYPE: u16 = 200;
132    pub const MAPPED_TYPE: u16 = 201;
133    pub const LITERAL_TYPE: u16 = 202;
134    pub const NAMED_TUPLE_MEMBER: u16 = 203;
135    pub const TEMPLATE_LITERAL_TYPE: u16 = 204;
136    pub const TEMPLATE_LITERAL_TYPE_SPAN: u16 = 205;
137    pub const IMPORT_TYPE: u16 = 206;
138
139    // Binding patterns
140    pub const OBJECT_BINDING_PATTERN: u16 = 207;
141    pub const ARRAY_BINDING_PATTERN: u16 = 208;
142    pub const BINDING_ELEMENT: u16 = 209;
143
144    // Expression
145    pub const ARRAY_LITERAL_EXPRESSION: u16 = 210;
146    pub const OBJECT_LITERAL_EXPRESSION: u16 = 211;
147    pub const PROPERTY_ACCESS_EXPRESSION: u16 = 212;
148    pub const ELEMENT_ACCESS_EXPRESSION: u16 = 213;
149    pub const CALL_EXPRESSION: u16 = 214;
150    pub const NEW_EXPRESSION: u16 = 215;
151    pub const TAGGED_TEMPLATE_EXPRESSION: u16 = 216;
152    pub const TYPE_ASSERTION: u16 = 217;
153    pub const PARENTHESIZED_EXPRESSION: u16 = 218;
154    pub const FUNCTION_EXPRESSION: u16 = 219;
155    pub const ARROW_FUNCTION: u16 = 220;
156    pub const DELETE_EXPRESSION: u16 = 221;
157    pub const TYPE_OF_EXPRESSION: u16 = 222;
158    pub const VOID_EXPRESSION: u16 = 223;
159    pub const AWAIT_EXPRESSION: u16 = 224;
160    pub const PREFIX_UNARY_EXPRESSION: u16 = 225;
161    pub const POSTFIX_UNARY_EXPRESSION: u16 = 226;
162    pub const BINARY_EXPRESSION: u16 = 227;
163    pub const CONDITIONAL_EXPRESSION: u16 = 228;
164    pub const TEMPLATE_EXPRESSION: u16 = 229;
165    pub const YIELD_EXPRESSION: u16 = 230;
166    pub const SPREAD_ELEMENT: u16 = 231;
167    pub const CLASS_EXPRESSION: u16 = 232;
168    pub const OMITTED_EXPRESSION: u16 = 233;
169    pub const EXPRESSION_WITH_TYPE_ARGUMENTS: u16 = 234;
170    pub const AS_EXPRESSION: u16 = 235;
171    pub const NON_NULL_EXPRESSION: u16 = 236;
172    pub const META_PROPERTY: u16 = 237;
173    pub const SYNTHETIC_EXPRESSION: u16 = 238;
174    pub const SATISFIES_EXPRESSION: u16 = 239;
175
176    // Misc
177    pub const TEMPLATE_SPAN: u16 = 240;
178    pub const SEMICOLON_CLASS_ELEMENT: u16 = 241;
179
180    // Statements
181    pub const BLOCK: u16 = 242;
182    pub const EMPTY_STATEMENT: u16 = 243;
183    pub const VARIABLE_STATEMENT: u16 = 244;
184    pub const EXPRESSION_STATEMENT: u16 = 245;
185    pub const IF_STATEMENT: u16 = 246;
186    pub const DO_STATEMENT: u16 = 247;
187    pub const WHILE_STATEMENT: u16 = 248;
188    pub const FOR_STATEMENT: u16 = 249;
189    pub const FOR_IN_STATEMENT: u16 = 250;
190    pub const FOR_OF_STATEMENT: u16 = 251;
191    pub const CONTINUE_STATEMENT: u16 = 252;
192    pub const BREAK_STATEMENT: u16 = 253;
193    pub const RETURN_STATEMENT: u16 = 254;
194    pub const WITH_STATEMENT: u16 = 255;
195    pub const SWITCH_STATEMENT: u16 = 256;
196    pub const LABELED_STATEMENT: u16 = 257;
197    pub const THROW_STATEMENT: u16 = 258;
198    pub const TRY_STATEMENT: u16 = 259;
199    pub const DEBUGGER_STATEMENT: u16 = 260;
200
201    // Declarations
202    pub const VARIABLE_DECLARATION: u16 = 261;
203    pub const VARIABLE_DECLARATION_LIST: u16 = 262;
204    pub const FUNCTION_DECLARATION: u16 = 263;
205    pub const CLASS_DECLARATION: u16 = 264;
206    pub const INTERFACE_DECLARATION: u16 = 265;
207    pub const TYPE_ALIAS_DECLARATION: u16 = 266;
208    pub const ENUM_DECLARATION: u16 = 267;
209    pub const MODULE_DECLARATION: u16 = 268;
210    pub const MODULE_BLOCK: u16 = 269;
211    pub const CASE_BLOCK: u16 = 270;
212    pub const NAMESPACE_EXPORT_DECLARATION: u16 = 271;
213    pub const IMPORT_EQUALS_DECLARATION: u16 = 272;
214    pub const IMPORT_DECLARATION: u16 = 273;
215    pub const IMPORT_CLAUSE: u16 = 274;
216    pub const NAMESPACE_IMPORT: u16 = 275;
217    pub const NAMED_IMPORTS: u16 = 276;
218    pub const IMPORT_SPECIFIER: u16 = 277;
219    pub const EXPORT_ASSIGNMENT: u16 = 278;
220    pub const EXPORT_DECLARATION: u16 = 279;
221    pub const NAMED_EXPORTS: u16 = 280;
222    pub const NAMESPACE_EXPORT: u16 = 281;
223    pub const EXPORT_SPECIFIER: u16 = 282;
224    pub const MISSING_DECLARATION: u16 = 283;
225
226    // Module references
227    pub const EXTERNAL_MODULE_REFERENCE: u16 = 284;
228
229    // JSX
230    pub const JSX_ELEMENT: u16 = 285;
231    pub const JSX_SELF_CLOSING_ELEMENT: u16 = 286;
232    pub const JSX_OPENING_ELEMENT: u16 = 287;
233    pub const JSX_CLOSING_ELEMENT: u16 = 288;
234    pub const JSX_FRAGMENT: u16 = 289;
235    pub const JSX_OPENING_FRAGMENT: u16 = 290;
236    pub const JSX_CLOSING_FRAGMENT: u16 = 291;
237    pub const JSX_ATTRIBUTE: u16 = 292;
238    pub const JSX_ATTRIBUTES: u16 = 293;
239    pub const JSX_SPREAD_ATTRIBUTE: u16 = 294;
240    pub const JSX_EXPRESSION: u16 = 295;
241    pub const JSX_NAMESPACED_NAME: u16 = 296;
242
243    // Clauses
244    pub const CASE_CLAUSE: u16 = 297;
245    pub const DEFAULT_CLAUSE: u16 = 298;
246    pub const HERITAGE_CLAUSE: u16 = 299;
247    pub const CATCH_CLAUSE: u16 = 300;
248    pub const IMPORT_ATTRIBUTES: u16 = 301;
249    pub const IMPORT_ATTRIBUTE: u16 = 302;
250
251    // Property assignments
252    pub const PROPERTY_ASSIGNMENT: u16 = 303;
253    pub const SHORTHAND_PROPERTY_ASSIGNMENT: u16 = 304;
254    pub const SPREAD_ASSIGNMENT: u16 = 305;
255
256    // Enum
257    pub const ENUM_MEMBER: u16 = 306;
258
259    // Unparsed (for incremental)
260    pub const UNPARSED_PROLOGUE: u16 = 307;
261
262    // Top-level nodes
263    pub const SOURCE_FILE: u16 = 308;
264    pub const BUNDLE: u16 = 309;
265
266    // First JSDoc node (310) ... we'll add these as needed
267}