1use crate::util::*;
2use crate::*;
3use c2rust_bitfields;
4use std::os;
5pub type __u8 = os::raw::c_uchar;
6pub type __int16_t = os::raw::c_short;
7pub type __u16 = os::raw::c_ushort;
8pub type __int32_t = os::raw::c_int;
9pub type __u32 = os::raw::c_uint;
10pub type __u64 = usize;
11pub type __off_t = isize;
12pub type __off64_t = isize;
13pub type __time_t = isize;
14pub type __clockid_t = os::raw::c_int;
15pub type __syscall_slong_t = isize;
16#[derive(Copy, Clone)]
17#[repr(C)]
18pub struct timespec {
19 pub tv_sec: __time_t,
20 pub tv_nsec: __syscall_slong_t,
21}
22pub type clockid_t = __clockid_t;
23type _IO_FILE = u8;
24pub type _IO_lock_t = ();
25pub type FILE = _IO_FILE;
26pub type int16_t = __int16_t;
27pub type int32_t = __int32_t;
28pub type TSSymbol = u16;
29pub type TSFieldId = u16;
30pub type TSStateId = u16;
31#[derive(Copy, Clone)]
32#[repr(C)]
33pub struct C2RustUnnamed {
34 pub states: *const bool,
35 pub symbol_map: *const TSSymbol,
36 pub create: Option<unsafe extern "C" fn() -> *mut os::raw::c_void>,
37 pub destroy: Option<unsafe extern "C" fn(*mut os::raw::c_void) -> ()>,
38 pub scan: Option<unsafe extern "C" fn(*mut os::raw::c_void, *mut TSLexer, *const bool) -> bool>,
39 pub serialize:
40 Option<unsafe extern "C" fn(*mut os::raw::c_void, *mut os::raw::c_char) -> os::raw::c_uint>,
41 pub deserialize: Option<
42 unsafe extern "C" fn(*mut os::raw::c_void, *const os::raw::c_char, os::raw::c_uint) -> (),
43 >,
44}
45#[derive(Copy, Clone)]
46#[repr(C)]
47pub struct TSLexer {
48 pub lookahead: int32_t,
49 pub result_symbol: TSSymbol,
50 pub advance: Option<unsafe extern "C" fn(*mut TSLexer, bool) -> ()>,
51 pub mark_end: Option<unsafe extern "C" fn(*mut TSLexer) -> ()>,
52 pub get_column: Option<unsafe extern "C" fn(*mut TSLexer) -> u32>,
53 pub is_at_included_range_start: Option<unsafe extern "C" fn(*const TSLexer) -> bool>,
54 pub eof: Option<unsafe extern "C" fn(*const TSLexer) -> bool>,
55}
56#[derive(Copy, Clone)]
57#[repr(C)]
58pub struct TSLexMode {
59 pub lex_state: u16,
60 pub external_lex_state: u16,
61}
62#[derive(Copy, Clone)]
63#[repr(C)]
64pub struct TSSymbolMetadata {
65 pub visible: bool,
66 pub named: bool,
67 pub supertype: bool,
68}
69#[derive(Copy, Clone)]
70#[repr(C)]
71pub struct TSFieldMapEntry {
72 pub field_id: TSFieldId,
73 pub child_index: u8,
74 pub inherited: bool,
75}
76#[derive(Copy, Clone)]
77#[repr(C)]
78pub struct TSFieldMapSlice {
79 pub index: u16,
80 pub length: u16,
81}
82#[derive(Copy, Clone)]
83#[repr(C)]
84pub union TSParseActionEntry {
85 pub action: TSParseAction,
86 pub entry: C2RustUnnamed_0,
87}
88#[derive(Copy, Clone)]
89#[repr(C)]
90pub struct C2RustUnnamed_0 {
91 pub count: u8,
92 pub reusable: bool,
93}
94#[derive(Copy, Clone)]
95#[repr(C)]
96pub union TSParseAction {
97 pub shift: C2RustUnnamed_2,
98 pub reduce: C2RustUnnamed_1,
99 pub type_: u8,
100}
101#[derive(Copy, Clone)]
102#[repr(C)]
103pub struct C2RustUnnamed_1 {
104 pub type_: u8,
105 pub child_count: u8,
106 pub symbol: TSSymbol,
107 pub dynamic_precedence: int16_t,
108 pub production_id: u16,
109}
110#[derive(Copy, Clone)]
111#[repr(C)]
112pub struct C2RustUnnamed_2 {
113 pub type_: u8,
114 pub state: TSStateId,
115 pub extra: bool,
116 pub repetition: bool,
117}
118#[derive(Copy, Clone)]
119#[repr(C)]
120pub struct TSParser {
121 pub lexer: Lexer,
122 pub stack: *mut Stack,
123 pub tree_pool: SubtreePool,
124 pub language: *const TSLanguage,
125 pub reduce_actions: ReduceActionSet,
126 pub finished_tree: Subtree,
127 pub trailing_extras: SubtreeArray,
128 pub trailing_extras2: SubtreeArray,
129 pub scratch_trees: SubtreeArray,
130 pub token_cache: TokenCache,
131 pub reusable_node: ReusableNode,
132 pub external_scanner_payload: *mut os::raw::c_void,
133 pub dot_graph_file: *mut FILE,
134 pub end_clock: TSClock,
135 pub timeout_duration: TSDuration,
136 pub accept_count: os::raw::c_uint,
137 pub operation_count: os::raw::c_uint,
138 pub cancellation_flag: *const size_t,
139 pub old_tree: Subtree,
140 pub included_range_differences: TSRangeArray,
141 pub included_range_difference_index: os::raw::c_uint,
142}
143type C2RustUnnamed_3 = crate::util::ScannerStateWithLookahead;
144type C2RustUnnamed_4 = crate::util::LongShortData;
145type C2RustUnnamed_5 = crate::util::ScannerStateLookaheadMeta;
146type C2RustUnnamed_6 = crate::util::ScannerStateLookaheadFirstLeaf;
147pub type TSDuration = u64;
148pub type TSClock = timespec;
149#[derive(Copy, Clone)]
150#[repr(C)]
151pub struct ReusableNode {
152 pub stack: C2RustUnnamed_7,
153 pub last_external_token: Subtree,
154}
155type C2RustUnnamed_7 = crate::util::StackElement<*mut StackEntry>;
156#[derive(Copy, Clone)]
157#[repr(C)]
158pub struct StackEntry {
159 pub tree: Subtree,
160 pub child_index: u32,
161 pub byte_offset: u32,
162}
163#[derive(Copy, Clone)]
164#[repr(C)]
165pub struct TokenCache {
166 pub token: Subtree,
167 pub last_external_token: Subtree,
168 pub byte_index: u32,
169}
170#[derive(Copy, Clone)]
171#[repr(C)]
172pub struct ReduceActionSet {
173 pub contents: *mut ReduceAction,
174 pub size: u32,
175 pub capacity: u32,
176}
177#[derive(Copy, Clone)]
178#[repr(C)]
179pub struct ReduceAction {
180 pub count: u32,
181 pub symbol: TSSymbol,
182 pub dynamic_precedence: os::raw::c_int,
183 pub production_id: os::raw::c_ushort,
184}
185pub const TSLogTypeLex: TSLogType = 1;
186pub const TSLogTypeParse: TSLogType = 0;
187pub const TSInputEncodingUTF16: TSInputEncoding = 1;
188pub const TSInputEncodingUTF8: TSInputEncoding = 0;
189#[derive(Copy, Clone)]
190#[repr(C)]
191pub struct VoidArray {
192 pub contents: *mut os::raw::c_void,
193 pub size: u32,
194 pub capacity: u32,
195}
196pub type StackVersion = os::raw::c_uint;
197pub const TSParseActionTypeShift: C2RustUnnamed_8 = 0;
198pub const ErrorComparisonPreferRight: ErrorComparison = 3;
199pub const ErrorComparisonTakeRight: ErrorComparison = 4;
200pub type ErrorComparison = os::raw::c_uint;
201pub const ErrorComparisonNone: ErrorComparison = 2;
202pub const ErrorComparisonPreferLeft: ErrorComparison = 1;
203pub const ErrorComparisonTakeLeft: ErrorComparison = 0;
204#[derive(Copy, Clone)]
205#[repr(C)]
206pub struct ErrorStatus {
207 pub cost: os::raw::c_uint,
208 pub node_count: os::raw::c_uint,
209 pub dynamic_precedence: os::raw::c_int,
210 pub is_in_error: bool,
211}
212pub const TSParseActionTypeReduce: C2RustUnnamed_8 = 1;
213pub const TSParseActionTypeRecover: C2RustUnnamed_8 = 3;
214pub const TSParseActionTypeAccept: C2RustUnnamed_8 = 2;
215#[derive(Copy, Clone)]
216#[repr(C)]
217pub struct TSStringInput {
218 pub string: *const os::raw::c_char,
219 pub length: u32,
220}
221pub type C2RustUnnamed_8 = os::raw::c_uint;
222#[inline]
223unsafe extern "C" fn array__delete(mut self_0: *mut VoidArray) {
224 crate::alloc::ts_free((*self_0).contents);
225 let ref mut fresh0 = (*self_0).contents;
226 *fresh0 = 0 as *mut os::raw::c_void;
227 (*self_0).size = 0 as os::raw::c_int as u32;
228 (*self_0).capacity = 0 as os::raw::c_int as u32;
229}
230#[inline]
231unsafe extern "C" fn array__erase(
232 mut self_0: *mut VoidArray,
233 mut element_size: size_t,
234 mut index: u32,
235) {
236 if index < (*self_0).size {
237 } else {
238 panic!();
239 }
240 let mut contents: *mut os::raw::c_char = (*self_0).contents as *mut os::raw::c_char;
241 std::ptr::copy(
242 contents.offset(
243 (index.wrapping_add(1 as os::raw::c_int as os::raw::c_uint) as usize)
244 .wrapping_mul(element_size) as isize,
245 ) as *const os::raw::c_void,
246 contents.offset((index as usize).wrapping_mul(element_size) as isize)
247 as *mut os::raw::c_void,
248 ((((*self_0).size)
249 .wrapping_sub(index)
250 .wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as usize)
251 .wrapping_mul(element_size)) as usize,
252 );
253 let ref mut fresh1 = (*self_0).size;
254 *fresh1 = (*fresh1).wrapping_sub(1);
255}
256#[inline]
257unsafe extern "C" fn array__reserve(
258 mut self_0: *mut VoidArray,
259 mut element_size: size_t,
260 mut new_capacity: u32,
261) {
262 if new_capacity > (*self_0).capacity {
263 if !((*self_0).contents).is_null() {
264 let ref mut fresh2 = (*self_0).contents;
265 *fresh2 = crate::alloc::ts_realloc(
266 (*self_0).contents,
267 (new_capacity as usize).wrapping_mul(element_size),
268 );
269 } else {
270 let ref mut fresh3 = (*self_0).contents;
271 *fresh3 = crate::alloc::ts_malloc((new_capacity as usize).wrapping_mul(element_size));
272 }
273 (*self_0).capacity = new_capacity;
274 }
275}
276#[inline]
277unsafe extern "C" fn array__assign(
278 mut self_0: *mut VoidArray,
279 mut other: *const VoidArray,
280 mut element_size: size_t,
281) {
282 array__reserve(self_0, element_size, (*other).size);
283 (*self_0).size = (*other).size;
284 std::ptr::copy_nonoverlapping(
285 (*other).contents,
286 (*self_0).contents,
287 ((*self_0).size as usize).wrapping_mul(element_size),
288 );
289}
290#[inline]
291unsafe extern "C" fn array__swap(mut self_0: *mut VoidArray, mut other: *mut VoidArray) {
292 let mut swap: VoidArray = *other;
293 *other = *self_0;
294 *self_0 = swap;
295}
296#[inline]
297unsafe extern "C" fn array__splice(
298 mut self_0: *mut VoidArray,
299 mut element_size: size_t,
300 mut index: u32,
301 mut old_count: u32,
302 mut new_count: u32,
303 mut elements: *const os::raw::c_void,
304) {
305 let mut new_size: u32 = ((*self_0).size)
306 .wrapping_add(new_count)
307 .wrapping_sub(old_count);
308 let mut old_end: u32 = index.wrapping_add(old_count);
309 let mut new_end: u32 = index.wrapping_add(new_count);
310 if old_end <= (*self_0).size {
311 } else {
312 panic!();
313 }
314 array__reserve(self_0, element_size, new_size);
315 let mut contents: *mut os::raw::c_char = (*self_0).contents as *mut os::raw::c_char;
316 if (*self_0).size > old_end {
317 std::ptr::copy(
318 contents.offset((old_end as usize).wrapping_mul(element_size) as isize)
319 as *const os::raw::c_void,
320 contents.offset((new_end as usize).wrapping_mul(element_size) as isize)
321 as *mut os::raw::c_void,
322 ((((*self_0).size).wrapping_sub(old_end) as usize).wrapping_mul(element_size)) as usize,
323 );
324 }
325 if new_count > 0 as os::raw::c_int as os::raw::c_uint {
326 if !elements.is_null() {
327 std::ptr::copy_nonoverlapping(
328 elements,
329 contents.offset((index as usize).wrapping_mul(element_size) as isize)
330 as *mut os::raw::c_void,
331 (new_count as usize).wrapping_mul(element_size),
332 );
333 } else {
334 std::ptr::write_bytes(
335 contents.offset((index as usize).wrapping_mul(element_size) as isize)
336 as *mut os::raw::c_void,
337 (0 as os::raw::c_int) as u8,
338 ((new_count as usize).wrapping_mul(element_size)) as usize,
339 );
340 }
341 }
342 let ref mut fresh4 = (*self_0).size;
343 *fresh4 =
344 (*fresh4 as os::raw::c_uint).wrapping_add(new_count.wrapping_sub(old_count)) as u32 as u32;
345}
346#[inline]
347unsafe extern "C" fn array__grow(
348 mut self_0: *mut VoidArray,
349 mut count: size_t,
350 mut element_size: size_t,
351) {
352 let mut new_size: size_t = ((*self_0).size as usize).wrapping_add(count);
353 if new_size > (*self_0).capacity as usize {
354 let mut new_capacity: size_t =
355 ((*self_0).capacity).wrapping_mul(2 as os::raw::c_int as os::raw::c_uint) as size_t;
356 if new_capacity < 8 as os::raw::c_int as usize {
357 new_capacity = 8 as os::raw::c_int as size_t;
358 }
359 if new_capacity < new_size {
360 new_capacity = new_size;
361 }
362 array__reserve(self_0, element_size, new_capacity as u32);
363 }
364}
365#[inline]
366unsafe extern "C" fn duration_from_micros(mut micros: u64) -> TSDuration {
367 return micros;
368}
369#[inline]
370unsafe extern "C" fn duration_to_micros(mut self_0: TSDuration) -> u64 {
371 return self_0;
372}
373#[inline]
374unsafe extern "C" fn clock_null() -> TSClock {
375 return {
376 let mut init = timespec {
377 tv_sec: 0 as os::raw::c_int as __time_t,
378 tv_nsec: 0 as os::raw::c_int as __syscall_slong_t,
379 };
380 init
381 };
382}
383#[inline]
384unsafe extern "C" fn clock_is_null(mut self_0: TSClock) -> bool {
385 return self_0.tv_sec == 0;
386}
387#[inline]
388unsafe extern "C" fn clock_is_gt(mut self_0: TSClock, mut other: TSClock) -> bool {
389 if self_0.tv_sec > other.tv_sec {
390 return true;
391 }
392 if self_0.tv_sec < other.tv_sec {
393 return false;
394 }
395 return self_0.tv_nsec > other.tv_nsec;
396}
397#[inline]
398unsafe extern "C" fn ts_subtree_symbol(mut self_0: Subtree) -> TSSymbol {
399 return (if (self_0.data).is_inline() as os::raw::c_int != 0 {
400 self_0.data.symbol as os::raw::c_int
401 } else {
402 (*self_0.ptr).symbol as os::raw::c_int
403 }) as TSSymbol;
404}
405#[inline]
406unsafe extern "C" fn ts_subtree_extra(mut self_0: Subtree) -> bool {
407 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
408 (self_0.data).extra() as os::raw::c_int
409 } else {
410 (*self_0.ptr).extra() as os::raw::c_int
411 } != 0;
412}
413#[inline]
414unsafe extern "C" fn ts_subtree_has_changes(mut self_0: Subtree) -> bool {
415 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
416 (self_0.data).has_changes() as os::raw::c_int
417 } else {
418 (*self_0.ptr).has_changes() as os::raw::c_int
419 } != 0;
420}
421#[inline]
422unsafe extern "C" fn ts_subtree_is_fragile(mut self_0: Subtree) -> bool {
423 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
424 0 as os::raw::c_int
425 } else {
426 ((*self_0.ptr).fragile_left() as os::raw::c_int != 0
427 || (*self_0.ptr).fragile_right() as os::raw::c_int != 0) as os::raw::c_int
428 } != 0;
429}
430#[inline]
431unsafe extern "C" fn ts_subtree_has_external_tokens(mut self_0: Subtree) -> bool {
432 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
433 0 as os::raw::c_int
434 } else {
435 (*self_0.ptr).has_external_tokens() as os::raw::c_int
436 } != 0;
437}
438#[inline]
439unsafe extern "C" fn ts_subtree_leaf_parse_state(mut self_0: Subtree) -> TSStateId {
440 if (self_0.data).is_inline() {
441 return self_0.data.parse_state;
442 }
443 if (*self_0.ptr).child_count as os::raw::c_int == 0 as os::raw::c_int {
444 return (*self_0.ptr).parse_state;
445 }
446 return (*self_0.ptr)
447 .c2rust_unnamed
448 .c2rust_unnamed
449 .first_leaf
450 .parse_state;
451}
452#[inline]
453unsafe extern "C" fn ts_subtree_set_extra(mut self_0: *mut MutableSubtree, mut is_extra: bool) {
454 if ((*self_0).data).is_inline() {
455 let ref mut fresh5 = (*self_0).data;
456 (*fresh5).set_extra(is_extra);
457 } else {
458 let ref mut fresh6 = *(*self_0).ptr;
459 (*fresh6).set_extra(is_extra);
460 };
461}
462#[inline]
463unsafe extern "C" fn ts_subtree_total_size(mut self_0: Subtree) -> Length {
464 return length_add(ts_subtree_padding(self_0), ts_subtree_size(self_0));
465}
466#[inline]
467unsafe extern "C" fn ts_subtree_size(mut self_0: Subtree) -> Length {
468 if (self_0.data).is_inline() {
469 let mut result: Length = {
470 let mut init = Length {
471 bytes: self_0.data.size_bytes as u32,
472 extent: {
473 let mut init = TSPoint {
474 row: 0 as os::raw::c_int as u32,
475 column: self_0.data.size_bytes as u32,
476 };
477 init
478 },
479 };
480 init
481 };
482 return result;
483 } else {
484 return (*self_0.ptr).size;
485 };
486}
487#[inline]
488unsafe extern "C" fn ts_subtree_padding(mut self_0: Subtree) -> Length {
489 if (self_0.data).is_inline() {
490 let mut result: Length = {
491 let mut init = Length {
492 bytes: self_0.data.padding_bytes as u32,
493 extent: {
494 let mut init = TSPoint {
495 row: (self_0.data).padding_rows() as u32,
496 column: self_0.data.padding_columns as u32,
497 };
498 init
499 },
500 };
501 init
502 };
503 return result;
504 } else {
505 return (*self_0.ptr).padding;
506 };
507}
508#[inline]
509unsafe extern "C" fn length_add(mut len1: Length, mut len2: Length) -> Length {
510 let mut result: Length = Length {
511 bytes: 0,
512 extent: TSPoint { row: 0, column: 0 },
513 };
514 result.bytes = (len1.bytes).wrapping_add(len2.bytes);
515 result.extent = point_add(len1.extent, len2.extent);
516 return result;
517}
518#[inline]
519unsafe extern "C" fn point_add(mut a: TSPoint, mut b: TSPoint) -> TSPoint {
520 if b.row > 0 as os::raw::c_int as os::raw::c_uint {
521 return point__new((a.row).wrapping_add(b.row), b.column);
522 } else {
523 return point__new(a.row, (a.column).wrapping_add(b.column));
524 };
525}
526#[inline]
527unsafe extern "C" fn ts_subtree_to_mut_unsafe(mut self_0: Subtree) -> MutableSubtree {
528 let mut result: MutableSubtree = MutableSubtree {
529 data: SubtreeInlineData {
530 is_inline_visible_named_extra_has_changes_is_missing_is_keyword: [0; 1],
531 symbol: 0,
532 parse_state: 0,
533 padding_columns: 0,
534 padding_rows_lookahead_bytes: [0; 1],
535 padding_bytes: 0,
536 size_bytes: 0,
537 },
538 };
539 result.data = self_0.data;
540 return result;
541}
542#[inline]
543unsafe extern "C" fn point__new(mut row: os::raw::c_uint, mut column: os::raw::c_uint) -> TSPoint {
544 let mut result: TSPoint = {
545 let mut init = TSPoint {
546 row: row,
547 column: column,
548 };
549 init
550 };
551 return result;
552}
553#[inline]
554unsafe extern "C" fn ts_subtree_total_bytes(mut self_0: Subtree) -> u32 {
555 return (ts_subtree_total_size(self_0)).bytes;
556}
557#[inline]
558unsafe extern "C" fn length_zero() -> Length {
559 let mut result: Length = {
560 let mut init = Length {
561 bytes: 0 as os::raw::c_int as u32,
562 extent: {
563 let mut init = TSPoint {
564 row: 0 as os::raw::c_int as u32,
565 column: 0 as os::raw::c_int as u32,
566 };
567 init
568 },
569 };
570 init
571 };
572 return result;
573}
574#[inline]
575unsafe extern "C" fn ts_subtree_is_keyword(mut self_0: Subtree) -> bool {
576 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
577 (self_0.data).is_keyword() as os::raw::c_int
578 } else {
579 (*self_0.ptr).is_keyword() as os::raw::c_int
580 } != 0;
581}
582#[inline]
583unsafe extern "C" fn ts_subtree_from_mut(mut self_0: MutableSubtree) -> Subtree {
584 let mut result: Subtree = Subtree {
585 data: SubtreeInlineData {
586 is_inline_visible_named_extra_has_changes_is_missing_is_keyword: [0; 1],
587 symbol: 0,
588 parse_state: 0,
589 padding_columns: 0,
590 padding_rows_lookahead_bytes: [0; 1],
591 padding_bytes: 0,
592 size_bytes: 0,
593 },
594 };
595 result.data = self_0.data;
596 return result;
597}
598#[inline]
599unsafe extern "C" fn point_sub(mut a: TSPoint, mut b: TSPoint) -> TSPoint {
600 if a.row > b.row {
601 return point__new((a.row).wrapping_sub(b.row), a.column);
602 } else {
603 return point__new(
604 0 as os::raw::c_int as os::raw::c_uint,
605 (a.column).wrapping_sub(b.column),
606 );
607 };
608}
609#[inline]
610unsafe extern "C" fn length_sub(mut len1: Length, mut len2: Length) -> Length {
611 let mut result: Length = Length {
612 bytes: 0,
613 extent: TSPoint { row: 0, column: 0 },
614 };
615 result.bytes = (len1.bytes).wrapping_sub(len2.bytes);
616 result.extent = point_sub(len1.extent, len2.extent);
617 return result;
618}
619#[inline]
620unsafe extern "C" fn ts_subtree_lookahead_bytes(mut self_0: Subtree) -> u32 {
621 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
622 (self_0.data).lookahead_bytes() as os::raw::c_uint
623 } else {
624 (*self_0.ptr).lookahead_bytes
625 };
626}
627#[inline]
628unsafe extern "C" fn ts_subtree_leaf_symbol(mut self_0: Subtree) -> TSSymbol {
629 if (self_0.data).is_inline() {
630 return self_0.data.symbol as TSSymbol;
631 }
632 if (*self_0.ptr).child_count as os::raw::c_int == 0 as os::raw::c_int {
633 return (*self_0.ptr).symbol;
634 }
635 return (*self_0.ptr)
636 .c2rust_unnamed
637 .c2rust_unnamed
638 .first_leaf
639 .symbol;
640}
641#[inline]
642unsafe extern "C" fn ts_subtree_parse_state(mut self_0: Subtree) -> TSStateId {
643 return (if (self_0.data).is_inline() as os::raw::c_int != 0 {
644 self_0.data.parse_state as os::raw::c_int
645 } else {
646 (*self_0.ptr).parse_state as os::raw::c_int
647 }) as TSStateId;
648}
649#[inline]
650unsafe extern "C" fn ts_subtree_is_error(mut self_0: Subtree) -> bool {
651 return ts_subtree_symbol(self_0) as os::raw::c_int
652 == -(1 as os::raw::c_int) as TSSymbol as os::raw::c_int;
653}
654#[inline]
655unsafe extern "C" fn ts_subtree_error_cost(mut self_0: Subtree) -> u32 {
656 if ts_subtree_missing(self_0) {
657 return (110 as os::raw::c_int + 500 as os::raw::c_int) as u32;
658 } else {
659 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
660 0 as os::raw::c_int as os::raw::c_uint
661 } else {
662 (*self_0.ptr).error_cost
663 };
664 };
665}
666#[inline]
667unsafe extern "C" fn ts_subtree_missing(mut self_0: Subtree) -> bool {
668 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
669 (self_0.data).is_missing() as os::raw::c_int
670 } else {
671 (*self_0.ptr).is_missing() as os::raw::c_int
672 } != 0;
673}
674#[inline]
675unsafe extern "C" fn ts_subtree_has_external_scanner_state_change(mut self_0: Subtree) -> bool {
676 return if (self_0.data).is_inline() as os::raw::c_int != 0 {
677 0 as os::raw::c_int
678 } else {
679 (*self_0.ptr).has_external_scanner_state_change() as os::raw::c_int
680 } != 0;
681}
682#[inline]
683unsafe extern "C" fn ts_subtree_is_eof(mut self_0: Subtree) -> bool {
684 return ts_subtree_symbol(self_0) as os::raw::c_int == 0 as os::raw::c_int;
685}
686#[inline]
687unsafe extern "C" fn ts_subtree_child_count(mut self_0: Subtree) -> u32 {
688 return (if (self_0.data).is_inline() as os::raw::c_int != 0 {
689 0 as os::raw::c_int
690 } else {
691 (*self_0.ptr).child_count as os::raw::c_int
692 }) as u32;
693}
694#[inline]
695unsafe extern "C" fn ts_subtree_dynamic_precedence(mut self_0: Subtree) -> int32_t {
696 return if (self_0.data).is_inline() as os::raw::c_int != 0
697 || (*self_0.ptr).child_count as os::raw::c_int == 0 as os::raw::c_int
698 {
699 0 as os::raw::c_int
700 } else {
701 (*self_0.ptr)
702 .c2rust_unnamed
703 .c2rust_unnamed
704 .dynamic_precedence
705 };
706}
707#[inline]
708unsafe extern "C" fn ts_language_actions(
709 mut self_0: *const TSLanguage,
710 mut state: TSStateId,
711 mut symbol: TSSymbol,
712 mut count: *mut u32,
713) -> *const TSParseAction {
714 let mut entry: TableEntry = TableEntry {
715 actions: 0 as *const TSParseAction,
716 action_count: 0,
717 is_reusable: false,
718 };
719 ts_language_table_entry(self_0, state, symbol, &mut entry);
720 *count = entry.action_count;
721 return entry.actions;
722}
723#[inline]
724unsafe extern "C" fn ts_language_has_reduce_action(
725 mut self_0: *const TSLanguage,
726 mut state: TSStateId,
727 mut symbol: TSSymbol,
728) -> bool {
729 let mut entry: TableEntry = TableEntry {
730 actions: 0 as *const TSParseAction,
731 action_count: 0,
732 is_reusable: false,
733 };
734 ts_language_table_entry(self_0, state, symbol, &mut entry);
735 return entry.action_count > 0 as os::raw::c_int as os::raw::c_uint
736 && (*(entry.actions).offset(0 as os::raw::c_int as isize)).type_ as os::raw::c_int
737 == TSParseActionTypeReduce as os::raw::c_int;
738}
739#[inline]
740unsafe extern "C" fn ts_language_lookup(
741 mut self_0: *const TSLanguage,
742 mut state: TSStateId,
743 mut symbol: TSSymbol,
744) -> u16 {
745 if state as os::raw::c_uint >= (*self_0).large_state_count {
746 let mut index: u32 = *((*self_0).small_parse_table_map)
747 .offset((state as os::raw::c_uint).wrapping_sub((*self_0).large_state_count) as isize);
748 let mut data: *const u16 =
749 &*((*self_0).small_parse_table).offset(index as isize) as *const u16;
750 let fresh7 = data;
751 data = data.offset(1);
752 let mut group_count: u16 = *fresh7;
753 let mut i: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
754 while i < group_count as os::raw::c_uint {
755 let fresh8 = data;
756 data = data.offset(1);
757 let mut section_value: u16 = *fresh8;
758 let fresh9 = data;
759 data = data.offset(1);
760 let mut symbol_count: u16 = *fresh9;
761 let mut i_0: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
762 while i_0 < symbol_count as os::raw::c_uint {
763 let fresh10 = data;
764 data = data.offset(1);
765 if *fresh10 as os::raw::c_int == symbol as os::raw::c_int {
766 return section_value;
767 }
768 i_0 = i_0.wrapping_add(1);
769 }
770 i = i.wrapping_add(1);
771 }
772 return 0 as os::raw::c_int as u16;
773 } else {
774 return *((*self_0).parse_table).offset(
775 (state as os::raw::c_uint)
776 .wrapping_mul((*self_0).symbol_count)
777 .wrapping_add(symbol as os::raw::c_uint) as isize,
778 );
779 };
780}
781#[inline]
782unsafe extern "C" fn ts_language_has_actions(
783 mut self_0: *const TSLanguage,
784 mut state: TSStateId,
785 mut symbol: TSSymbol,
786) -> bool {
787 return ts_language_lookup(self_0, state, symbol) as os::raw::c_int != 0 as os::raw::c_int;
788}
789#[inline]
790unsafe extern "C" fn ts_language_next_state(
791 mut self_0: *const TSLanguage,
792 mut state: TSStateId,
793 mut symbol: TSSymbol,
794) -> TSStateId {
795 if symbol as os::raw::c_int == -(1 as os::raw::c_int) as TSSymbol as os::raw::c_int
796 || symbol as os::raw::c_int
797 == -(1 as os::raw::c_int) as TSSymbol as os::raw::c_int - 1 as os::raw::c_int
798 {
799 return 0 as os::raw::c_int as TSStateId;
800 } else if (symbol as os::raw::c_uint) < (*self_0).token_count {
801 let mut count: u32 = 0;
802 let mut actions: *const TSParseAction =
803 ts_language_actions(self_0, state, symbol, &mut count);
804 if count > 0 as os::raw::c_int as os::raw::c_uint {
805 let mut action: TSParseAction = *actions
806 .offset(count.wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize);
807 if action.type_ as os::raw::c_int == TSParseActionTypeShift as os::raw::c_int {
808 return (if action.shift.extra as os::raw::c_int != 0 {
809 state as os::raw::c_int
810 } else {
811 action.shift.state as os::raw::c_int
812 }) as TSStateId;
813 }
814 }
815 return 0 as os::raw::c_int as TSStateId;
816 } else {
817 return ts_language_lookup(self_0, state, symbol);
818 };
819}
820#[inline]
821unsafe extern "C" fn ts_language_enabled_external_tokens(
822 mut self_0: *const TSLanguage,
823 mut external_scanner_state: os::raw::c_uint,
824) -> *const bool {
825 if external_scanner_state == 0 as os::raw::c_int as os::raw::c_uint {
826 return 0 as *const bool;
827 } else {
828 return ((*self_0).external_scanner.states)
829 .offset(((*self_0).external_token_count).wrapping_mul(external_scanner_state) as isize);
830 };
831}
832#[inline]
833unsafe extern "C" fn ts_reduce_action_set_add(
834 mut self_0: *mut ReduceActionSet,
835 mut new_action: ReduceAction,
836) {
837 let mut i: u32 = 0 as os::raw::c_int as u32;
838 while i < (*self_0).size {
839 let mut action: ReduceAction = *((*self_0).contents).offset(i as isize);
840 if action.symbol as os::raw::c_int == new_action.symbol as os::raw::c_int
841 && action.count == new_action.count
842 {
843 return;
844 }
845 i = i.wrapping_add(1);
846 }
847 array__grow(
848 self_0 as *mut VoidArray,
849 1 as os::raw::c_int as size_t,
850 ::std::mem::size_of::<ReduceAction>() as usize,
851 );
852 let ref mut fresh11 = (*self_0).size;
853 let fresh12 = *fresh11;
854 *fresh11 = (*fresh11).wrapping_add(1);
855 *((*self_0).contents).offset(fresh12 as isize) = new_action;
856}
857#[inline]
858unsafe extern "C" fn reusable_node_new() -> ReusableNode {
859 return {
860 let mut init = ReusableNode {
861 stack: {
862 let mut init = C2RustUnnamed_7 {
863 contents: 0 as *mut StackEntry,
864 size: 0 as os::raw::c_int as u32,
865 capacity: 0 as os::raw::c_int as u32,
866 };
867 init
868 },
869 last_external_token: Subtree {
870 ptr: 0 as *const SubtreeHeapData,
871 },
872 };
873 init
874 };
875}
876#[inline]
877unsafe extern "C" fn reusable_node_clear(mut self_0: *mut ReusableNode) {
878 (*self_0).stack.size = 0 as os::raw::c_int as u32;
879 (*self_0).last_external_token = Subtree {
880 ptr: 0 as *const SubtreeHeapData,
881 };
882}
883#[inline]
884unsafe extern "C" fn reusable_node_tree(mut self_0: *mut ReusableNode) -> Subtree {
885 return if (*self_0).stack.size > 0 as os::raw::c_int as os::raw::c_uint {
886 (*((*self_0).stack.contents).offset(
887 ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize,
888 ))
889 .tree
890 } else {
891 Subtree {
892 ptr: 0 as *const SubtreeHeapData,
893 }
894 };
895}
896#[inline]
897unsafe extern "C" fn reusable_node_byte_offset(mut self_0: *mut ReusableNode) -> u32 {
898 return if (*self_0).stack.size > 0 as os::raw::c_int as os::raw::c_uint {
899 (*((*self_0).stack.contents).offset(
900 ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize,
901 ))
902 .byte_offset
903 } else {
904 4294967295 as os::raw::c_uint
905 };
906}
907#[inline]
908unsafe extern "C" fn reusable_node_delete(mut self_0: *mut ReusableNode) {
909 array__delete(&mut (*self_0).stack as *mut C2RustUnnamed_7 as *mut VoidArray);
910}
911#[inline]
912unsafe extern "C" fn reusable_node_advance(mut self_0: *mut ReusableNode) {
913 if ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint)
914 < (*self_0).stack.size
915 {
916 } else {
917 panic!();
918 }
919 let mut last_entry: StackEntry = *(&mut *((*self_0).stack.contents).offset(
920 ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize,
921 ) as *mut StackEntry);
922 let mut byte_offset: u32 =
923 (last_entry.byte_offset).wrapping_add(ts_subtree_total_bytes(last_entry.tree));
924 if ts_subtree_has_external_tokens(last_entry.tree) {
925 (*self_0).last_external_token = ts_subtree_last_external_token(last_entry.tree);
926 }
927 let mut tree: Subtree = Subtree {
928 data: SubtreeInlineData {
929 is_inline_visible_named_extra_has_changes_is_missing_is_keyword: [0; 1],
930 symbol: 0,
931 parse_state: 0,
932 padding_columns: 0,
933 padding_rows_lookahead_bytes: [0; 1],
934 padding_bytes: 0,
935 size_bytes: 0,
936 },
937 };
938 let mut next_index: u32 = 0;
939 loop {
940 let ref mut fresh13 = (*self_0).stack.size;
941 *fresh13 = (*fresh13).wrapping_sub(1);
942 let mut popped_entry: StackEntry = *((*self_0).stack.contents).offset(*fresh13 as isize);
943 next_index =
944 (popped_entry.child_index).wrapping_add(1 as os::raw::c_int as os::raw::c_uint);
945 if (*self_0).stack.size == 0 as os::raw::c_int as os::raw::c_uint {
946 return;
947 }
948 if ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint)
949 < (*self_0).stack.size
950 {
951 } else {
952 panic!();
953 }
954 tree = (*(&mut *((*self_0).stack.contents).offset(
955 ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize,
956 ) as *mut StackEntry))
957 .tree;
958 if !(ts_subtree_child_count(tree) <= next_index) {
959 break;
960 }
961 }
962 array__grow(
963 &mut (*self_0).stack as *mut C2RustUnnamed_7 as *mut VoidArray,
964 1 as os::raw::c_int as size_t,
965 ::std::mem::size_of::<StackEntry>() as usize,
966 );
967 let ref mut fresh14 = (*self_0).stack.size;
968 let fresh15 = *fresh14;
969 *fresh14 = (*fresh14).wrapping_add(1);
970 *((*self_0).stack.contents).offset(fresh15 as isize) = {
971 let mut init = StackEntry {
972 tree: *(if (tree.data).is_inline() as os::raw::c_int != 0 {
973 0 as *mut Subtree
974 } else {
975 (tree.ptr as *mut Subtree)
976 .offset(-((*tree.ptr).child_count as os::raw::c_int as isize))
977 })
978 .offset(next_index as isize),
979 child_index: next_index,
980 byte_offset: byte_offset,
981 };
982 init
983 };
984}
985#[inline]
986unsafe extern "C" fn reusable_node_descend(mut self_0: *mut ReusableNode) -> bool {
987 if ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint)
988 < (*self_0).stack.size
989 {
990 } else {
991 panic!();
992 }
993 let mut last_entry: StackEntry = *(&mut *((*self_0).stack.contents).offset(
994 ((*self_0).stack.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize,
995 ) as *mut StackEntry);
996 if ts_subtree_child_count(last_entry.tree) > 0 as os::raw::c_int as os::raw::c_uint {
997 array__grow(
998 &mut (*self_0).stack as *mut C2RustUnnamed_7 as *mut VoidArray,
999 1 as os::raw::c_int as size_t,
1000 ::std::mem::size_of::<StackEntry>() as usize,
1001 );
1002 let ref mut fresh16 = (*self_0).stack.size;
1003 let fresh17 = *fresh16;
1004 *fresh16 = (*fresh16).wrapping_add(1);
1005 *((*self_0).stack.contents).offset(fresh17 as isize) = {
1006 let mut init = StackEntry {
1007 tree: *(if (last_entry.tree.data).is_inline() as os::raw::c_int != 0 {
1008 0 as *mut Subtree
1009 } else {
1010 (last_entry.tree.ptr as *mut Subtree)
1011 .offset(-((*last_entry.tree.ptr).child_count as os::raw::c_int as isize))
1012 })
1013 .offset(0 as os::raw::c_int as isize),
1014 child_index: 0 as os::raw::c_int as u32,
1015 byte_offset: last_entry.byte_offset,
1016 };
1017 init
1018 };
1019 return true;
1020 } else {
1021 return false;
1022 };
1023}
1024#[inline]
1025unsafe extern "C" fn reusable_node_advance_past_leaf(mut self_0: *mut ReusableNode) {
1026 while reusable_node_descend(self_0) {}
1027 reusable_node_advance(self_0);
1028}
1029#[inline]
1030unsafe extern "C" fn reusable_node_reset(mut self_0: *mut ReusableNode, mut tree: Subtree) {
1031 reusable_node_clear(self_0);
1032 array__grow(
1033 &mut (*self_0).stack as *mut C2RustUnnamed_7 as *mut VoidArray,
1034 1 as os::raw::c_int as size_t,
1035 ::std::mem::size_of::<StackEntry>() as usize,
1036 );
1037 let ref mut fresh18 = (*self_0).stack.size;
1038 let fresh19 = *fresh18;
1039 *fresh18 = (*fresh18).wrapping_add(1);
1040 *((*self_0).stack.contents).offset(fresh19 as isize) = {
1041 let mut init = StackEntry {
1042 tree: tree,
1043 child_index: 0 as os::raw::c_int as u32,
1044 byte_offset: 0 as os::raw::c_int as u32,
1045 };
1046 init
1047 };
1048 if !reusable_node_descend(self_0) {
1049 reusable_node_clear(self_0);
1050 }
1051}
1052static mut MAX_VERSION_COUNT: os::raw::c_uint = 6 as os::raw::c_int as os::raw::c_uint;
1053static mut MAX_VERSION_COUNT_OVERFLOW: os::raw::c_uint = 4 as os::raw::c_int as os::raw::c_uint;
1054static mut MAX_SUMMARY_DEPTH: os::raw::c_uint = 16 as os::raw::c_int as os::raw::c_uint;
1055static mut MAX_COST_DIFFERENCE: os::raw::c_uint =
1056 (16 as os::raw::c_int * 100 as os::raw::c_int) as os::raw::c_uint;
1057static mut OP_COUNT_PER_TIMEOUT_CHECK: os::raw::c_uint = 100 as os::raw::c_int as os::raw::c_uint;
1058unsafe extern "C" fn ts_string_input_read(
1059 mut _self: *mut os::raw::c_void,
1060 mut byte: u32,
1061 mut pt: TSPoint,
1062 mut length: *mut u32,
1063) -> *const os::raw::c_char {
1064 let mut self_0: *mut TSStringInput = _self as *mut TSStringInput;
1065 if byte >= (*self_0).length {
1066 *length = 0 as os::raw::c_int as u32;
1067 return b"\0" as *const u8 as *const os::raw::c_char;
1068 } else {
1069 *length = ((*self_0).length).wrapping_sub(byte);
1070 return ((*self_0).string).offset(byte as isize);
1071 };
1072}
1073unsafe extern "C" fn ts_parser__log(mut self_0: *mut TSParser) {
1074 if ((*self_0).lexer.logger.log).is_some() {
1075 ((*self_0).lexer.logger.log).expect("non-null function pointer")(
1076 (*self_0).lexer.logger.payload,
1077 TSLogTypeParse,
1078 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1079 );
1080 }
1081 if !((*self_0).dot_graph_file).is_null() {
1082 ();
1083 let mut c: *mut os::raw::c_char = &mut *((*self_0).lexer.debug_buffer)
1084 .as_mut_ptr()
1085 .offset(0 as os::raw::c_int as isize)
1086 as *mut os::raw::c_char;
1087 while *c as os::raw::c_int != 0 as os::raw::c_int {
1088 if *c as os::raw::c_int == '"' as i32 || *c as os::raw::c_int == '\\' as i32 {
1089 ();
1090 }
1091 ();
1092 c = c.offset(1);
1093 }
1094 ();
1095 }
1096}
1097unsafe extern "C" fn ts_parser__breakdown_top_of_stack(
1098 mut self_0: *mut TSParser,
1099 mut version: StackVersion,
1100) -> bool {
1101 let mut did_break_down: bool = false;
1102 let mut pending: bool = false;
1103 loop {
1104 let mut pop: StackSliceArray = ts_stack_pop_pending((*self_0).stack, version);
1105 if pop.size == 0 {
1106 break;
1107 }
1108 did_break_down = true;
1109 pending = false;
1110 let mut i: u32 = 0 as os::raw::c_int as u32;
1111 while i < pop.size {
1112 let mut slice: StackSlice = *(pop.contents).offset(i as isize);
1113 let mut state: TSStateId = ts_stack_state((*self_0).stack, slice.version);
1114 if (0 as os::raw::c_int as u32) < slice.subtrees.size {
1115 } else {
1116 panic!();
1117 }
1118 let mut parent: Subtree = *(&mut *(slice.subtrees.contents)
1119 .offset(0 as os::raw::c_int as isize)
1120 as *mut Subtree);
1121 let mut j: u32 = 0 as os::raw::c_int as u32;
1122 let mut n: u32 = ts_subtree_child_count(parent);
1123 while j < n {
1124 let mut child: Subtree = *if (parent.data).is_inline() as os::raw::c_int != 0 {
1125 0 as *mut Subtree
1126 } else {
1127 (parent.ptr as *mut Subtree)
1128 .offset(-((*parent.ptr).child_count as os::raw::c_int as isize))
1129 }
1130 .offset(j as isize);
1131 pending = ts_subtree_child_count(child) > 0 as os::raw::c_int as os::raw::c_uint;
1132 if ts_subtree_is_error(child) {
1133 state = 0 as os::raw::c_int as TSStateId;
1134 } else if !ts_subtree_extra(child) {
1135 state =
1136 ts_language_next_state((*self_0).language, state, ts_subtree_symbol(child));
1137 }
1138 ts_subtree_retain(child);
1139 ts_stack_push((*self_0).stack, slice.version, child, pending, state);
1140 j = j.wrapping_add(1);
1141 }
1142 let mut j_0: u32 = 1 as os::raw::c_int as u32;
1143 while j_0 < slice.subtrees.size {
1144 let mut tree: Subtree = *(slice.subtrees.contents).offset(j_0 as isize);
1145 ts_stack_push((*self_0).stack, slice.version, tree, false, state);
1146 j_0 = j_0.wrapping_add(1);
1147 }
1148 ts_subtree_release(&mut (*self_0).tree_pool, parent);
1149 array__delete(&mut slice.subtrees as *mut SubtreeArray as *mut VoidArray);
1150 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1151 snwrite!(
1152 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1153 1024 as os::raw::c_int as usize as usize,
1154 "breakdown_top_of_stack tree:{}",
1155 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1156 (*self_0).language,
1157 ts_subtree_symbol(parent),
1158 ))
1159 .to_string_lossy()
1160 )
1161 .unwrap_or(usize::MAX) as os::raw::c_int;
1162 ts_parser__log(self_0);
1163 }
1164 if !((*self_0).dot_graph_file).is_null() {
1165 ts_stack_print_dot_graph(
1166 (*self_0).stack,
1167 (*self_0).language,
1168 (*self_0).dot_graph_file,
1169 );
1170 ();
1171 }
1172 i = i.wrapping_add(1);
1173 }
1174 if !pending {
1175 break;
1176 }
1177 }
1178 return did_break_down;
1179}
1180unsafe extern "C" fn ts_parser__breakdown_lookahead(
1181 mut self_0: *mut TSParser,
1182 mut lookahead: *mut Subtree,
1183 mut state: TSStateId,
1184 mut reusable_node: *mut ReusableNode,
1185) {
1186 let mut did_descend: bool = false;
1187 let mut tree: Subtree = reusable_node_tree(reusable_node);
1188 while ts_subtree_child_count(tree) > 0 as os::raw::c_int as os::raw::c_uint
1189 && ts_subtree_parse_state(tree) as os::raw::c_int != state as os::raw::c_int
1190 {
1191 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1192 snwrite!(
1193 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1194 1024 as os::raw::c_int as usize as usize,
1195 "state_mismatch sym:{}",
1196 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1197 (*self_0).language,
1198 ts_subtree_symbol(tree)
1199 ))
1200 .to_string_lossy()
1201 )
1202 .unwrap_or(usize::MAX) as os::raw::c_int;
1203 ts_parser__log(self_0);
1204 }
1205 reusable_node_descend(reusable_node);
1206 tree = reusable_node_tree(reusable_node);
1207 did_descend = true;
1208 }
1209 if did_descend {
1210 ts_subtree_release(&mut (*self_0).tree_pool, *lookahead);
1211 *lookahead = tree;
1212 ts_subtree_retain(*lookahead);
1213 }
1214}
1215unsafe extern "C" fn ts_parser__compare_versions(
1216 mut self_0: *mut TSParser,
1217 mut a: ErrorStatus,
1218 mut b: ErrorStatus,
1219) -> ErrorComparison {
1220 if !a.is_in_error && b.is_in_error as os::raw::c_int != 0 {
1221 if a.cost < b.cost {
1222 return ErrorComparisonTakeLeft;
1223 } else {
1224 return ErrorComparisonPreferLeft;
1225 }
1226 }
1227 if a.is_in_error as os::raw::c_int != 0 && !b.is_in_error {
1228 if b.cost < a.cost {
1229 return ErrorComparisonTakeRight;
1230 } else {
1231 return ErrorComparisonPreferRight;
1232 }
1233 }
1234 if a.cost < b.cost {
1235 if (b.cost)
1236 .wrapping_sub(a.cost)
1237 .wrapping_mul((1 as os::raw::c_int as os::raw::c_uint).wrapping_add(a.node_count))
1238 > MAX_COST_DIFFERENCE
1239 {
1240 return ErrorComparisonTakeLeft;
1241 } else {
1242 return ErrorComparisonPreferLeft;
1243 }
1244 }
1245 if b.cost < a.cost {
1246 if (a.cost)
1247 .wrapping_sub(b.cost)
1248 .wrapping_mul((1 as os::raw::c_int as os::raw::c_uint).wrapping_add(b.node_count))
1249 > MAX_COST_DIFFERENCE
1250 {
1251 return ErrorComparisonTakeRight;
1252 } else {
1253 return ErrorComparisonPreferRight;
1254 }
1255 }
1256 if a.dynamic_precedence > b.dynamic_precedence {
1257 return ErrorComparisonPreferLeft;
1258 }
1259 if b.dynamic_precedence > a.dynamic_precedence {
1260 return ErrorComparisonPreferRight;
1261 }
1262 return ErrorComparisonNone;
1263}
1264unsafe extern "C" fn ts_parser__version_status(
1265 mut self_0: *mut TSParser,
1266 mut version: StackVersion,
1267) -> ErrorStatus {
1268 let mut cost: os::raw::c_uint = ts_stack_error_cost((*self_0).stack, version);
1269 let mut is_paused: bool = ts_stack_is_paused((*self_0).stack, version);
1270 if is_paused {
1271 cost = cost.wrapping_add(100 as os::raw::c_int as os::raw::c_uint);
1272 }
1273 return {
1274 let mut init = ErrorStatus {
1275 cost: cost,
1276 node_count: ts_stack_node_count_since_error((*self_0).stack, version),
1277 dynamic_precedence: ts_stack_dynamic_precedence((*self_0).stack, version),
1278 is_in_error: is_paused as os::raw::c_int != 0
1279 || ts_stack_state((*self_0).stack, version) as os::raw::c_int
1280 == 0 as os::raw::c_int,
1281 };
1282 init
1283 };
1284}
1285unsafe extern "C" fn ts_parser__better_version_exists(
1286 mut self_0: *mut TSParser,
1287 mut version: StackVersion,
1288 mut is_in_error: bool,
1289 mut cost: os::raw::c_uint,
1290) -> bool {
1291 if !((*self_0).finished_tree.ptr).is_null()
1292 && ts_subtree_error_cost((*self_0).finished_tree) <= cost
1293 {
1294 return true;
1295 }
1296 let mut position: Length = ts_stack_position((*self_0).stack, version);
1297 let mut status: ErrorStatus = {
1298 let mut init = ErrorStatus {
1299 cost: cost,
1300 node_count: ts_stack_node_count_since_error((*self_0).stack, version),
1301 dynamic_precedence: ts_stack_dynamic_precedence((*self_0).stack, version),
1302 is_in_error: is_in_error,
1303 };
1304 init
1305 };
1306 let mut i: StackVersion = 0 as os::raw::c_int as StackVersion;
1307 let mut n: StackVersion = ts_stack_version_count((*self_0).stack);
1308 while i < n {
1309 if !(i == version
1310 || !ts_stack_is_active((*self_0).stack, i)
1311 || (ts_stack_position((*self_0).stack, i)).bytes < position.bytes)
1312 {
1313 let mut status_i: ErrorStatus = ts_parser__version_status(self_0, i);
1314 match ts_parser__compare_versions(self_0, status, status_i) as os::raw::c_uint {
1315 4 => return true,
1316 3 => {
1317 if ts_stack_can_merge((*self_0).stack, i, version) {
1318 return true;
1319 }
1320 }
1321 _ => {}
1322 }
1323 }
1324 i = i.wrapping_add(1);
1325 }
1326 return false;
1327}
1328unsafe extern "C" fn ts_parser__restore_external_scanner(
1329 mut self_0: *mut TSParser,
1330 mut external_token: Subtree,
1331) {
1332 if !(external_token.ptr).is_null() {
1333 ((*(*self_0).language).external_scanner.deserialize).expect("non-null function pointer")(
1334 (*self_0).external_scanner_payload,
1335 ts_external_scanner_state_data(
1336 &(*external_token.ptr).c2rust_unnamed.external_scanner_state,
1337 ),
1338 (*external_token.ptr)
1339 .c2rust_unnamed
1340 .external_scanner_state
1341 .length,
1342 );
1343 } else {
1344 ((*(*self_0).language).external_scanner.deserialize).expect("non-null function pointer")(
1345 (*self_0).external_scanner_payload,
1346 0 as *const os::raw::c_char,
1347 0 as os::raw::c_int as os::raw::c_uint,
1348 );
1349 };
1350}
1351unsafe extern "C" fn ts_parser__can_reuse_first_leaf(
1352 mut self_0: *mut TSParser,
1353 mut state: TSStateId,
1354 mut tree: Subtree,
1355 mut table_entry: *mut TableEntry,
1356) -> bool {
1357 let mut current_lex_mode: TSLexMode = *((*(*self_0).language).lex_modes).offset(state as isize);
1358 let mut leaf_symbol: TSSymbol = ts_subtree_leaf_symbol(tree);
1359 let mut leaf_state: TSStateId = ts_subtree_leaf_parse_state(tree);
1360 let mut leaf_lex_mode: TSLexMode =
1361 *((*(*self_0).language).lex_modes).offset(leaf_state as isize);
1362 if current_lex_mode.lex_state as os::raw::c_int
1363 == -(1 as os::raw::c_int) as u16 as os::raw::c_int
1364 {
1365 return false;
1366 }
1367 if (*table_entry).action_count > 0 as os::raw::c_int as os::raw::c_uint
1368 && if std::slice::from_raw_parts(
1369 &mut leaf_lex_mode as *mut TSLexMode as *const u8,
1370 ::std::mem::size_of::<TSLexMode>() as usize,
1371 ) == std::slice::from_raw_parts(
1372 &mut current_lex_mode as *mut TSLexMode as *const u8,
1373 ::std::mem::size_of::<TSLexMode>() as usize,
1374 ) {
1375 0
1376 } else {
1377 1
1378 } == 0 as os::raw::c_int
1379 && (leaf_symbol as os::raw::c_int
1380 != (*(*self_0).language).keyword_capture_token as os::raw::c_int
1381 || !ts_subtree_is_keyword(tree)
1382 && ts_subtree_parse_state(tree) as os::raw::c_int == state as os::raw::c_int)
1383 {
1384 return true;
1385 }
1386 if (ts_subtree_size(tree)).bytes == 0 as os::raw::c_int as os::raw::c_uint
1387 && leaf_symbol as os::raw::c_int != 0 as os::raw::c_int
1388 {
1389 return false;
1390 }
1391 return current_lex_mode.external_lex_state as os::raw::c_int == 0 as os::raw::c_int
1392 && (*table_entry).is_reusable as os::raw::c_int != 0;
1393}
1394unsafe extern "C" fn ts_parser__lex(
1395 mut self_0: *mut TSParser,
1396 mut version: StackVersion,
1397 mut parse_state: TSStateId,
1398) -> Subtree {
1399 let mut lex_mode: TSLexMode = *((*(*self_0).language).lex_modes).offset(parse_state as isize);
1400 if lex_mode.lex_state as os::raw::c_int == -(1 as os::raw::c_int) as u16 as os::raw::c_int {
1401 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1402 snwrite!(
1403 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1404 1024 as os::raw::c_int as usize as usize,
1405 "no_lookahead_after_non_terminal_extra",
1406 )
1407 .unwrap_or(usize::MAX) as os::raw::c_int;
1408 ts_parser__log(self_0);
1409 }
1410 return Subtree {
1411 ptr: 0 as *const SubtreeHeapData,
1412 };
1413 }
1414 let start_position: Length = ts_stack_position((*self_0).stack, version);
1415 let external_token: Subtree = ts_stack_last_external_token((*self_0).stack, version);
1416 let mut valid_external_tokens: *const bool = ts_language_enabled_external_tokens(
1417 (*self_0).language,
1418 lex_mode.external_lex_state as os::raw::c_uint,
1419 );
1420 let mut found_external_token: bool = false;
1421 let mut error_mode: bool = parse_state as os::raw::c_int == 0 as os::raw::c_int;
1422 let mut skipped_error: bool = false;
1423 let mut called_get_column: bool = false;
1424 let mut first_error_character: int32_t = 0 as os::raw::c_int;
1425 let mut error_start_position: Length = length_zero();
1426 let mut error_end_position: Length = length_zero();
1427 let mut lookahead_end_byte: u32 = 0 as os::raw::c_int as u32;
1428 let mut external_scanner_state_len: u32 = 0 as os::raw::c_int as u32;
1429 let mut external_scanner_state_changed: bool = false;
1430 ts_lexer_reset(&mut (*self_0).lexer, start_position);
1431 loop {
1432 let mut current_position: Length = (*self_0).lexer.current_position;
1433 if !valid_external_tokens.is_null() {
1434 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1435 snwrite!(
1436 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1437 1024 as os::raw::c_int as usize as usize,
1438 "lex_external state:{}, row:{}, column:{}",
1439 lex_mode.external_lex_state as os::raw::c_int,
1440 current_position.extent.row,
1441 current_position.extent.column
1442 )
1443 .unwrap_or(usize::MAX) as os::raw::c_int;
1444 ts_parser__log(self_0);
1445 }
1446 ts_lexer_start(&mut (*self_0).lexer);
1447 ts_parser__restore_external_scanner(self_0, external_token);
1448 let mut found_token: bool = ((*(*self_0).language).external_scanner.scan)
1449 .expect("non-null function pointer")(
1450 (*self_0).external_scanner_payload,
1451 &mut (*self_0).lexer.data,
1452 valid_external_tokens,
1453 );
1454 ts_lexer_finish(&mut (*self_0).lexer, &mut lookahead_end_byte);
1455 if found_token {
1456 external_scanner_state_len = ((*(*self_0).language).external_scanner.serialize)
1457 .expect("non-null function pointer")(
1458 (*self_0).external_scanner_payload,
1459 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1460 );
1461 external_scanner_state_changed = !ts_external_scanner_state_eq(
1462 ts_subtree_external_scanner_state(external_token),
1463 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1464 external_scanner_state_len,
1465 );
1466 if (*self_0).lexer.token_end_position.bytes == current_position.bytes
1467 && (error_mode as os::raw::c_int != 0
1468 || !ts_stack_has_advanced_since_error((*self_0).stack, version))
1469 && !external_scanner_state_changed
1470 {
1471 if ((*self_0).lexer.logger.log).is_some()
1472 || !((*self_0).dot_graph_file).is_null()
1473 {
1474 snwrite!(
1475 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1476 1024 as os::raw::c_int as usize as usize,
1477 "ignore_empty_external_token symbol:{}",
1478 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1479 (*self_0).language,
1480 *((*(*self_0).language).external_scanner.symbol_map)
1481 .offset((*self_0).lexer.data.result_symbol as isize),
1482 ))
1483 .to_string_lossy()
1484 )
1485 .unwrap_or(usize::MAX) as os::raw::c_int;
1486 ts_parser__log(self_0);
1487 }
1488 found_token = false;
1489 }
1490 }
1491 if found_token {
1492 found_external_token = true;
1493 called_get_column = (*self_0).lexer.did_get_column;
1494 break;
1495 } else {
1496 ts_lexer_reset(&mut (*self_0).lexer, current_position);
1497 }
1498 }
1499 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1500 snwrite!(
1501 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1502 1024 as os::raw::c_int as usize as usize,
1503 "lex_internal state:{}, row:{}, column:{}",
1504 lex_mode.lex_state as os::raw::c_int,
1505 current_position.extent.row,
1506 current_position.extent.column
1507 )
1508 .unwrap_or(usize::MAX) as os::raw::c_int;
1509 ts_parser__log(self_0);
1510 }
1511 ts_lexer_start(&mut (*self_0).lexer);
1512 let mut found_token_0: bool = ((*(*self_0).language).lex_fn)
1513 .expect("non-null function pointer")(
1514 &mut (*self_0).lexer.data, lex_mode.lex_state
1515 );
1516 ts_lexer_finish(&mut (*self_0).lexer, &mut lookahead_end_byte);
1517 if found_token_0 {
1518 break;
1519 }
1520 if !error_mode {
1521 error_mode = true;
1522 lex_mode = *((*(*self_0).language).lex_modes).offset(0 as os::raw::c_int as isize);
1523 valid_external_tokens = ts_language_enabled_external_tokens(
1524 (*self_0).language,
1525 lex_mode.external_lex_state as os::raw::c_uint,
1526 );
1527 ts_lexer_reset(&mut (*self_0).lexer, start_position);
1528 } else {
1529 if !skipped_error {
1530 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1531 snwrite!(
1532 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1533 1024 as os::raw::c_int as usize as usize,
1534 "skip_unrecognized_character",
1535 )
1536 .unwrap_or(usize::MAX) as os::raw::c_int;
1537 ts_parser__log(self_0);
1538 }
1539 skipped_error = true;
1540 error_start_position = (*self_0).lexer.token_start_position;
1541 error_end_position = (*self_0).lexer.token_start_position;
1542 first_error_character = (*self_0).lexer.data.lookahead;
1543 }
1544 if (*self_0).lexer.current_position.bytes == error_end_position.bytes {
1545 if ((*self_0).lexer.data.eof).expect("non-null function pointer")(
1546 &mut (*self_0).lexer.data,
1547 ) {
1548 (*self_0).lexer.data.result_symbol = -(1 as os::raw::c_int) as TSSymbol;
1549 break;
1550 } else {
1551 ((*self_0).lexer.data.advance).expect("non-null function pointer")(
1552 &mut (*self_0).lexer.data,
1553 false,
1554 );
1555 }
1556 }
1557 error_end_position = (*self_0).lexer.current_position;
1558 }
1559 }
1560 let mut result: Subtree = Subtree {
1561 data: SubtreeInlineData {
1562 is_inline_visible_named_extra_has_changes_is_missing_is_keyword: [0; 1],
1563 symbol: 0,
1564 parse_state: 0,
1565 padding_columns: 0,
1566 padding_rows_lookahead_bytes: [0; 1],
1567 padding_bytes: 0,
1568 size_bytes: 0,
1569 },
1570 };
1571 if skipped_error {
1572 let mut padding: Length = length_sub(error_start_position, start_position);
1573 let mut size: Length = length_sub(error_end_position, error_start_position);
1574 let mut lookahead_bytes: u32 = lookahead_end_byte.wrapping_sub(error_end_position.bytes);
1575 result = ts_subtree_new_error(
1576 &mut (*self_0).tree_pool,
1577 first_error_character,
1578 padding,
1579 size,
1580 lookahead_bytes,
1581 parse_state,
1582 (*self_0).language,
1583 );
1584 } else {
1585 if (*self_0).lexer.token_end_position.bytes < (*self_0).lexer.token_start_position.bytes {
1586 (*self_0).lexer.token_start_position = (*self_0).lexer.token_end_position;
1587 }
1588 let mut is_keyword: bool = false;
1589 let mut symbol: TSSymbol = (*self_0).lexer.data.result_symbol;
1590 let mut padding_0: Length =
1591 length_sub((*self_0).lexer.token_start_position, start_position);
1592 let mut size_0: Length = length_sub(
1593 (*self_0).lexer.token_end_position,
1594 (*self_0).lexer.token_start_position,
1595 );
1596 let mut lookahead_bytes_0: u32 =
1597 lookahead_end_byte.wrapping_sub((*self_0).lexer.token_end_position.bytes);
1598 if found_external_token {
1599 symbol = *((*(*self_0).language).external_scanner.symbol_map).offset(symbol as isize);
1600 } else if symbol as os::raw::c_int
1601 == (*(*self_0).language).keyword_capture_token as os::raw::c_int
1602 && symbol as os::raw::c_int != 0 as os::raw::c_int
1603 {
1604 let mut end_byte: u32 = (*self_0).lexer.token_end_position.bytes;
1605 ts_lexer_reset(&mut (*self_0).lexer, (*self_0).lexer.token_start_position);
1606 ts_lexer_start(&mut (*self_0).lexer);
1607 if ((*(*self_0).language).keyword_lex_fn).expect("non-null function pointer")(
1608 &mut (*self_0).lexer.data,
1609 0 as os::raw::c_int as TSStateId,
1610 ) as os::raw::c_int
1611 != 0
1612 && (*self_0).lexer.token_end_position.bytes == end_byte
1613 && ts_language_has_actions(
1614 (*self_0).language,
1615 parse_state,
1616 (*self_0).lexer.data.result_symbol,
1617 ) as os::raw::c_int
1618 != 0
1619 {
1620 is_keyword = true;
1621 symbol = (*self_0).lexer.data.result_symbol;
1622 }
1623 }
1624 result = ts_subtree_new_leaf(
1625 &mut (*self_0).tree_pool,
1626 symbol,
1627 padding_0,
1628 size_0,
1629 lookahead_bytes_0,
1630 parse_state,
1631 found_external_token,
1632 called_get_column,
1633 is_keyword,
1634 (*self_0).language,
1635 );
1636 if found_external_token {
1637 let mut mut_result: MutableSubtree = ts_subtree_to_mut_unsafe(result);
1638 ts_external_scanner_state_init(
1639 &mut (*mut_result.ptr).c2rust_unnamed.external_scanner_state,
1640 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1641 external_scanner_state_len,
1642 );
1643 (*mut_result.ptr).set_has_external_scanner_state_change(external_scanner_state_changed);
1644 }
1645 }
1646 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1647 let mut buf: *mut os::raw::c_char = ((*self_0).lexer.debug_buffer).as_mut_ptr();
1648 let mut symbol_0: *const os::raw::c_char =
1649 ts_language_symbol_name((*self_0).language, ts_subtree_symbol(result));
1650 let mut off: os::raw::c_int = snwrite!(buf, 1024 as usize, "lexed_lookahead sym:",)
1651 .unwrap_or(usize::MAX) as os::raw::c_int;
1652 let mut i: os::raw::c_int = 0 as os::raw::c_int;
1653 while *symbol_0.offset(i as isize) as os::raw::c_int != '\0' as i32
1654 && off < 1024 as os::raw::c_int
1655 {
1656 match *symbol_0.offset(i as isize) as os::raw::c_int {
1657 9 => {
1658 let fresh20 = off;
1659 off = off + 1;
1660 *buf.offset(fresh20 as isize) = '\\' as i32 as os::raw::c_char;
1661 let fresh21 = off;
1662 off = off + 1;
1663 *buf.offset(fresh21 as isize) = 't' as i32 as os::raw::c_char;
1664 }
1665 10 => {
1666 let fresh22 = off;
1667 off = off + 1;
1668 *buf.offset(fresh22 as isize) = '\\' as i32 as os::raw::c_char;
1669 let fresh23 = off;
1670 off = off + 1;
1671 *buf.offset(fresh23 as isize) = 'n' as i32 as os::raw::c_char;
1672 }
1673 11 => {
1674 let fresh24 = off;
1675 off = off + 1;
1676 *buf.offset(fresh24 as isize) = '\\' as i32 as os::raw::c_char;
1677 let fresh25 = off;
1678 off = off + 1;
1679 *buf.offset(fresh25 as isize) = 'v' as i32 as os::raw::c_char;
1680 }
1681 12 => {
1682 let fresh26 = off;
1683 off = off + 1;
1684 *buf.offset(fresh26 as isize) = '\\' as i32 as os::raw::c_char;
1685 let fresh27 = off;
1686 off = off + 1;
1687 *buf.offset(fresh27 as isize) = 'f' as i32 as os::raw::c_char;
1688 }
1689 13 => {
1690 let fresh28 = off;
1691 off = off + 1;
1692 *buf.offset(fresh28 as isize) = '\\' as i32 as os::raw::c_char;
1693 let fresh29 = off;
1694 off = off + 1;
1695 *buf.offset(fresh29 as isize) = 'r' as i32 as os::raw::c_char;
1696 }
1697 92 => {
1698 let fresh30 = off;
1699 off = off + 1;
1700 *buf.offset(fresh30 as isize) = '\\' as i32 as os::raw::c_char;
1701 let fresh31 = off;
1702 off = off + 1;
1703 *buf.offset(fresh31 as isize) = '\\' as i32 as os::raw::c_char;
1704 }
1705 _ => {
1706 let fresh32 = off;
1707 off = off + 1;
1708 *buf.offset(fresh32 as isize) = *symbol_0.offset(i as isize);
1709 }
1710 }
1711 i += 1;
1712 }
1713 snwrite!(
1714 buf.offset(off as isize),
1715 (1024 as os::raw::c_int - off) as usize as usize,
1716 ", size:{}",
1717 (ts_subtree_total_size(result)).bytes
1718 )
1719 .unwrap_or(usize::MAX) as os::raw::c_int;
1720 ts_parser__log(self_0);
1721 }
1722 return result;
1723}
1724unsafe extern "C" fn ts_parser__get_cached_token(
1725 mut self_0: *mut TSParser,
1726 mut state: TSStateId,
1727 mut position: size_t,
1728 mut last_external_token: Subtree,
1729 mut table_entry: *mut TableEntry,
1730) -> Subtree {
1731 let mut cache: *mut TokenCache = &mut (*self_0).token_cache;
1732 if !((*cache).token.ptr).is_null()
1733 && (*cache).byte_index as usize == position
1734 && ts_subtree_external_scanner_state_eq((*cache).last_external_token, last_external_token)
1735 as os::raw::c_int
1736 != 0
1737 {
1738 ts_language_table_entry(
1739 (*self_0).language,
1740 state,
1741 ts_subtree_symbol((*cache).token),
1742 table_entry,
1743 );
1744 if ts_parser__can_reuse_first_leaf(self_0, state, (*cache).token, table_entry) {
1745 ts_subtree_retain((*cache).token);
1746 return (*cache).token;
1747 }
1748 }
1749 return Subtree {
1750 ptr: 0 as *const SubtreeHeapData,
1751 };
1752}
1753unsafe extern "C" fn ts_parser__set_cached_token(
1754 mut self_0: *mut TSParser,
1755 mut byte_index: size_t,
1756 mut last_external_token: Subtree,
1757 mut token: Subtree,
1758) {
1759 let mut cache: *mut TokenCache = &mut (*self_0).token_cache;
1760 if !(token.ptr).is_null() {
1761 ts_subtree_retain(token);
1762 }
1763 if !(last_external_token.ptr).is_null() {
1764 ts_subtree_retain(last_external_token);
1765 }
1766 if !((*cache).token.ptr).is_null() {
1767 ts_subtree_release(&mut (*self_0).tree_pool, (*cache).token);
1768 }
1769 if !((*cache).last_external_token.ptr).is_null() {
1770 ts_subtree_release(&mut (*self_0).tree_pool, (*cache).last_external_token);
1771 }
1772 (*cache).token = token;
1773 (*cache).byte_index = byte_index as u32;
1774 (*cache).last_external_token = last_external_token;
1775}
1776unsafe extern "C" fn ts_parser__has_included_range_difference(
1777 mut self_0: *const TSParser,
1778 mut start_position: u32,
1779 mut end_position: u32,
1780) -> bool {
1781 return ts_range_array_intersects(
1782 &(*self_0).included_range_differences,
1783 (*self_0).included_range_difference_index,
1784 start_position,
1785 end_position,
1786 );
1787}
1788unsafe extern "C" fn ts_parser__reuse_node(
1789 mut self_0: *mut TSParser,
1790 mut version: StackVersion,
1791 mut state: *mut TSStateId,
1792 mut position: u32,
1793 mut last_external_token: Subtree,
1794 mut table_entry: *mut TableEntry,
1795) -> Subtree {
1796 let mut result: Subtree = Subtree {
1797 data: SubtreeInlineData {
1798 is_inline_visible_named_extra_has_changes_is_missing_is_keyword: [0; 1],
1799 symbol: 0,
1800 parse_state: 0,
1801 padding_columns: 0,
1802 padding_rows_lookahead_bytes: [0; 1],
1803 padding_bytes: 0,
1804 size_bytes: 0,
1805 },
1806 };
1807 loop {
1808 result = reusable_node_tree(&mut (*self_0).reusable_node);
1809 if (result.ptr).is_null() {
1810 break;
1811 }
1812 let mut byte_offset: u32 = reusable_node_byte_offset(&mut (*self_0).reusable_node);
1813 let mut end_byte_offset: u32 = byte_offset.wrapping_add(ts_subtree_total_bytes(result));
1814 if ts_subtree_is_eof(result) {
1815 end_byte_offset = 4294967295 as os::raw::c_uint;
1816 }
1817 if byte_offset > position {
1818 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1819 snwrite!(
1820 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1821 1024 as os::raw::c_int as usize as usize,
1822 "before_reusable_node symbol:{}",
1823 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1824 (*self_0).language,
1825 ts_subtree_symbol(result),
1826 ))
1827 .to_string_lossy()
1828 )
1829 .unwrap_or(usize::MAX) as os::raw::c_int;
1830 ts_parser__log(self_0);
1831 }
1832 break;
1833 } else if byte_offset < position {
1834 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1835 snwrite!(
1836 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1837 1024 as os::raw::c_int as usize as usize,
1838 "past_reusable_node symbol:{}",
1839 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1840 (*self_0).language,
1841 ts_subtree_symbol(result),
1842 ))
1843 .to_string_lossy()
1844 )
1845 .unwrap_or(usize::MAX) as os::raw::c_int;
1846 ts_parser__log(self_0);
1847 }
1848 if end_byte_offset <= position || !reusable_node_descend(&mut (*self_0).reusable_node) {
1849 reusable_node_advance(&mut (*self_0).reusable_node);
1850 }
1851 } else if !ts_subtree_external_scanner_state_eq(
1852 (*self_0).reusable_node.last_external_token,
1853 last_external_token,
1854 ) {
1855 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1856 snwrite!(
1857 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1858 1024 as os::raw::c_int as usize as usize,
1859 "reusable_node_has_different_external_scanner_state symbol:{}",
1860 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1861 (*self_0).language,
1862 ts_subtree_symbol(result),
1863 ))
1864 .to_string_lossy()
1865 )
1866 .unwrap_or(usize::MAX) as os::raw::c_int;
1867 ts_parser__log(self_0);
1868 }
1869 reusable_node_advance(&mut (*self_0).reusable_node);
1870 } else {
1871 let mut reason: *const os::raw::c_char = 0 as *const os::raw::c_char;
1872 if ts_subtree_has_changes(result) {
1873 reason = b"has_changes\0" as *const u8 as *const os::raw::c_char;
1874 } else if ts_subtree_is_error(result) {
1875 reason = b"is_error\0" as *const u8 as *const os::raw::c_char;
1876 } else if ts_subtree_missing(result) {
1877 reason = b"is_missing\0" as *const u8 as *const os::raw::c_char;
1878 } else if ts_subtree_is_fragile(result) {
1879 reason = b"is_fragile\0" as *const u8 as *const os::raw::c_char;
1880 } else if ts_parser__has_included_range_difference(self_0, byte_offset, end_byte_offset)
1881 {
1882 reason =
1883 b"contains_different_included_range\0" as *const u8 as *const os::raw::c_char;
1884 }
1885 if !reason.is_null() {
1886 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1887 snwrite!(
1888 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1889 1024 as os::raw::c_int as usize as usize,
1890 "cant_reuse_node_{} tree:{}",
1891 std::ffi::CStr::from_ptr(reason).to_string_lossy(),
1892 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1893 (*self_0).language,
1894 ts_subtree_symbol(result),
1895 ))
1896 .to_string_lossy()
1897 )
1898 .unwrap_or(usize::MAX) as os::raw::c_int;
1899 ts_parser__log(self_0);
1900 }
1901 if !reusable_node_descend(&mut (*self_0).reusable_node) {
1902 reusable_node_advance(&mut (*self_0).reusable_node);
1903 ts_parser__breakdown_top_of_stack(self_0, version);
1904 *state = ts_stack_state((*self_0).stack, version);
1905 }
1906 } else {
1907 let mut leaf_symbol: TSSymbol = ts_subtree_leaf_symbol(result);
1908 ts_language_table_entry((*self_0).language, *state, leaf_symbol, table_entry);
1909 if !ts_parser__can_reuse_first_leaf(self_0, *state, result, table_entry) {
1910 if ((*self_0).lexer.logger.log).is_some()
1911 || !((*self_0).dot_graph_file).is_null()
1912 {
1913 snwrite!(
1914 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1915 1024 as os::raw::c_int as usize as usize,
1916 "cant_reuse_node symbol:{}, first_leaf_symbol:{}",
1917 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1918 (*self_0).language,
1919 ts_subtree_symbol(result),
1920 ))
1921 .to_string_lossy(),
1922 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1923 (*self_0).language,
1924 leaf_symbol
1925 ))
1926 .to_string_lossy()
1927 )
1928 .unwrap_or(usize::MAX) as os::raw::c_int;
1929 ts_parser__log(self_0);
1930 }
1931 reusable_node_advance_past_leaf(&mut (*self_0).reusable_node);
1932 break;
1933 } else {
1934 if ((*self_0).lexer.logger.log).is_some()
1935 || !((*self_0).dot_graph_file).is_null()
1936 {
1937 snwrite!(
1938 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1939 1024 as os::raw::c_int as usize as usize,
1940 "reuse_node symbol:{}",
1941 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1942 (*self_0).language,
1943 ts_subtree_symbol(result),
1944 ))
1945 .to_string_lossy()
1946 )
1947 .unwrap_or(usize::MAX) as os::raw::c_int;
1948 ts_parser__log(self_0);
1949 }
1950 ts_subtree_retain(result);
1951 return result;
1952 }
1953 }
1954 }
1955 }
1956 return Subtree {
1957 ptr: 0 as *const SubtreeHeapData,
1958 };
1959}
1960unsafe extern "C" fn ts_parser__select_tree(
1961 mut self_0: *mut TSParser,
1962 mut left: Subtree,
1963 mut right: Subtree,
1964) -> bool {
1965 if (left.ptr).is_null() {
1966 return true;
1967 }
1968 if (right.ptr).is_null() {
1969 return false;
1970 }
1971 if ts_subtree_error_cost(right) < ts_subtree_error_cost(left) {
1972 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1973 snwrite!(
1974 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1975 1024 as os::raw::c_int as usize as usize,
1976 "select_smaller_error symbol:{}, over_symbol:{}",
1977 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1978 (*self_0).language,
1979 ts_subtree_symbol(right)
1980 ))
1981 .to_string_lossy(),
1982 std::ffi::CStr::from_ptr(ts_language_symbol_name(
1983 (*self_0).language,
1984 ts_subtree_symbol(left)
1985 ))
1986 .to_string_lossy()
1987 )
1988 .unwrap_or(usize::MAX) as os::raw::c_int;
1989 ts_parser__log(self_0);
1990 }
1991 return true;
1992 }
1993 if ts_subtree_error_cost(left) < ts_subtree_error_cost(right) {
1994 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
1995 snwrite!(
1996 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
1997 1024 as os::raw::c_int as usize as usize,
1998 "select_smaller_error symbol:{}, over_symbol:{}",
1999 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2000 (*self_0).language,
2001 ts_subtree_symbol(left)
2002 ))
2003 .to_string_lossy(),
2004 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2005 (*self_0).language,
2006 ts_subtree_symbol(right)
2007 ))
2008 .to_string_lossy()
2009 )
2010 .unwrap_or(usize::MAX) as os::raw::c_int;
2011 ts_parser__log(self_0);
2012 }
2013 return false;
2014 }
2015 if ts_subtree_dynamic_precedence(right) > ts_subtree_dynamic_precedence(left) {
2016 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
2017 snwrite!(
2018 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2019 1024 as os::raw::c_int as usize as usize,
2020 "select_higher_precedence symbol:{}, prec:{}, over_symbol:{}, other_prec:{}",
2021 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2022 (*self_0).language,
2023 ts_subtree_symbol(right)
2024 ))
2025 .to_string_lossy(),
2026 ts_subtree_dynamic_precedence(right),
2027 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2028 (*self_0).language,
2029 ts_subtree_symbol(left)
2030 ))
2031 .to_string_lossy(),
2032 ts_subtree_dynamic_precedence(left)
2033 )
2034 .unwrap_or(usize::MAX) as os::raw::c_int;
2035 ts_parser__log(self_0);
2036 }
2037 return true;
2038 }
2039 if ts_subtree_dynamic_precedence(left) > ts_subtree_dynamic_precedence(right) {
2040 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
2041 snwrite!(
2042 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2043 1024 as os::raw::c_int as usize as usize,
2044 "select_higher_precedence symbol:{}, prec:{}, over_symbol:{}, other_prec:{}",
2045 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2046 (*self_0).language,
2047 ts_subtree_symbol(left)
2048 ))
2049 .to_string_lossy(),
2050 ts_subtree_dynamic_precedence(left),
2051 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2052 (*self_0).language,
2053 ts_subtree_symbol(right)
2054 ))
2055 .to_string_lossy(),
2056 ts_subtree_dynamic_precedence(right)
2057 )
2058 .unwrap_or(usize::MAX) as os::raw::c_int;
2059 ts_parser__log(self_0);
2060 }
2061 return false;
2062 }
2063 if ts_subtree_error_cost(left) > 0 as os::raw::c_int as os::raw::c_uint {
2064 return true;
2065 }
2066 let mut comparison: os::raw::c_int = ts_subtree_compare(left, right);
2067 match comparison {
2068 -1 => {
2069 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
2070 snwrite!(
2071 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2072 1024 as os::raw::c_int as usize as usize,
2073 "select_earlier symbol:{}, over_symbol:{}",
2074 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2075 (*self_0).language,
2076 ts_subtree_symbol(left)
2077 ))
2078 .to_string_lossy(),
2079 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2080 (*self_0).language,
2081 ts_subtree_symbol(right)
2082 ))
2083 .to_string_lossy()
2084 )
2085 .unwrap_or(usize::MAX) as os::raw::c_int;
2086 ts_parser__log(self_0);
2087 }
2088 return false;
2089 }
2090 1 => {
2091 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
2092 snwrite!(
2093 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2094 1024 as os::raw::c_int as usize as usize,
2095 "select_earlier symbol:{}, over_symbol:{}",
2096 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2097 (*self_0).language,
2098 ts_subtree_symbol(right),
2099 ))
2100 .to_string_lossy(),
2101 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2102 (*self_0).language,
2103 ts_subtree_symbol(left)
2104 ))
2105 .to_string_lossy()
2106 )
2107 .unwrap_or(usize::MAX) as os::raw::c_int;
2108 ts_parser__log(self_0);
2109 }
2110 return true;
2111 }
2112 _ => {
2113 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
2114 snwrite!(
2115 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2116 1024 as os::raw::c_int as usize as usize,
2117 "select_existing symbol:{}, over_symbol:{}",
2118 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2119 (*self_0).language,
2120 ts_subtree_symbol(left)
2121 ))
2122 .to_string_lossy(),
2123 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2124 (*self_0).language,
2125 ts_subtree_symbol(right)
2126 ))
2127 .to_string_lossy()
2128 )
2129 .unwrap_or(usize::MAX) as os::raw::c_int;
2130 ts_parser__log(self_0);
2131 }
2132 return false;
2133 }
2134 };
2135}
2136unsafe extern "C" fn ts_parser__select_children(
2137 mut self_0: *mut TSParser,
2138 mut left: Subtree,
2139 mut children: *const SubtreeArray,
2140) -> bool {
2141 array__assign(
2142 &mut (*self_0).scratch_trees as *mut SubtreeArray as *mut VoidArray,
2143 children as *const VoidArray,
2144 ::std::mem::size_of::<Subtree>() as usize,
2145 );
2146 let mut scratch_tree: MutableSubtree = ts_subtree_new_node(
2147 ts_subtree_symbol(left),
2148 &mut (*self_0).scratch_trees,
2149 0 as os::raw::c_int as os::raw::c_uint,
2150 (*self_0).language,
2151 );
2152 return ts_parser__select_tree(self_0, left, ts_subtree_from_mut(scratch_tree));
2153}
2154unsafe extern "C" fn ts_parser__shift(
2155 mut self_0: *mut TSParser,
2156 mut version: StackVersion,
2157 mut state: TSStateId,
2158 mut lookahead: Subtree,
2159 mut extra: bool,
2160) {
2161 let mut is_leaf: bool =
2162 ts_subtree_child_count(lookahead) == 0 as os::raw::c_int as os::raw::c_uint;
2163 let mut subtree_to_push: Subtree = lookahead;
2164 if extra as os::raw::c_int != ts_subtree_extra(lookahead) as os::raw::c_int
2165 && is_leaf as os::raw::c_int != 0
2166 {
2167 let mut result: MutableSubtree = ts_subtree_make_mut(&mut (*self_0).tree_pool, lookahead);
2168 ts_subtree_set_extra(&mut result, extra);
2169 subtree_to_push = ts_subtree_from_mut(result);
2170 }
2171 ts_stack_push((*self_0).stack, version, subtree_to_push, !is_leaf, state);
2172 if ts_subtree_has_external_tokens(subtree_to_push) {
2173 ts_stack_set_last_external_token(
2174 (*self_0).stack,
2175 version,
2176 ts_subtree_last_external_token(subtree_to_push),
2177 );
2178 }
2179}
2180unsafe extern "C" fn ts_parser__reduce(
2181 mut self_0: *mut TSParser,
2182 mut version: StackVersion,
2183 mut symbol: TSSymbol,
2184 mut count: u32,
2185 mut dynamic_precedence: os::raw::c_int,
2186 mut production_id: u16,
2187 mut is_fragile: bool,
2188 mut end_of_non_terminal_extra: bool,
2189) -> StackVersion {
2190 let mut initial_version_count: u32 = ts_stack_version_count((*self_0).stack);
2191 let mut pop: StackSliceArray = ts_stack_pop_count((*self_0).stack, version, count);
2192 let mut removed_version_count: u32 = 0 as os::raw::c_int as u32;
2193 let mut i: u32 = 0 as os::raw::c_int as u32;
2194 while i < pop.size {
2195 let mut slice: StackSlice = *(pop.contents).offset(i as isize);
2196 let mut slice_version: StackVersion = (slice.version).wrapping_sub(removed_version_count);
2197 if slice_version > MAX_VERSION_COUNT.wrapping_add(MAX_VERSION_COUNT_OVERFLOW) {
2198 ts_stack_remove_version((*self_0).stack, slice_version);
2199 ts_subtree_array_delete(&mut (*self_0).tree_pool, &mut slice.subtrees);
2200 removed_version_count = removed_version_count.wrapping_add(1);
2201 while i.wrapping_add(1 as os::raw::c_int as os::raw::c_uint) < pop.size {
2202 let mut next_slice: StackSlice = *(pop.contents)
2203 .offset(i.wrapping_add(1 as os::raw::c_int as os::raw::c_uint) as isize);
2204 if next_slice.version != slice.version {
2205 break;
2206 }
2207 ts_subtree_array_delete(&mut (*self_0).tree_pool, &mut next_slice.subtrees);
2208 i = i.wrapping_add(1);
2209 }
2210 } else {
2211 let mut children: SubtreeArray = slice.subtrees;
2212 ts_subtree_array_remove_trailing_extras(&mut children, &mut (*self_0).trailing_extras);
2213 let mut parent: MutableSubtree = ts_subtree_new_node(
2214 symbol,
2215 &mut children,
2216 production_id as os::raw::c_uint,
2217 (*self_0).language,
2218 );
2219 while i.wrapping_add(1 as os::raw::c_int as os::raw::c_uint) < pop.size {
2220 let mut next_slice_0: StackSlice = *(pop.contents)
2221 .offset(i.wrapping_add(1 as os::raw::c_int as os::raw::c_uint) as isize);
2222 if next_slice_0.version != slice.version {
2223 break;
2224 }
2225 i = i.wrapping_add(1);
2226 let mut children_0: SubtreeArray = next_slice_0.subtrees;
2227 ts_subtree_array_remove_trailing_extras(
2228 &mut children_0,
2229 &mut (*self_0).trailing_extras2,
2230 );
2231 if ts_parser__select_children(self_0, ts_subtree_from_mut(parent), &mut children_0)
2232 {
2233 ts_subtree_array_clear(
2234 &mut (*self_0).tree_pool,
2235 &mut (*self_0).trailing_extras,
2236 );
2237 ts_subtree_release(&mut (*self_0).tree_pool, ts_subtree_from_mut(parent));
2238 array__swap(
2239 &mut (*self_0).trailing_extras as *mut SubtreeArray as *mut VoidArray,
2240 &mut (*self_0).trailing_extras2 as *mut SubtreeArray as *mut VoidArray,
2241 );
2242 parent = ts_subtree_new_node(
2243 symbol,
2244 &mut children_0,
2245 production_id as os::raw::c_uint,
2246 (*self_0).language,
2247 );
2248 } else {
2249 (*self_0).trailing_extras2.size = 0 as os::raw::c_int as u32;
2250 ts_subtree_array_delete(&mut (*self_0).tree_pool, &mut next_slice_0.subtrees);
2251 }
2252 }
2253 let mut state: TSStateId = ts_stack_state((*self_0).stack, slice_version);
2254 let mut next_state: TSStateId =
2255 ts_language_next_state((*self_0).language, state, symbol);
2256 if end_of_non_terminal_extra as os::raw::c_int != 0
2257 && next_state as os::raw::c_int == state as os::raw::c_int
2258 {
2259 (*parent.ptr).set_extra(1 as os::raw::c_int != 0);
2260 }
2261 if is_fragile as os::raw::c_int != 0
2262 || pop.size > 1 as os::raw::c_int as os::raw::c_uint
2263 || initial_version_count > 1 as os::raw::c_int as os::raw::c_uint
2264 {
2265 (*parent.ptr).set_fragile_left(1 as os::raw::c_int != 0);
2266 (*parent.ptr).set_fragile_right(1 as os::raw::c_int != 0);
2267 (*parent.ptr).parse_state = (32767 as os::raw::c_int * 2 as os::raw::c_int
2268 + 1 as os::raw::c_int) as TSStateId;
2269 } else {
2270 (*parent.ptr).parse_state = state;
2271 }
2272 let ref mut fresh33 = (*parent.ptr)
2273 .c2rust_unnamed
2274 .c2rust_unnamed
2275 .dynamic_precedence;
2276 *fresh33 += dynamic_precedence;
2277 ts_stack_push(
2278 (*self_0).stack,
2279 slice_version,
2280 ts_subtree_from_mut(parent),
2281 false,
2282 next_state,
2283 );
2284 let mut j: u32 = 0 as os::raw::c_int as u32;
2285 while j < (*self_0).trailing_extras.size {
2286 ts_stack_push(
2287 (*self_0).stack,
2288 slice_version,
2289 *((*self_0).trailing_extras.contents).offset(j as isize),
2290 false,
2291 next_state,
2292 );
2293 j = j.wrapping_add(1);
2294 }
2295 let mut j_0: StackVersion = 0 as os::raw::c_int as StackVersion;
2296 while j_0 < slice_version {
2297 if !(j_0 == version) {
2298 if ts_stack_merge((*self_0).stack, j_0, slice_version) {
2299 removed_version_count = removed_version_count.wrapping_add(1);
2300 break;
2301 }
2302 }
2303 j_0 = j_0.wrapping_add(1);
2304 }
2305 }
2306 i = i.wrapping_add(1);
2307 }
2308 return if ts_stack_version_count((*self_0).stack) > initial_version_count {
2309 initial_version_count
2310 } else {
2311 -(1 as os::raw::c_int) as StackVersion
2312 };
2313}
2314unsafe extern "C" fn ts_parser__accept(
2315 mut self_0: *mut TSParser,
2316 mut version: StackVersion,
2317 mut lookahead: Subtree,
2318) {
2319 if ts_subtree_is_eof(lookahead) {
2320 } else {
2321 panic!();
2322 }
2323 ts_stack_push(
2324 (*self_0).stack,
2325 version,
2326 lookahead,
2327 false,
2328 1 as os::raw::c_int as TSStateId,
2329 );
2330 let mut pop: StackSliceArray = ts_stack_pop_all((*self_0).stack, version);
2331 let mut i: u32 = 0 as os::raw::c_int as u32;
2332 while i < pop.size {
2333 let mut trees: SubtreeArray = (*(pop.contents).offset(i as isize)).subtrees;
2334 let mut root: Subtree = Subtree {
2335 ptr: 0 as *const SubtreeHeapData,
2336 };
2337 let mut j: u32 = (trees.size).wrapping_sub(1 as os::raw::c_int as os::raw::c_uint);
2338 while j.wrapping_add(1 as os::raw::c_int as os::raw::c_uint)
2339 > 0 as os::raw::c_int as os::raw::c_uint
2340 {
2341 let mut tree: Subtree = *(trees.contents).offset(j as isize);
2342 if !ts_subtree_extra(tree) {
2343 if !(tree.data).is_inline() {
2344 } else {
2345 panic!();
2346 }
2347 let mut child_count: u32 = ts_subtree_child_count(tree);
2348 let mut children: *const Subtree = if (tree.data).is_inline() as os::raw::c_int != 0
2349 {
2350 0 as *mut Subtree
2351 } else {
2352 (tree.ptr as *mut Subtree)
2353 .offset(-((*tree.ptr).child_count as os::raw::c_int as isize))
2354 };
2355 let mut k: u32 = 0 as os::raw::c_int as u32;
2356 while k < child_count {
2357 ts_subtree_retain(*children.offset(k as isize));
2358 k = k.wrapping_add(1);
2359 }
2360 array__splice(
2361 &mut trees as *mut SubtreeArray as *mut VoidArray,
2362 ::std::mem::size_of::<Subtree>() as usize,
2363 j,
2364 1 as os::raw::c_int as u32,
2365 child_count,
2366 children as *const os::raw::c_void,
2367 );
2368 root = ts_subtree_from_mut(ts_subtree_new_node(
2369 ts_subtree_symbol(tree),
2370 &mut trees,
2371 (*tree.ptr).c2rust_unnamed.c2rust_unnamed.production_id as os::raw::c_uint,
2372 (*self_0).language,
2373 ));
2374 ts_subtree_release(&mut (*self_0).tree_pool, tree);
2375 break;
2376 } else {
2377 j = j.wrapping_sub(1);
2378 }
2379 }
2380 if !(root.ptr).is_null() {
2381 } else {
2382 panic!();
2383 }
2384 let ref mut fresh34 = (*self_0).accept_count;
2385 *fresh34 = (*fresh34).wrapping_add(1);
2386 if !((*self_0).finished_tree.ptr).is_null() {
2387 if ts_parser__select_tree(self_0, (*self_0).finished_tree, root) {
2388 ts_subtree_release(&mut (*self_0).tree_pool, (*self_0).finished_tree);
2389 (*self_0).finished_tree = root;
2390 } else {
2391 ts_subtree_release(&mut (*self_0).tree_pool, root);
2392 }
2393 } else {
2394 (*self_0).finished_tree = root;
2395 }
2396 i = i.wrapping_add(1);
2397 }
2398 ts_stack_remove_version(
2399 (*self_0).stack,
2400 (*(pop.contents).offset(0 as os::raw::c_int as isize)).version,
2401 );
2402 ts_stack_halt((*self_0).stack, version);
2403}
2404unsafe extern "C" fn ts_parser__do_all_potential_reductions(
2405 mut self_0: *mut TSParser,
2406 mut starting_version: StackVersion,
2407 mut lookahead_symbol: TSSymbol,
2408) -> bool {
2409 let mut initial_version_count: u32 = ts_stack_version_count((*self_0).stack);
2410 let mut can_shift_lookahead_symbol: bool = false;
2411 let mut version: StackVersion = starting_version;
2412 let mut current_block_33: u64;
2413 let mut i: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
2414 loop {
2415 let mut version_count: u32 = ts_stack_version_count((*self_0).stack);
2416 if version >= version_count {
2417 break;
2418 }
2419 let mut merged: bool = false;
2420 let mut i_0: StackVersion = initial_version_count;
2421 while i_0 < version {
2422 if ts_stack_merge((*self_0).stack, i_0, version) {
2423 merged = true;
2424 break;
2425 } else {
2426 i_0 = i_0.wrapping_add(1);
2427 }
2428 }
2429 if !merged {
2430 let mut state: TSStateId = ts_stack_state((*self_0).stack, version);
2431 let mut has_shift_action: bool = false;
2432 (*self_0).reduce_actions.size = 0 as os::raw::c_int as u32;
2433 let mut first_symbol: TSSymbol = 0;
2434 let mut end_symbol: TSSymbol = 0;
2435 if lookahead_symbol as os::raw::c_int != 0 as os::raw::c_int {
2436 first_symbol = lookahead_symbol;
2437 end_symbol = (lookahead_symbol as os::raw::c_int + 1 as os::raw::c_int) as TSSymbol;
2438 } else {
2439 first_symbol = 1 as os::raw::c_int as TSSymbol;
2440 end_symbol = (*(*self_0).language).token_count as TSSymbol;
2441 }
2442 let mut symbol: TSSymbol = first_symbol;
2443 while (symbol as os::raw::c_int) < end_symbol as os::raw::c_int {
2444 let mut entry: TableEntry = TableEntry {
2445 actions: 0 as *const TSParseAction,
2446 action_count: 0,
2447 is_reusable: false,
2448 };
2449 ts_language_table_entry((*self_0).language, state, symbol, &mut entry);
2450 let mut i_1: u32 = 0 as os::raw::c_int as u32;
2451 while i_1 < entry.action_count {
2452 let mut action: TSParseAction = *(entry.actions).offset(i_1 as isize);
2453 match action.type_ as os::raw::c_int {
2454 0 | 3 => {
2455 if !action.shift.extra && !action.shift.repetition {
2456 has_shift_action = true;
2457 }
2458 }
2459 1 => {
2460 if action.reduce.child_count as os::raw::c_int > 0 as os::raw::c_int {
2461 ts_reduce_action_set_add(&mut (*self_0).reduce_actions, {
2462 let mut init = ReduceAction {
2463 count: action.reduce.child_count as u32,
2464 symbol: action.reduce.symbol,
2465 dynamic_precedence: action.reduce.dynamic_precedence
2466 as os::raw::c_int,
2467 production_id: action.reduce.production_id,
2468 };
2469 init
2470 });
2471 }
2472 }
2473 _ => {}
2474 }
2475 i_1 = i_1.wrapping_add(1);
2476 }
2477 symbol = symbol.wrapping_add(1);
2478 }
2479 let mut reduction_version: StackVersion = -(1 as os::raw::c_int) as StackVersion;
2480 let mut i_2: u32 = 0 as os::raw::c_int as u32;
2481 while i_2 < (*self_0).reduce_actions.size {
2482 let mut action_0: ReduceAction =
2483 *((*self_0).reduce_actions.contents).offset(i_2 as isize);
2484 reduction_version = ts_parser__reduce(
2485 self_0,
2486 version,
2487 action_0.symbol,
2488 action_0.count,
2489 action_0.dynamic_precedence,
2490 action_0.production_id,
2491 true,
2492 false,
2493 );
2494 i_2 = i_2.wrapping_add(1);
2495 }
2496 if has_shift_action {
2497 can_shift_lookahead_symbol = true;
2498 current_block_33 = 13678349939556791712;
2499 } else if reduction_version != -(1 as os::raw::c_int) as StackVersion
2500 && i < MAX_VERSION_COUNT
2501 {
2502 ts_stack_renumber_version((*self_0).stack, reduction_version, version);
2503 current_block_33 = 14916268686031723178;
2504 } else {
2505 if lookahead_symbol as os::raw::c_int != 0 as os::raw::c_int {
2506 ts_stack_remove_version((*self_0).stack, version);
2507 }
2508 current_block_33 = 13678349939556791712;
2509 }
2510 match current_block_33 {
2511 14916268686031723178 => {}
2512 _ => {
2513 if version == starting_version {
2514 version = version_count;
2515 } else {
2516 version = version.wrapping_add(1);
2517 }
2518 }
2519 }
2520 }
2521 i = i.wrapping_add(1);
2522 }
2523 return can_shift_lookahead_symbol;
2524}
2525unsafe extern "C" fn ts_parser__recover_to_state(
2526 mut self_0: *mut TSParser,
2527 mut version: StackVersion,
2528 mut depth: os::raw::c_uint,
2529 mut goal_state: TSStateId,
2530) -> bool {
2531 let mut pop: StackSliceArray = ts_stack_pop_count((*self_0).stack, version, depth);
2532 let mut previous_version: StackVersion = -(1 as os::raw::c_int) as StackVersion;
2533 let mut i: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
2534 while i < pop.size {
2535 let mut slice: StackSlice = *(pop.contents).offset(i as isize);
2536 if slice.version == previous_version {
2537 ts_subtree_array_delete(&mut (*self_0).tree_pool, &mut slice.subtrees);
2538 let fresh35 = i;
2539 i = i.wrapping_sub(1);
2540 array__erase(
2541 &mut pop as *mut StackSliceArray as *mut VoidArray,
2542 ::std::mem::size_of::<StackSlice>() as usize,
2543 fresh35,
2544 );
2545 } else if ts_stack_state((*self_0).stack, slice.version) as os::raw::c_int
2546 != goal_state as os::raw::c_int
2547 {
2548 ts_stack_halt((*self_0).stack, slice.version);
2549 ts_subtree_array_delete(&mut (*self_0).tree_pool, &mut slice.subtrees);
2550 let fresh36 = i;
2551 i = i.wrapping_sub(1);
2552 array__erase(
2553 &mut pop as *mut StackSliceArray as *mut VoidArray,
2554 ::std::mem::size_of::<StackSlice>() as usize,
2555 fresh36,
2556 );
2557 } else {
2558 let mut error_trees: SubtreeArray = ts_stack_pop_error((*self_0).stack, slice.version);
2559 if error_trees.size > 0 as os::raw::c_int as os::raw::c_uint {
2560 if error_trees.size == 1 as os::raw::c_int as os::raw::c_uint {
2561 } else {
2562 panic!();
2563 }
2564 let mut error_tree: Subtree =
2565 *(error_trees.contents).offset(0 as os::raw::c_int as isize);
2566 let mut error_child_count: u32 = ts_subtree_child_count(error_tree);
2567 if error_child_count > 0 as os::raw::c_int as os::raw::c_uint {
2568 array__splice(
2569 &mut slice.subtrees as *mut SubtreeArray as *mut VoidArray,
2570 ::std::mem::size_of::<Subtree>() as usize,
2571 0 as os::raw::c_int as u32,
2572 0 as os::raw::c_int as u32,
2573 error_child_count,
2574 (if (error_tree.data).is_inline() as os::raw::c_int != 0 {
2575 0 as *mut Subtree
2576 } else {
2577 (error_tree.ptr as *mut Subtree)
2578 .offset(-((*error_tree.ptr).child_count as os::raw::c_int as isize))
2579 }) as *const os::raw::c_void,
2580 );
2581 let mut j: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
2582 while j < error_child_count {
2583 ts_subtree_retain(*(slice.subtrees.contents).offset(j as isize));
2584 j = j.wrapping_add(1);
2585 }
2586 }
2587 ts_subtree_array_delete(&mut (*self_0).tree_pool, &mut error_trees);
2588 }
2589 ts_subtree_array_remove_trailing_extras(
2590 &mut slice.subtrees,
2591 &mut (*self_0).trailing_extras,
2592 );
2593 if slice.subtrees.size > 0 as os::raw::c_int as os::raw::c_uint {
2594 let mut error: Subtree =
2595 ts_subtree_new_error_node(&mut slice.subtrees, true, (*self_0).language);
2596 ts_stack_push((*self_0).stack, slice.version, error, false, goal_state);
2597 } else {
2598 array__delete(&mut slice.subtrees as *mut SubtreeArray as *mut VoidArray);
2599 }
2600 let mut j_0: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
2601 while j_0 < (*self_0).trailing_extras.size {
2602 let mut tree: Subtree = *((*self_0).trailing_extras.contents).offset(j_0 as isize);
2603 ts_stack_push((*self_0).stack, slice.version, tree, false, goal_state);
2604 j_0 = j_0.wrapping_add(1);
2605 }
2606 previous_version = slice.version;
2607 }
2608 i = i.wrapping_add(1);
2609 }
2610 return previous_version != -(1 as os::raw::c_int) as StackVersion;
2611}
2612unsafe extern "C" fn ts_parser__recover(
2613 mut self_0: *mut TSParser,
2614 mut version: StackVersion,
2615 mut lookahead: Subtree,
2616) {
2617 let mut did_recover: bool = false;
2618 let mut previous_version_count: os::raw::c_uint = ts_stack_version_count((*self_0).stack);
2619 let mut position: Length = ts_stack_position((*self_0).stack, version);
2620 let mut summary: *mut StackSummary = ts_stack_get_summary((*self_0).stack, version);
2621 let mut node_count_since_error: os::raw::c_uint =
2622 ts_stack_node_count_since_error((*self_0).stack, version);
2623 let mut current_error_cost: os::raw::c_uint = ts_stack_error_cost((*self_0).stack, version);
2624 if !summary.is_null() && !ts_subtree_is_error(lookahead) {
2625 let mut i: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
2626 while i < (*summary).size {
2627 let mut entry: StackSummaryEntry = *((*summary).contents).offset(i as isize);
2628 if !(entry.state as os::raw::c_int == 0 as os::raw::c_int) {
2629 if !(entry.position.bytes == position.bytes) {
2630 let mut depth: os::raw::c_uint = entry.depth;
2631 if node_count_since_error > 0 as os::raw::c_int as os::raw::c_uint {
2632 depth = depth.wrapping_add(1);
2633 }
2634 let mut would_merge: bool = false;
2635 let mut j: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
2636 while j < previous_version_count {
2637 if ts_stack_state((*self_0).stack, j) as os::raw::c_int
2638 == entry.state as os::raw::c_int
2639 && (ts_stack_position((*self_0).stack, j)).bytes == position.bytes
2640 {
2641 would_merge = true;
2642 break;
2643 } else {
2644 j = j.wrapping_add(1);
2645 }
2646 }
2647 if !would_merge {
2648 let mut new_cost: os::raw::c_uint = current_error_cost
2649 .wrapping_add(
2650 (entry.depth)
2651 .wrapping_mul(100 as os::raw::c_int as os::raw::c_uint),
2652 )
2653 .wrapping_add(
2654 (position.bytes)
2655 .wrapping_sub(entry.position.bytes)
2656 .wrapping_mul(1 as os::raw::c_int as os::raw::c_uint),
2657 )
2658 .wrapping_add(
2659 (position.extent.row)
2660 .wrapping_sub(entry.position.extent.row)
2661 .wrapping_mul(30 as os::raw::c_int as os::raw::c_uint),
2662 );
2663 if ts_parser__better_version_exists(self_0, version, false, new_cost) {
2664 break;
2665 }
2666 if ts_language_has_actions(
2667 (*self_0).language,
2668 entry.state,
2669 ts_subtree_symbol(lookahead),
2670 ) {
2671 if ts_parser__recover_to_state(self_0, version, depth, entry.state) {
2672 did_recover = true;
2673 if ((*self_0).lexer.logger.log).is_some()
2674 || !((*self_0).dot_graph_file).is_null()
2675 {
2676 snwrite!(
2677 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2678 1024 as os::raw::c_int as usize as usize,
2679 "recover_to_previous state:{}, depth:{}",
2680 entry.state as os::raw::c_int,
2681 depth
2682 )
2683 .unwrap_or(usize::MAX)
2684 as os::raw::c_int;
2685 ts_parser__log(self_0);
2686 }
2687 if !((*self_0).dot_graph_file).is_null() {
2688 ts_stack_print_dot_graph(
2689 (*self_0).stack,
2690 (*self_0).language,
2691 (*self_0).dot_graph_file,
2692 );
2693 ();
2694 }
2695 break;
2696 }
2697 }
2698 }
2699 }
2700 }
2701 i = i.wrapping_add(1);
2702 }
2703 }
2704 let mut i_0: os::raw::c_uint = previous_version_count;
2705 while i_0 < ts_stack_version_count((*self_0).stack) {
2706 if !ts_stack_is_active((*self_0).stack, i_0) {
2707 let fresh37 = i_0;
2708 i_0 = i_0.wrapping_sub(1);
2709 ts_stack_remove_version((*self_0).stack, fresh37);
2710 }
2711 i_0 = i_0.wrapping_add(1);
2712 }
2713 if did_recover as os::raw::c_int != 0
2714 && ts_stack_version_count((*self_0).stack) > MAX_VERSION_COUNT
2715 {
2716 ts_stack_halt((*self_0).stack, version);
2717 ts_subtree_release(&mut (*self_0).tree_pool, lookahead);
2718 return;
2719 }
2720 if did_recover as os::raw::c_int != 0
2721 && ts_subtree_has_external_scanner_state_change(lookahead) as os::raw::c_int != 0
2722 {
2723 ts_stack_halt((*self_0).stack, version);
2724 ts_subtree_release(&mut (*self_0).tree_pool, lookahead);
2725 return;
2726 }
2727 if ts_subtree_is_eof(lookahead) {
2728 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
2729 snwrite!(
2730 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2731 1024 as os::raw::c_int as usize as usize,
2732 "recover_eof",
2733 )
2734 .unwrap_or(usize::MAX) as os::raw::c_int;
2735 ts_parser__log(self_0);
2736 }
2737 let mut children: SubtreeArray = {
2738 let mut init = SubtreeArray {
2739 contents: 0 as *mut Subtree,
2740 size: 0 as os::raw::c_int as u32,
2741 capacity: 0 as os::raw::c_int as u32,
2742 };
2743 init
2744 };
2745 let mut parent: Subtree =
2746 ts_subtree_new_error_node(&mut children, false, (*self_0).language);
2747 ts_stack_push(
2748 (*self_0).stack,
2749 version,
2750 parent,
2751 false,
2752 1 as os::raw::c_int as TSStateId,
2753 );
2754 ts_parser__accept(self_0, version, lookahead);
2755 return;
2756 }
2757 let mut new_cost_0: os::raw::c_uint = current_error_cost
2758 .wrapping_add(100 as os::raw::c_int as os::raw::c_uint)
2759 .wrapping_add(
2760 (ts_subtree_total_bytes(lookahead))
2761 .wrapping_mul(1 as os::raw::c_int as os::raw::c_uint),
2762 )
2763 .wrapping_add(
2764 ((ts_subtree_total_size(lookahead)).extent.row)
2765 .wrapping_mul(30 as os::raw::c_int as os::raw::c_uint),
2766 );
2767 if ts_parser__better_version_exists(self_0, version, false, new_cost_0) {
2768 ts_stack_halt((*self_0).stack, version);
2769 ts_subtree_release(&mut (*self_0).tree_pool, lookahead);
2770 return;
2771 }
2772 let mut n: os::raw::c_uint = 0;
2773 let mut actions: *const TSParseAction = ts_language_actions(
2774 (*self_0).language,
2775 1 as os::raw::c_int as TSStateId,
2776 ts_subtree_symbol(lookahead),
2777 &mut n,
2778 );
2779 if n > 0 as os::raw::c_int as os::raw::c_uint
2780 && (*actions.offset(n.wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize)).type_
2781 as os::raw::c_int
2782 == TSParseActionTypeShift as os::raw::c_int
2783 && (*actions.offset(n.wrapping_sub(1 as os::raw::c_int as os::raw::c_uint) as isize))
2784 .shift
2785 .extra as os::raw::c_int
2786 != 0
2787 {
2788 let mut mutable_lookahead: MutableSubtree =
2789 ts_subtree_make_mut(&mut (*self_0).tree_pool, lookahead);
2790 ts_subtree_set_extra(&mut mutable_lookahead, true);
2791 lookahead = ts_subtree_from_mut(mutable_lookahead);
2792 }
2793 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
2794 snwrite!(
2795 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2796 1024 as os::raw::c_int as usize as usize,
2797 "skip_token symbol:{}",
2798 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2799 (*self_0).language,
2800 ts_subtree_symbol(lookahead)
2801 ))
2802 .to_string_lossy()
2803 )
2804 .unwrap_or(usize::MAX) as os::raw::c_int;
2805 ts_parser__log(self_0);
2806 }
2807 let mut children_0: SubtreeArray = {
2808 let mut init = SubtreeArray {
2809 contents: 0 as *mut Subtree,
2810 size: 0 as os::raw::c_int as u32,
2811 capacity: 0 as os::raw::c_int as u32,
2812 };
2813 init
2814 };
2815 array__reserve(
2816 &mut children_0 as *mut SubtreeArray as *mut VoidArray,
2817 ::std::mem::size_of::<Subtree>() as usize,
2818 1 as os::raw::c_int as u32,
2819 );
2820 array__grow(
2821 &mut children_0 as *mut SubtreeArray as *mut VoidArray,
2822 1 as os::raw::c_int as size_t,
2823 ::std::mem::size_of::<Subtree>() as usize,
2824 );
2825 let fresh38 = children_0.size;
2826 children_0.size = (children_0.size).wrapping_add(1);
2827 *(children_0.contents).offset(fresh38 as isize) = lookahead;
2828 let mut error_repeat: MutableSubtree = ts_subtree_new_node(
2829 (-(1 as os::raw::c_int) as TSSymbol as os::raw::c_int - 1 as os::raw::c_int) as TSSymbol,
2830 &mut children_0,
2831 0 as os::raw::c_int as os::raw::c_uint,
2832 (*self_0).language,
2833 );
2834 if node_count_since_error > 0 as os::raw::c_int as os::raw::c_uint {
2835 let mut pop: StackSliceArray =
2836 ts_stack_pop_count((*self_0).stack, version, 1 as os::raw::c_int as u32);
2837 if pop.size > 1 as os::raw::c_int as os::raw::c_uint {
2838 let mut i_1: os::raw::c_uint = 1 as os::raw::c_int as os::raw::c_uint;
2839 while i_1 < pop.size {
2840 ts_subtree_array_delete(
2841 &mut (*self_0).tree_pool,
2842 &mut (*(pop.contents).offset(i_1 as isize)).subtrees,
2843 );
2844 i_1 = i_1.wrapping_add(1);
2845 }
2846 while ts_stack_version_count((*self_0).stack)
2847 > ((*(pop.contents).offset(0 as os::raw::c_int as isize)).version)
2848 .wrapping_add(1 as os::raw::c_int as os::raw::c_uint)
2849 {
2850 ts_stack_remove_version(
2851 (*self_0).stack,
2852 ((*(pop.contents).offset(0 as os::raw::c_int as isize)).version)
2853 .wrapping_add(1 as os::raw::c_int as os::raw::c_uint),
2854 );
2855 }
2856 }
2857 ts_stack_renumber_version(
2858 (*self_0).stack,
2859 (*(pop.contents).offset(0 as os::raw::c_int as isize)).version,
2860 version,
2861 );
2862 array__grow(
2863 &mut (*(pop.contents).offset(0 as os::raw::c_int as isize)).subtrees
2864 as *mut SubtreeArray as *mut VoidArray,
2865 1 as os::raw::c_int as size_t,
2866 ::std::mem::size_of::<Subtree>() as usize,
2867 );
2868 let ref mut fresh39 = (*(pop.contents).offset(0 as os::raw::c_int as isize))
2869 .subtrees
2870 .size;
2871 let fresh40 = *fresh39;
2872 *fresh39 = (*fresh39).wrapping_add(1);
2873 *((*(pop.contents).offset(0 as os::raw::c_int as isize))
2874 .subtrees
2875 .contents)
2876 .offset(fresh40 as isize) = ts_subtree_from_mut(error_repeat);
2877 error_repeat = ts_subtree_new_node(
2878 (-(1 as os::raw::c_int) as TSSymbol as os::raw::c_int - 1 as os::raw::c_int)
2879 as TSSymbol,
2880 &mut (*(pop.contents).offset(0 as os::raw::c_int as isize)).subtrees,
2881 0 as os::raw::c_int as os::raw::c_uint,
2882 (*self_0).language,
2883 );
2884 }
2885 ts_stack_push(
2886 (*self_0).stack,
2887 version,
2888 ts_subtree_from_mut(error_repeat),
2889 false,
2890 0 as os::raw::c_int as TSStateId,
2891 );
2892 if ts_subtree_has_external_tokens(lookahead) {
2893 ts_stack_set_last_external_token(
2894 (*self_0).stack,
2895 version,
2896 ts_subtree_last_external_token(lookahead),
2897 );
2898 }
2899}
2900unsafe extern "C" fn ts_parser__handle_error(
2901 mut self_0: *mut TSParser,
2902 mut version: StackVersion,
2903 mut lookahead: Subtree,
2904) {
2905 let mut previous_version_count: u32 = ts_stack_version_count((*self_0).stack);
2906 ts_parser__do_all_potential_reductions(self_0, version, 0 as os::raw::c_int as TSSymbol);
2907 let mut version_count: u32 = ts_stack_version_count((*self_0).stack);
2908 let mut position: Length = ts_stack_position((*self_0).stack, version);
2909 let mut did_insert_missing_token: bool = false;
2910 let mut v: StackVersion = version;
2911 while v < version_count {
2912 if !did_insert_missing_token {
2913 let mut state: TSStateId = ts_stack_state((*self_0).stack, v);
2914 let mut missing_symbol: TSSymbol = 1 as os::raw::c_int as TSSymbol;
2915 while (missing_symbol as os::raw::c_uint) < (*(*self_0).language).token_count {
2916 let mut state_after_missing_symbol: TSStateId =
2917 ts_language_next_state((*self_0).language, state, missing_symbol);
2918 if !(state_after_missing_symbol as os::raw::c_int == 0 as os::raw::c_int
2919 || state_after_missing_symbol as os::raw::c_int == state as os::raw::c_int)
2920 {
2921 if ts_language_has_reduce_action(
2922 (*self_0).language,
2923 state_after_missing_symbol,
2924 ts_subtree_leaf_symbol(lookahead),
2925 ) {
2926 ts_lexer_reset(&mut (*self_0).lexer, position);
2927 ts_lexer_mark_end(&mut (*self_0).lexer);
2928 let mut padding: Length =
2929 length_sub((*self_0).lexer.token_end_position, position);
2930 let mut lookahead_bytes: u32 = (ts_subtree_total_bytes(lookahead))
2931 .wrapping_add(ts_subtree_lookahead_bytes(lookahead));
2932 let mut version_with_missing_tree: StackVersion =
2933 ts_stack_copy_version((*self_0).stack, v);
2934 let mut missing_tree: Subtree = ts_subtree_new_missing_leaf(
2935 &mut (*self_0).tree_pool,
2936 missing_symbol,
2937 padding,
2938 lookahead_bytes,
2939 (*self_0).language,
2940 );
2941 ts_stack_push(
2942 (*self_0).stack,
2943 version_with_missing_tree,
2944 missing_tree,
2945 false,
2946 state_after_missing_symbol,
2947 );
2948 if ts_parser__do_all_potential_reductions(
2949 self_0,
2950 version_with_missing_tree,
2951 ts_subtree_leaf_symbol(lookahead),
2952 ) {
2953 if ((*self_0).lexer.logger.log).is_some()
2954 || !((*self_0).dot_graph_file).is_null()
2955 {
2956 snwrite!(
2957 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
2958 1024 as os::raw::c_int as usize as usize,
2959 "recover_with_missing symbol:{}, state:{}",
2960 std::ffi::CStr::from_ptr(ts_language_symbol_name(
2961 (*self_0).language,
2962 missing_symbol
2963 ))
2964 .to_string_lossy(),
2965 ts_stack_state((*self_0).stack, version_with_missing_tree)
2966 as os::raw::c_int
2967 )
2968 .unwrap_or(usize::MAX)
2969 as os::raw::c_int;
2970 ts_parser__log(self_0);
2971 }
2972 did_insert_missing_token = true;
2973 break;
2974 }
2975 }
2976 }
2977 missing_symbol = missing_symbol.wrapping_add(1);
2978 }
2979 }
2980 ts_stack_push(
2981 (*self_0).stack,
2982 v,
2983 Subtree {
2984 ptr: 0 as *const SubtreeHeapData,
2985 },
2986 false,
2987 0 as os::raw::c_int as TSStateId,
2988 );
2989 v = if v == version {
2990 previous_version_count
2991 } else {
2992 v.wrapping_add(1 as os::raw::c_int as os::raw::c_uint)
2993 };
2994 }
2995 let mut i: os::raw::c_uint = previous_version_count;
2996 while i < version_count {
2997 let mut did_merge: bool = ts_stack_merge((*self_0).stack, version, previous_version_count);
2998 if did_merge {
2999 } else {
3000 panic!();
3001 }
3002 i = i.wrapping_add(1);
3003 }
3004 ts_stack_record_summary((*self_0).stack, version, MAX_SUMMARY_DEPTH);
3005 if ts_subtree_child_count(lookahead) > 0 as os::raw::c_int as os::raw::c_uint {
3006 ts_parser__breakdown_lookahead(
3007 self_0,
3008 &mut lookahead,
3009 0 as os::raw::c_int as TSStateId,
3010 &mut (*self_0).reusable_node,
3011 );
3012 }
3013 ts_parser__recover(self_0, version, lookahead);
3014 if !((*self_0).dot_graph_file).is_null() {
3015 ts_stack_print_dot_graph(
3016 (*self_0).stack,
3017 (*self_0).language,
3018 (*self_0).dot_graph_file,
3019 );
3020 ();
3021 }
3022}
3023unsafe extern "C" fn ts_parser__advance(
3024 mut self_0: *mut TSParser,
3025 mut version: StackVersion,
3026 mut allow_node_reuse: bool,
3027) -> bool {
3028 let mut state: TSStateId = ts_stack_state((*self_0).stack, version);
3029 let mut position: u32 = (ts_stack_position((*self_0).stack, version)).bytes;
3030 let mut last_external_token: Subtree = ts_stack_last_external_token((*self_0).stack, version);
3031 let mut did_reuse: bool = true;
3032 let mut lookahead: Subtree = Subtree {
3033 ptr: 0 as *const SubtreeHeapData,
3034 };
3035 let mut table_entry: TableEntry = {
3036 let mut init = TableEntry {
3037 actions: 0 as *const TSParseAction,
3038 action_count: 0 as os::raw::c_int as u32,
3039 is_reusable: false,
3040 };
3041 init
3042 };
3043 if allow_node_reuse {
3044 lookahead = ts_parser__reuse_node(
3045 self_0,
3046 version,
3047 &mut state,
3048 position,
3049 last_external_token,
3050 &mut table_entry,
3051 );
3052 }
3053 if (lookahead.ptr).is_null() {
3054 did_reuse = false;
3055 lookahead = ts_parser__get_cached_token(
3056 self_0,
3057 state,
3058 position as size_t,
3059 last_external_token,
3060 &mut table_entry,
3061 );
3062 }
3063 let mut needs_lex: bool = (lookahead.ptr).is_null();
3064 loop {
3065 if needs_lex {
3066 needs_lex = false;
3067 lookahead = ts_parser__lex(self_0, version, state);
3068 if !(lookahead.ptr).is_null() {
3069 ts_parser__set_cached_token(
3070 self_0,
3071 position as size_t,
3072 last_external_token,
3073 lookahead,
3074 );
3075 ts_language_table_entry(
3076 (*self_0).language,
3077 state,
3078 ts_subtree_symbol(lookahead),
3079 &mut table_entry,
3080 );
3081 } else {
3082 ts_language_table_entry(
3083 (*self_0).language,
3084 state,
3085 0 as os::raw::c_int as TSSymbol,
3086 &mut table_entry,
3087 );
3088 }
3089 }
3090 let ref mut fresh41 = (*self_0).operation_count;
3091 *fresh41 = (*fresh41).wrapping_add(1);
3092 if *fresh41 == OP_COUNT_PER_TIMEOUT_CHECK {
3093 (*self_0).operation_count = 0 as os::raw::c_int as os::raw::c_uint;
3094 }
3095 if (*self_0).operation_count == 0 as os::raw::c_int as os::raw::c_uint
3096 && (!((*self_0).cancellation_flag).is_null()
3097 && atomic_load((*self_0).cancellation_flag) != 0
3098 || !clock_is_null((*self_0).end_clock)
3099 && clock_is_gt(clock_now(), (*self_0).end_clock) as os::raw::c_int != 0)
3100 {
3101 ts_subtree_release(&mut (*self_0).tree_pool, lookahead);
3102 return false;
3103 }
3104 let mut last_reduction_version: StackVersion = -(1 as os::raw::c_int) as StackVersion;
3105 let mut i: u32 = 0 as os::raw::c_int as u32;
3106 while i < table_entry.action_count {
3107 let mut action: TSParseAction = *(table_entry.actions).offset(i as isize);
3108 match action.type_ as os::raw::c_int {
3109 0 => {
3110 if !action.shift.repetition {
3111 let mut next_state: TSStateId = 0;
3112 if action.shift.extra {
3113 next_state = state;
3114 if ((*self_0).lexer.logger.log).is_some()
3115 || !((*self_0).dot_graph_file).is_null()
3116 {
3117 snwrite!(
3118 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3119 1024 as os::raw::c_int as usize as usize,
3120 "shift_extra",
3121 )
3122 .unwrap_or(usize::MAX)
3123 as os::raw::c_int;
3124 ts_parser__log(self_0);
3125 }
3126 } else {
3127 next_state = action.shift.state;
3128 if ((*self_0).lexer.logger.log).is_some()
3129 || !((*self_0).dot_graph_file).is_null()
3130 {
3131 snwrite!(
3132 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3133 1024 as os::raw::c_int as usize as usize,
3134 "shift state:{}",
3135 next_state as os::raw::c_int
3136 )
3137 .unwrap_or(usize::MAX)
3138 as os::raw::c_int;
3139 ts_parser__log(self_0);
3140 }
3141 }
3142 if ts_subtree_child_count(lookahead)
3143 > 0 as os::raw::c_int as os::raw::c_uint
3144 {
3145 ts_parser__breakdown_lookahead(
3146 self_0,
3147 &mut lookahead,
3148 state,
3149 &mut (*self_0).reusable_node,
3150 );
3151 next_state = ts_language_next_state(
3152 (*self_0).language,
3153 state,
3154 ts_subtree_symbol(lookahead),
3155 );
3156 }
3157 ts_parser__shift(
3158 self_0,
3159 version,
3160 next_state,
3161 lookahead,
3162 action.shift.extra,
3163 );
3164 if did_reuse {
3165 reusable_node_advance(&mut (*self_0).reusable_node);
3166 }
3167 return true;
3168 }
3169 }
3170 1 => {
3171 let mut is_fragile: bool =
3172 table_entry.action_count > 1 as os::raw::c_int as os::raw::c_uint;
3173 let mut end_of_non_terminal_extra: bool = (lookahead.ptr).is_null();
3174 if ((*self_0).lexer.logger.log).is_some()
3175 || !((*self_0).dot_graph_file).is_null()
3176 {
3177 snwrite!(
3178 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3179 1024 as os::raw::c_int as usize as usize,
3180 "reduce sym:{}, child_count:{}",
3181 std::ffi::CStr::from_ptr(ts_language_symbol_name(
3182 (*self_0).language,
3183 action.reduce.symbol,
3184 ))
3185 .to_string_lossy(),
3186 action.reduce.child_count as os::raw::c_int
3187 )
3188 .unwrap_or(usize::MAX) as os::raw::c_int;
3189 ts_parser__log(self_0);
3190 }
3191 let mut reduction_version: StackVersion = ts_parser__reduce(
3192 self_0,
3193 version,
3194 action.reduce.symbol,
3195 action.reduce.child_count as u32,
3196 action.reduce.dynamic_precedence as os::raw::c_int,
3197 action.reduce.production_id,
3198 is_fragile,
3199 end_of_non_terminal_extra,
3200 );
3201 if reduction_version != -(1 as os::raw::c_int) as StackVersion {
3202 last_reduction_version = reduction_version;
3203 }
3204 }
3205 2 => {
3206 if ((*self_0).lexer.logger.log).is_some()
3207 || !((*self_0).dot_graph_file).is_null()
3208 {
3209 snwrite!(
3210 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3211 1024 as os::raw::c_int as usize as usize,
3212 "accept",
3213 )
3214 .unwrap_or(usize::MAX) as os::raw::c_int;
3215 ts_parser__log(self_0);
3216 }
3217 ts_parser__accept(self_0, version, lookahead);
3218 return true;
3219 }
3220 3 => {
3221 if ts_subtree_child_count(lookahead) > 0 as os::raw::c_int as os::raw::c_uint {
3222 ts_parser__breakdown_lookahead(
3223 self_0,
3224 &mut lookahead,
3225 0 as os::raw::c_int as TSStateId,
3226 &mut (*self_0).reusable_node,
3227 );
3228 }
3229 ts_parser__recover(self_0, version, lookahead);
3230 if did_reuse {
3231 reusable_node_advance(&mut (*self_0).reusable_node);
3232 }
3233 return true;
3234 }
3235 _ => {}
3236 }
3237 i = i.wrapping_add(1);
3238 }
3239 if last_reduction_version != -(1 as os::raw::c_int) as StackVersion {
3240 ts_stack_renumber_version((*self_0).stack, last_reduction_version, version);
3241 if !((*self_0).dot_graph_file).is_null() {
3242 ts_stack_print_dot_graph(
3243 (*self_0).stack,
3244 (*self_0).language,
3245 (*self_0).dot_graph_file,
3246 );
3247 ();
3248 }
3249 state = ts_stack_state((*self_0).stack, version);
3250 if (lookahead.ptr).is_null() {
3251 needs_lex = true;
3252 } else {
3253 ts_language_table_entry(
3254 (*self_0).language,
3255 state,
3256 ts_subtree_leaf_symbol(lookahead),
3257 &mut table_entry,
3258 );
3259 }
3260 } else {
3261 if (lookahead.ptr).is_null() {
3262 ts_stack_halt((*self_0).stack, version);
3263 return true;
3264 }
3265 if ts_subtree_is_keyword(lookahead) as os::raw::c_int != 0
3266 && ts_subtree_symbol(lookahead) as os::raw::c_int
3267 != (*(*self_0).language).keyword_capture_token as os::raw::c_int
3268 {
3269 ts_language_table_entry(
3270 (*self_0).language,
3271 state,
3272 (*(*self_0).language).keyword_capture_token,
3273 &mut table_entry,
3274 );
3275 if table_entry.action_count > 0 as os::raw::c_int as os::raw::c_uint {
3276 if ((*self_0).lexer.logger.log).is_some()
3277 || !((*self_0).dot_graph_file).is_null()
3278 {
3279 snwrite!(
3280 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3281 1024 as os::raw::c_int as usize as usize,
3282 "switch from_keyword:{}, to_word_token:{}",
3283 std::ffi::CStr::from_ptr(ts_language_symbol_name(
3284 (*self_0).language,
3285 ts_subtree_symbol(lookahead),
3286 ))
3287 .to_string_lossy(),
3288 std::ffi::CStr::from_ptr(ts_language_symbol_name(
3289 (*self_0).language,
3290 (*(*self_0).language).keyword_capture_token,
3291 ))
3292 .to_string_lossy()
3293 )
3294 .unwrap_or(usize::MAX) as os::raw::c_int;
3295 ts_parser__log(self_0);
3296 }
3297 let mut mutable_lookahead: MutableSubtree =
3298 ts_subtree_make_mut(&mut (*self_0).tree_pool, lookahead);
3299 ts_subtree_set_symbol(
3300 &mut mutable_lookahead,
3301 (*(*self_0).language).keyword_capture_token,
3302 (*self_0).language,
3303 );
3304 lookahead = ts_subtree_from_mut(mutable_lookahead);
3305 continue;
3306 }
3307 }
3308 if state as os::raw::c_int == 0 as os::raw::c_int {
3309 ts_parser__recover(self_0, version, lookahead);
3310 return true;
3311 }
3312 if ts_parser__breakdown_top_of_stack(self_0, version) {
3313 state = ts_stack_state((*self_0).stack, version);
3314 ts_subtree_release(&mut (*self_0).tree_pool, lookahead);
3315 needs_lex = true;
3316 } else {
3317 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3318 snwrite!(
3319 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3320 1024 as os::raw::c_int as usize as usize,
3321 "detect_error",
3322 )
3323 .unwrap_or(usize::MAX) as os::raw::c_int;
3324 ts_parser__log(self_0);
3325 }
3326 ts_stack_pause((*self_0).stack, version, lookahead);
3327 return true;
3328 }
3329 }
3330 }
3331}
3332unsafe extern "C" fn ts_parser__condense_stack(mut self_0: *mut TSParser) -> os::raw::c_uint {
3333 let mut made_changes: bool = false;
3334 let mut min_error_cost: os::raw::c_uint = (2147483647 as os::raw::c_int as os::raw::c_uint)
3335 .wrapping_mul(2 as os::raw::c_uint)
3336 .wrapping_add(1 as os::raw::c_uint);
3337 let mut i: StackVersion = 0 as os::raw::c_int as StackVersion;
3338 while i < ts_stack_version_count((*self_0).stack) {
3339 if ts_stack_is_halted((*self_0).stack, i) {
3340 ts_stack_remove_version((*self_0).stack, i);
3341 i = i.wrapping_sub(1);
3342 } else {
3343 let mut status_i: ErrorStatus = ts_parser__version_status(self_0, i);
3344 if !status_i.is_in_error && status_i.cost < min_error_cost {
3345 min_error_cost = status_i.cost;
3346 }
3347 let mut j: StackVersion = 0 as os::raw::c_int as StackVersion;
3348 while j < i {
3349 let mut status_j: ErrorStatus = ts_parser__version_status(self_0, j);
3350 match ts_parser__compare_versions(self_0, status_j, status_i) as os::raw::c_uint {
3351 0 => {
3352 made_changes = true;
3353 ts_stack_remove_version((*self_0).stack, i);
3354 i = i.wrapping_sub(1);
3355 j = i;
3356 }
3357 1 | 2 => {
3358 if ts_stack_merge((*self_0).stack, j, i) {
3359 made_changes = true;
3360 i = i.wrapping_sub(1);
3361 j = i;
3362 }
3363 }
3364 3 => {
3365 made_changes = true;
3366 if ts_stack_merge((*self_0).stack, j, i) {
3367 i = i.wrapping_sub(1);
3368 j = i;
3369 } else {
3370 ts_stack_swap_versions((*self_0).stack, i, j);
3371 }
3372 }
3373 4 => {
3374 made_changes = true;
3375 ts_stack_remove_version((*self_0).stack, j);
3376 i = i.wrapping_sub(1);
3377 j = j.wrapping_sub(1);
3378 }
3379 _ => {}
3380 }
3381 j = j.wrapping_add(1);
3382 }
3383 }
3384 i = i.wrapping_add(1);
3385 }
3386 while ts_stack_version_count((*self_0).stack) > MAX_VERSION_COUNT {
3387 ts_stack_remove_version((*self_0).stack, MAX_VERSION_COUNT);
3388 made_changes = true;
3389 }
3390 if ts_stack_version_count((*self_0).stack) > 0 as os::raw::c_int as os::raw::c_uint {
3391 let mut has_unpaused_version: bool = false;
3392 let mut i_0: StackVersion = 0 as os::raw::c_int as StackVersion;
3393 let mut n: StackVersion = ts_stack_version_count((*self_0).stack);
3394 while i_0 < n {
3395 if ts_stack_is_paused((*self_0).stack, i_0) {
3396 if !has_unpaused_version && (*self_0).accept_count < MAX_VERSION_COUNT {
3397 if ((*self_0).lexer.logger.log).is_some()
3398 || !((*self_0).dot_graph_file).is_null()
3399 {
3400 snwrite!(
3401 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3402 1024 as os::raw::c_int as usize as usize,
3403 "resume version:{}",
3404 i_0
3405 )
3406 .unwrap_or(usize::MAX) as os::raw::c_int;
3407 ts_parser__log(self_0);
3408 }
3409 min_error_cost = ts_stack_error_cost((*self_0).stack, i_0);
3410 let mut lookahead: Subtree = ts_stack_resume((*self_0).stack, i_0);
3411 ts_parser__handle_error(self_0, i_0, lookahead);
3412 has_unpaused_version = true;
3413 } else {
3414 ts_stack_remove_version((*self_0).stack, i_0);
3415 i_0 = i_0.wrapping_sub(1);
3416 n = n.wrapping_sub(1);
3417 }
3418 } else {
3419 has_unpaused_version = true;
3420 }
3421 i_0 = i_0.wrapping_add(1);
3422 }
3423 }
3424 if made_changes {
3425 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3426 snwrite!(
3427 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3428 1024 as os::raw::c_int as usize as usize,
3429 "condense",
3430 )
3431 .unwrap_or(usize::MAX) as os::raw::c_int;
3432 ts_parser__log(self_0);
3433 }
3434 if !((*self_0).dot_graph_file).is_null() {
3435 ts_stack_print_dot_graph(
3436 (*self_0).stack,
3437 (*self_0).language,
3438 (*self_0).dot_graph_file,
3439 );
3440 ();
3441 }
3442 }
3443 return min_error_cost;
3444}
3445unsafe extern "C" fn ts_parser_has_outstanding_parse(mut self_0: *mut TSParser) -> bool {
3446 return ts_stack_state((*self_0).stack, 0 as os::raw::c_int as StackVersion) as os::raw::c_int
3447 != 1 as os::raw::c_int
3448 || ts_stack_node_count_since_error((*self_0).stack, 0 as os::raw::c_int as StackVersion)
3449 != 0 as os::raw::c_int as os::raw::c_uint;
3450}
3451#[no_mangle]
3452pub unsafe extern "C" fn ts_parser_new() -> *mut TSParser {
3453 let mut self_0: *mut TSParser = crate::alloc::ts_calloc(
3454 1 as os::raw::c_int as size_t,
3455 ::std::mem::size_of::<TSParser>() as usize,
3456 ) as *mut TSParser;
3457 ts_lexer_init(&mut (*self_0).lexer);
3458 (*self_0).reduce_actions.size = 0 as os::raw::c_int as u32;
3459 (*self_0).reduce_actions.capacity = 0 as os::raw::c_int as u32;
3460 let ref mut fresh42 = (*self_0).reduce_actions.contents;
3461 *fresh42 = 0 as *mut ReduceAction;
3462 array__reserve(
3463 &mut (*self_0).reduce_actions as *mut ReduceActionSet as *mut VoidArray,
3464 ::std::mem::size_of::<ReduceAction>() as usize,
3465 4 as os::raw::c_int as u32,
3466 );
3467 (*self_0).tree_pool = ts_subtree_pool_new(32 as os::raw::c_int as u32);
3468 let ref mut fresh43 = (*self_0).stack;
3469 *fresh43 = ts_stack_new(&mut (*self_0).tree_pool);
3470 (*self_0).finished_tree = Subtree {
3471 ptr: 0 as *const SubtreeHeapData,
3472 };
3473 (*self_0).reusable_node = reusable_node_new();
3474 let ref mut fresh44 = (*self_0).dot_graph_file;
3475 *fresh44 = 0 as *mut FILE;
3476 let ref mut fresh45 = (*self_0).cancellation_flag;
3477 *fresh45 = 0 as *const size_t;
3478 (*self_0).timeout_duration = 0 as os::raw::c_int as TSDuration;
3479 (*self_0).end_clock = clock_null();
3480 (*self_0).operation_count = 0 as os::raw::c_int as os::raw::c_uint;
3481 (*self_0).old_tree = Subtree {
3482 ptr: 0 as *const SubtreeHeapData,
3483 };
3484 (*self_0).included_range_differences = {
3485 let mut init = TSRangeArray {
3486 contents: 0 as *mut TSRange,
3487 size: 0 as os::raw::c_int as u32,
3488 capacity: 0 as os::raw::c_int as u32,
3489 };
3490 init
3491 };
3492 (*self_0).included_range_difference_index = 0 as os::raw::c_int as os::raw::c_uint;
3493 ts_parser__set_cached_token(
3494 self_0,
3495 0 as os::raw::c_int as size_t,
3496 Subtree {
3497 ptr: 0 as *const SubtreeHeapData,
3498 },
3499 Subtree {
3500 ptr: 0 as *const SubtreeHeapData,
3501 },
3502 );
3503 return self_0;
3504}
3505#[no_mangle]
3506pub unsafe extern "C" fn ts_parser_delete(mut self_0: *mut TSParser) {
3507 if self_0.is_null() {
3508 return;
3509 }
3510 ts_parser_set_language(self_0, 0 as *const TSLanguage);
3511 ts_stack_delete((*self_0).stack);
3512 if !((*self_0).reduce_actions.contents).is_null() {
3513 array__delete(&mut (*self_0).reduce_actions as *mut ReduceActionSet as *mut VoidArray);
3514 }
3515 if !((*self_0).included_range_differences.contents).is_null() {
3516 array__delete(
3517 &mut (*self_0).included_range_differences as *mut TSRangeArray as *mut VoidArray,
3518 );
3519 }
3520 if !((*self_0).old_tree.ptr).is_null() {
3521 ts_subtree_release(&mut (*self_0).tree_pool, (*self_0).old_tree);
3522 (*self_0).old_tree = Subtree {
3523 ptr: 0 as *const SubtreeHeapData,
3524 };
3525 }
3526 ts_lexer_delete(&mut (*self_0).lexer);
3527 ts_parser__set_cached_token(
3528 self_0,
3529 0 as os::raw::c_int as size_t,
3530 Subtree {
3531 ptr: 0 as *const SubtreeHeapData,
3532 },
3533 Subtree {
3534 ptr: 0 as *const SubtreeHeapData,
3535 },
3536 );
3537 ts_subtree_pool_delete(&mut (*self_0).tree_pool);
3538 reusable_node_delete(&mut (*self_0).reusable_node);
3539 array__delete(&mut (*self_0).trailing_extras as *mut SubtreeArray as *mut VoidArray);
3540 array__delete(&mut (*self_0).trailing_extras2 as *mut SubtreeArray as *mut VoidArray);
3541 array__delete(&mut (*self_0).scratch_trees as *mut SubtreeArray as *mut VoidArray);
3542 crate::alloc::ts_free(self_0 as *mut os::raw::c_void);
3543}
3544#[no_mangle]
3545pub unsafe extern "C" fn ts_parser_language(mut self_0: *const TSParser) -> *const TSLanguage {
3546 return (*self_0).language;
3547}
3548#[no_mangle]
3549pub unsafe extern "C" fn ts_parser_set_language(
3550 mut self_0: *mut TSParser,
3551 mut language: *const TSLanguage,
3552) -> bool {
3553 if !language.is_null() {
3554 if (*language).version > 14 as os::raw::c_int as os::raw::c_uint {
3555 return false;
3556 }
3557 if (*language).version < 13 as os::raw::c_int as os::raw::c_uint {
3558 return false;
3559 }
3560 }
3561 if !((*self_0).external_scanner_payload).is_null()
3562 && ((*(*self_0).language).external_scanner.destroy).is_some()
3563 {
3564 ((*(*self_0).language).external_scanner.destroy).expect("non-null function pointer")(
3565 (*self_0).external_scanner_payload,
3566 );
3567 }
3568 if !language.is_null() && ((*language).external_scanner.create).is_some() {
3569 let ref mut fresh46 = (*self_0).external_scanner_payload;
3570 *fresh46 = ((*language).external_scanner.create).expect("non-null function pointer")();
3571 } else {
3572 let ref mut fresh47 = (*self_0).external_scanner_payload;
3573 *fresh47 = 0 as *mut os::raw::c_void;
3574 }
3575 let ref mut fresh48 = (*self_0).language;
3576 *fresh48 = language;
3577 ts_parser_reset(self_0);
3578 return true;
3579}
3580#[no_mangle]
3581pub unsafe extern "C" fn ts_parser_logger(mut self_0: *const TSParser) -> TSLogger {
3582 return (*self_0).lexer.logger;
3583}
3584#[no_mangle]
3585pub unsafe extern "C" fn ts_parser_set_logger(mut self_0: *mut TSParser, mut logger: TSLogger) {
3586 (*self_0).lexer.logger = logger;
3587}
3588#[no_mangle]
3589pub unsafe extern "C" fn ts_parser_cancellation_flag(mut self_0: *const TSParser) -> *const size_t {
3590 return (*self_0).cancellation_flag as *const size_t;
3591}
3592#[no_mangle]
3593pub unsafe extern "C" fn ts_parser_set_cancellation_flag(
3594 mut self_0: *mut TSParser,
3595 mut flag: *const size_t,
3596) {
3597 let ref mut fresh51 = (*self_0).cancellation_flag;
3598 *fresh51 = flag as *const size_t;
3599}
3600#[no_mangle]
3601pub unsafe extern "C" fn ts_parser_timeout_micros(mut self_0: *const TSParser) -> u64 {
3602 return duration_to_micros((*self_0).timeout_duration);
3603}
3604#[no_mangle]
3605pub unsafe extern "C" fn ts_parser_set_timeout_micros(
3606 mut self_0: *mut TSParser,
3607 mut timeout_micros: u64,
3608) {
3609 (*self_0).timeout_duration = duration_from_micros(timeout_micros);
3610}
3611#[no_mangle]
3612pub unsafe extern "C" fn ts_parser_set_included_ranges(
3613 mut self_0: *mut TSParser,
3614 mut ranges: *const TSRange,
3615 mut count: u32,
3616) -> bool {
3617 return ts_lexer_set_included_ranges(&mut (*self_0).lexer, ranges, count);
3618}
3619#[no_mangle]
3620pub unsafe extern "C" fn ts_parser_included_ranges(
3621 mut self_0: *const TSParser,
3622 mut count: *mut u32,
3623) -> *const TSRange {
3624 return ts_lexer_included_ranges(&(*self_0).lexer, count);
3625}
3626#[no_mangle]
3627pub unsafe extern "C" fn ts_parser_reset(mut self_0: *mut TSParser) {
3628 if !((*self_0).language).is_null()
3629 && ((*(*self_0).language).external_scanner.deserialize).is_some()
3630 {
3631 ((*(*self_0).language).external_scanner.deserialize).expect("non-null function pointer")(
3632 (*self_0).external_scanner_payload,
3633 0 as *const os::raw::c_char,
3634 0 as os::raw::c_int as os::raw::c_uint,
3635 );
3636 }
3637 if !((*self_0).old_tree.ptr).is_null() {
3638 ts_subtree_release(&mut (*self_0).tree_pool, (*self_0).old_tree);
3639 (*self_0).old_tree = Subtree {
3640 ptr: 0 as *const SubtreeHeapData,
3641 };
3642 }
3643 reusable_node_clear(&mut (*self_0).reusable_node);
3644 ts_lexer_reset(&mut (*self_0).lexer, length_zero());
3645 ts_stack_clear((*self_0).stack);
3646 ts_parser__set_cached_token(
3647 self_0,
3648 0 as os::raw::c_int as size_t,
3649 Subtree {
3650 ptr: 0 as *const SubtreeHeapData,
3651 },
3652 Subtree {
3653 ptr: 0 as *const SubtreeHeapData,
3654 },
3655 );
3656 if !((*self_0).finished_tree.ptr).is_null() {
3657 ts_subtree_release(&mut (*self_0).tree_pool, (*self_0).finished_tree);
3658 (*self_0).finished_tree = Subtree {
3659 ptr: 0 as *const SubtreeHeapData,
3660 };
3661 }
3662 (*self_0).accept_count = 0 as os::raw::c_int as os::raw::c_uint;
3663}
3664#[no_mangle]
3665pub unsafe extern "C" fn ts_parser_parse(
3666 mut self_0: *mut TSParser,
3667 mut old_tree: *const TSTree,
3668 mut input: TSInput,
3669) -> *mut TSTree {
3670 if ((*self_0).language).is_null() || (input.read).is_none() {
3671 return 0 as *mut TSTree;
3672 }
3673 ts_lexer_set_input(&mut (*self_0).lexer, input);
3674 (*self_0).included_range_differences.size = 0 as os::raw::c_int as u32;
3675 (*self_0).included_range_difference_index = 0 as os::raw::c_int as os::raw::c_uint;
3676 if ts_parser_has_outstanding_parse(self_0) {
3677 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3678 snwrite!(
3679 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3680 1024 as os::raw::c_int as usize as usize,
3681 "resume_parsing",
3682 )
3683 .unwrap_or(usize::MAX) as os::raw::c_int;
3684 ts_parser__log(self_0);
3685 }
3686 } else if !old_tree.is_null() {
3687 ts_subtree_retain((*old_tree).root);
3688 (*self_0).old_tree = (*old_tree).root;
3689 ts_range_array_get_changed_ranges(
3690 (*old_tree).included_ranges,
3691 (*old_tree).included_range_count,
3692 (*self_0).lexer.included_ranges,
3693 (*self_0).lexer.included_range_count,
3694 &mut (*self_0).included_range_differences,
3695 );
3696 reusable_node_reset(&mut (*self_0).reusable_node, (*old_tree).root);
3697 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3698 snwrite!(
3699 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3700 1024 as os::raw::c_int as usize as usize,
3701 "parse_after_edit",
3702 )
3703 .unwrap_or(usize::MAX) as os::raw::c_int;
3704 ts_parser__log(self_0);
3705 }
3706 if !((*self_0).dot_graph_file).is_null() {
3707 ts_subtree_print_dot_graph(
3708 (*self_0).old_tree,
3709 (*self_0).language,
3710 (*self_0).dot_graph_file,
3711 );
3712 ();
3713 }
3714 let mut i: os::raw::c_uint = 0 as os::raw::c_int as os::raw::c_uint;
3715 while i < (*self_0).included_range_differences.size {
3716 let mut range: *mut TSRange = &mut *((*self_0).included_range_differences.contents)
3717 .offset(i as isize) as *mut TSRange;
3718 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3719 snwrite!(
3720 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3721 1024 as os::raw::c_int as usize as usize,
3722 "different_included_range {} - {}",
3723 (*range).start_byte,
3724 (*range).end_byte
3725 )
3726 .unwrap_or(usize::MAX) as os::raw::c_int;
3727 ts_parser__log(self_0);
3728 }
3729 i = i.wrapping_add(1);
3730 }
3731 } else {
3732 reusable_node_clear(&mut (*self_0).reusable_node);
3733 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3734 snwrite!(
3735 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3736 1024 as os::raw::c_int as usize as usize,
3737 "new_parse",
3738 )
3739 .unwrap_or(usize::MAX) as os::raw::c_int;
3740 ts_parser__log(self_0);
3741 }
3742 }
3743 (*self_0).operation_count = 0 as os::raw::c_int as os::raw::c_uint;
3744 if (*self_0).timeout_duration != 0 {
3745 (*self_0).end_clock = clock_after(clock_now(), (*self_0).timeout_duration);
3746 } else {
3747 (*self_0).end_clock = clock_null();
3748 }
3749 let mut position: u32 = 0 as os::raw::c_int as u32;
3750 let mut last_position: u32 = 0 as os::raw::c_int as u32;
3751 let mut version_count: u32 = 0 as os::raw::c_int as u32;
3752 loop {
3753 let mut version: StackVersion = 0 as os::raw::c_int as StackVersion;
3754 loop {
3755 version_count = ts_stack_version_count((*self_0).stack);
3756 if !(version < version_count) {
3757 break;
3758 }
3759 let mut allow_node_reuse: bool =
3760 version_count == 1 as os::raw::c_int as os::raw::c_uint;
3761 while ts_stack_is_active((*self_0).stack, version) {
3762 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3763 snwrite!(
3764 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3765 1024 as os::raw::c_int as usize as usize,
3766 "process version:{}, version_count:{}, state:{}, row:{}, col:{}",
3767 version,
3768 ts_stack_version_count((*self_0).stack),
3769 ts_stack_state((*self_0).stack, version) as os::raw::c_int,
3770 (ts_stack_position((*self_0).stack, version)).extent.row,
3771 (ts_stack_position((*self_0).stack, version)).extent.column
3772 )
3773 .unwrap_or(usize::MAX) as os::raw::c_int;
3774 ts_parser__log(self_0);
3775 }
3776 if !ts_parser__advance(self_0, version, allow_node_reuse) {
3777 return 0 as *mut TSTree;
3778 }
3779 if !((*self_0).dot_graph_file).is_null() {
3780 ts_stack_print_dot_graph(
3781 (*self_0).stack,
3782 (*self_0).language,
3783 (*self_0).dot_graph_file,
3784 );
3785 ();
3786 }
3787 position = (ts_stack_position((*self_0).stack, version)).bytes;
3788 if !(position > last_position
3789 || version > 0 as os::raw::c_int as os::raw::c_uint
3790 && position == last_position)
3791 {
3792 continue;
3793 }
3794 last_position = position;
3795 break;
3796 }
3797 version = version.wrapping_add(1);
3798 }
3799 let mut min_error_cost: os::raw::c_uint = ts_parser__condense_stack(self_0);
3800 if !((*self_0).finished_tree.ptr).is_null()
3801 && ts_subtree_error_cost((*self_0).finished_tree) < min_error_cost
3802 {
3803 break;
3804 }
3805 while (*self_0).included_range_difference_index < (*self_0).included_range_differences.size
3806 {
3807 let mut range_0: *mut TSRange = &mut *((*self_0).included_range_differences.contents)
3808 .offset((*self_0).included_range_difference_index as isize)
3809 as *mut TSRange;
3810 if !((*range_0).end_byte <= position) {
3811 break;
3812 }
3813 let ref mut fresh52 = (*self_0).included_range_difference_index;
3814 *fresh52 = (*fresh52).wrapping_add(1);
3815 }
3816 if !(version_count != 0 as os::raw::c_int as os::raw::c_uint) {
3817 break;
3818 }
3819 }
3820 if !((*self_0).finished_tree.ptr).is_null() {
3821 } else {
3822 panic!();
3823 }
3824 ts_subtree_balance(
3825 (*self_0).finished_tree,
3826 &mut (*self_0).tree_pool,
3827 (*self_0).language,
3828 );
3829 if ((*self_0).lexer.logger.log).is_some() || !((*self_0).dot_graph_file).is_null() {
3830 snwrite!(
3831 ((*self_0).lexer.debug_buffer).as_mut_ptr(),
3832 1024 as os::raw::c_int as usize as usize,
3833 "done",
3834 )
3835 .unwrap_or(usize::MAX) as os::raw::c_int;
3836 ts_parser__log(self_0);
3837 }
3838 if !((*self_0).dot_graph_file).is_null() {
3839 ts_subtree_print_dot_graph(
3840 (*self_0).finished_tree,
3841 (*self_0).language,
3842 (*self_0).dot_graph_file,
3843 );
3844 ();
3845 }
3846 let mut result: *mut TSTree = ts_tree_new(
3847 (*self_0).finished_tree,
3848 (*self_0).language,
3849 (*self_0).lexer.included_ranges,
3850 (*self_0).lexer.included_range_count,
3851 );
3852 (*self_0).finished_tree = Subtree {
3853 ptr: 0 as *const SubtreeHeapData,
3854 };
3855 ts_parser_reset(self_0);
3856 return result;
3857}
3858#[no_mangle]
3859pub unsafe extern "C" fn ts_parser_parse_string(
3860 mut self_0: *mut TSParser,
3861 mut old_tree: *const TSTree,
3862 mut string: *const os::raw::c_char,
3863 mut length: u32,
3864) -> *mut TSTree {
3865 return ts_parser_parse_string_encoding(self_0, old_tree, string, length, TSInputEncodingUTF8);
3866}
3867#[no_mangle]
3868pub unsafe extern "C" fn ts_parser_parse_string_encoding(
3869 mut self_0: *mut TSParser,
3870 mut old_tree: *const TSTree,
3871 mut string: *const os::raw::c_char,
3872 mut length: u32,
3873 mut encoding: TSInputEncoding,
3874) -> *mut TSTree {
3875 let mut input: TSStringInput = {
3876 let mut init = TSStringInput {
3877 string: string,
3878 length: length,
3879 };
3880 init
3881 };
3882 return ts_parser_parse(self_0, old_tree, {
3883 let mut init = TSInput {
3884 payload: &mut input as *mut TSStringInput as *mut os::raw::c_void,
3885 read: Some(
3886 ts_string_input_read
3887 as unsafe extern "C" fn(
3888 *mut os::raw::c_void,
3889 u32,
3890 TSPoint,
3891 *mut u32,
3892 ) -> *const os::raw::c_char,
3893 ),
3894 encoding: encoding,
3895 };
3896 init
3897 });
3898}