private void GotoIdentByLocation(string name, int line, int col, syntax_tree_node cur)
        {
            if (cur == null)
            {
                return;
            }
            if (cur.line() == line && (cur as ident)?.name == name)
            {
                current = cur;
                return;
            }

            var nodes = cur.DescendantNodes();

            if (cur.line() == line && cur.end_line() == line)
            {
                nodes = nodes?.Where(n => n != null &&
                                     n.column() <= col && n.end_column() >= col);
            }
            else
            {
                nodes = nodes?.Where(n => n != null &&
                                     n.line() <= line && n.end_line() >= line);
            }

            if (nodes != null)
            {
                foreach (var n in nodes)
                {
                    GotoIdentByLocation(name, line, col, n);
                }
            }
        }
 private bool In(syntax_tree_node stn, int ln, int col, int end_ln, int end_col)
 => stn.line() >= ln && stn.end_line() < end_ln ||
 ln == end_ln && stn.line() == ln &&
 stn.column() >= col && stn.column() <= end_col ||
 ln != end_ln && (stn.line() == ln && stn.column() >= col ||
                  stn.line() == end_ln && stn.column() <= end_col);