Remove anchor collections

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Antonio Scandurra 2021-12-09 16:38:46 +01:00
parent 67686dd1c2
commit 65711b2256
18 changed files with 659 additions and 322 deletions

View file

@ -398,7 +398,7 @@ struct SelectNextState {
#[derive(Debug)]
struct BracketPairState {
ranges: AnchorRangeSet,
ranges: Vec<Range<Anchor>>,
pair: BracketPair,
}
@ -1285,7 +1285,7 @@ impl Editor {
fn autoclose_pairs(&mut self, cx: &mut ViewContext<Self>) {
let selections = self.selections::<usize>(cx).collect::<Vec<_>>();
let new_autoclose_pair_state = self.buffer.update(cx, |buffer, cx| {
let new_autoclose_pair = self.buffer.update(cx, |buffer, cx| {
let autoclose_pair = buffer.language().and_then(|language| {
let first_selection_start = selections.first().unwrap().start;
let pair = language.brackets().iter().find(|pair| {
@ -1324,15 +1324,14 @@ impl Editor {
if pair.end.len() == 1 {
let mut delta = 0;
Some(BracketPairState {
ranges: buffer.anchor_range_set(
Bias::Left,
Bias::Right,
selections.iter().map(move |selection| {
ranges: selections
.iter()
.map(move |selection| {
let offset = selection.start + delta;
delta += 1;
offset..offset
}),
),
buffer.anchor_before(offset)..buffer.anchor_after(offset)
})
.collect(),
pair,
})
} else {
@ -1340,26 +1339,26 @@ impl Editor {
}
})
});
self.autoclose_stack.extend(new_autoclose_pair_state);
self.autoclose_stack.extend(new_autoclose_pair);
}
fn skip_autoclose_end(&mut self, text: &str, cx: &mut ViewContext<Self>) -> bool {
let old_selections = self.selections::<usize>(cx).collect::<Vec<_>>();
let autoclose_pair_state = if let Some(autoclose_pair_state) = self.autoclose_stack.last() {
autoclose_pair_state
let autoclose_pair = if let Some(autoclose_pair) = self.autoclose_stack.last() {
autoclose_pair
} else {
return false;
};
if text != autoclose_pair_state.pair.end {
if text != autoclose_pair.pair.end {
return false;
}
debug_assert_eq!(old_selections.len(), autoclose_pair_state.ranges.len());
debug_assert_eq!(old_selections.len(), autoclose_pair.ranges.len());
let buffer = self.buffer.read(cx);
if old_selections
.iter()
.zip(autoclose_pair_state.ranges.ranges::<usize>(buffer))
.zip(autoclose_pair.ranges.iter().map(|r| r.to_offset(buffer)))
.all(|(selection, autoclose_range)| {
let autoclose_range_end = autoclose_range.end.to_offset(buffer);
selection.is_empty() && selection.start == autoclose_range_end
@ -2826,13 +2825,14 @@ impl Editor {
loop {
let next_group = buffer
.diagnostics_in_range::<_, usize>(search_start..buffer.len())
.find_map(|(range, diagnostic)| {
if diagnostic.is_primary
.diagnostics_in_range(search_start..buffer.len())
.find_map(|entry| {
let range = entry.range.to_offset(buffer);
if entry.diagnostic.is_primary
&& !range.is_empty()
&& Some(range.end) != active_primary_range.as_ref().map(|r| *r.end())
{
Some((range, diagnostic.group_id))
Some((range, entry.diagnostic.group_id))
} else {
None
}
@ -2866,12 +2866,13 @@ impl Editor {
let buffer = self.buffer.read(cx);
let primary_range_start = active_diagnostics.primary_range.start.to_offset(buffer);
let is_valid = buffer
.diagnostics_in_range::<_, usize>(active_diagnostics.primary_range.clone())
.any(|(range, diagnostic)| {
diagnostic.is_primary
.diagnostics_in_range(active_diagnostics.primary_range.clone())
.any(|entry| {
let range = entry.range.to_offset(buffer);
entry.diagnostic.is_primary
&& !range.is_empty()
&& range.start == primary_range_start
&& diagnostic.message == active_diagnostics.primary_message
&& entry.diagnostic.message == active_diagnostics.primary_message
});
if is_valid != active_diagnostics.is_valid {
@ -2901,16 +2902,17 @@ impl Editor {
let mut primary_message = None;
let mut group_end = Point::zero();
let diagnostic_group = buffer
.diagnostic_group::<Point>(group_id)
.map(|(range, diagnostic)| {
.diagnostic_group(group_id)
.map(|entry| {
let range = entry.range.to_point(buffer);
if range.end > group_end {
group_end = range.end;
}
if diagnostic.is_primary {
if entry.diagnostic.is_primary {
primary_range = Some(range.clone());
primary_message = Some(diagnostic.message.clone());
primary_message = Some(entry.diagnostic.message.clone());
}
(range, diagnostic.clone())
(range, entry.diagnostic.clone())
})
.collect::<Vec<_>>();
let primary_range = primary_range.unwrap();
@ -3165,12 +3167,12 @@ impl Editor {
self.add_selections_state = None;
self.select_next_state = None;
self.select_larger_syntax_node_stack.clear();
while let Some(autoclose_pair_state) = self.autoclose_stack.last() {
while let Some(autoclose_pair) = self.autoclose_stack.last() {
let all_selections_inside_autoclose_ranges =
if selections.len() == autoclose_pair_state.ranges.len() {
if selections.len() == autoclose_pair.ranges.len() {
selections
.iter()
.zip(autoclose_pair_state.ranges.ranges::<Point>(buffer))
.zip(autoclose_pair.ranges.iter().map(|r| r.to_point(buffer)))
.all(|(selection, autoclose_range)| {
let head = selection.head().to_point(&*buffer);
autoclose_range.start <= head && autoclose_range.end >= head