tree_sitter_c2rust_core/
parser.rs

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}