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);