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