fn next_state()

in lib/binding_rust/lib.rs [775:823]


    fn next_state(&self, node_child_index: usize) -> usize {
        let current_state = self.current_state();
        let default_state = self.default_state();

        for state in [current_state, default_state].iter() {
            let node_field_id = self.cursor.field_id();
            let node_kind_id = self.cursor.node().kind_id();
            let transitions = node_field_id
                .and_then(|field_id| state.field_transitions.get(&field_id))
                .or_else(|| state.kind_transitions.get(&node_kind_id));

            if let Some(transitions) = transitions {
                for transition in transitions.iter() {
                    if transition
                        .node_kind_id
                        .map_or(false, |id| id != node_kind_id)
                    {
                        continue;
                    }

                    if let Some(text_regex_index) = transition.text_regex_index {
                        let node = self.cursor.node();
                        let text = &self.source[node.start_byte()..node.end_byte()];
                        if let Ok(text) = str::from_utf8(text) {
                            if !self.property_sheet.text_regexes[text_regex_index as usize]
                                .is_match(text)
                            {
                                continue;
                            }
                        }
                    }

                    if let Some(child_index) = transition.child_index {
                        if child_index != node_child_index as u16 {
                            continue;
                        }
                    }

                    return transition.state_id as usize;
                }
            }

            if current_state as *const PropertyState == default_state as *const PropertyState {
                break;
            }
        }

        current_state.default_next_state_id
    }