mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
parent
c87fcb4ea5
commit
4c2be06a7e
1 changed files with 36 additions and 4 deletions
|
@ -16,12 +16,18 @@ pub(crate) fn extend(root: SyntaxNodeRef, range: TextRange) -> Option<TextRange>
|
||||||
if leaves.clone().all(|it| it.kind() == WHITESPACE) {
|
if leaves.clone().all(|it| it.kind() == WHITESPACE) {
|
||||||
return Some(extend_ws(root, leaves.next()?, offset));
|
return Some(extend_ws(root, leaves.next()?, offset));
|
||||||
}
|
}
|
||||||
let leaf = match leaves {
|
let leaf_range = match leaves {
|
||||||
LeafAtOffset::None => return None,
|
LeafAtOffset::None => return None,
|
||||||
LeafAtOffset::Single(l) => l,
|
LeafAtOffset::Single(l) => {
|
||||||
LeafAtOffset::Between(l, r) => pick_best(l, r),
|
if l.kind() == COMMENT {
|
||||||
|
extend_single_word_in_comment(l, range).unwrap_or_else(||l.range())
|
||||||
|
} else {
|
||||||
|
l.range()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
LeafAtOffset::Between(l, r) => pick_best(l, r).range(),
|
||||||
};
|
};
|
||||||
return Some(leaf.range());
|
return Some(leaf_range);
|
||||||
};
|
};
|
||||||
let node = find_covering_node(root, range);
|
let node = find_covering_node(root, range);
|
||||||
if node.kind() == COMMENT && range == node.range() {
|
if node.kind() == COMMENT && range == node.range() {
|
||||||
|
@ -36,6 +42,24 @@ pub(crate) fn extend(root: SyntaxNodeRef, range: TextRange) -> Option<TextRange>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn extend_single_word_in_comment(leaf: SyntaxNodeRef, range: TextRange) -> Option<TextRange> {
|
||||||
|
let text : &str = leaf.leaf_text().unwrap();
|
||||||
|
let cursor_position: u32 = (range.start() - leaf.range().start()).into();
|
||||||
|
|
||||||
|
let (before, after) = text.split_at(cursor_position as usize);
|
||||||
|
let start_idx = before.rfind(char::is_whitespace);
|
||||||
|
let end_idx = after.find(char::is_whitespace);
|
||||||
|
|
||||||
|
match (start_idx, end_idx) {
|
||||||
|
(Some(start), Some(end)) => {
|
||||||
|
let from : TextUnit = (start as u32 + 1).into();
|
||||||
|
let to : TextUnit = (cursor_position + (end as u32)).into();
|
||||||
|
Some(TextRange::from_to(from, to))
|
||||||
|
},
|
||||||
|
(_, _) => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn extend_ws(root: SyntaxNodeRef, ws: SyntaxNodeRef, offset: TextUnit) -> TextRange {
|
fn extend_ws(root: SyntaxNodeRef, ws: SyntaxNodeRef, offset: TextUnit) -> TextRange {
|
||||||
let ws_text = ws.leaf_text().unwrap();
|
let ws_text = ws.leaf_text().unwrap();
|
||||||
let suffix = TextRange::from_to(offset, ws.range().end()) - ws.range().start();
|
let suffix = TextRange::from_to(offset, ws.range().end()) - ws.range().start();
|
||||||
|
@ -176,4 +200,12 @@ fn main() { foo+<|>bar;}
|
||||||
&["'a", "<'a>"]
|
&["'a", "<'a>"]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_extend_selection_select_first_word() {
|
||||||
|
do_check(
|
||||||
|
r#"// foo bar b<|>az quxx"#,
|
||||||
|
&["baz", "// foo bar baz quxx"]
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue