aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-01-02 15:49:25 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-01-02 15:49:25 +0000
commite6aadf6ef21a25a6dae55f39bc774b5a0ef2ad6c (patch)
tree3ba089370f0a838df54b82181ccf2fb636f8d780
parent29d8bfb9c909847cb37ff6e564ea0e61744277ad (diff)
parent9672ae001e6be8f4ad3a2fd247999ebb205736ab (diff)
Merge #405
405: extend selection inside a string literal should select a word first r=matklad a=gfreezy fixed #402 Co-authored-by: gfreezy <[email protected]>
-rw-r--r--crates/ra_editor/src/extend_selection.rs24
-rw-r--r--crates/ra_vfs/src/lib.rs2
2 files changed, 21 insertions, 5 deletions
diff --git a/crates/ra_editor/src/extend_selection.rs b/crates/ra_editor/src/extend_selection.rs
index bf0727dde..7a423852b 100644
--- a/crates/ra_editor/src/extend_selection.rs
+++ b/crates/ra_editor/src/extend_selection.rs
@@ -6,6 +6,7 @@ use ra_syntax::{
6}; 6};
7 7
8pub fn extend_selection(root: SyntaxNodeRef, range: TextRange) -> Option<TextRange> { 8pub fn extend_selection(root: SyntaxNodeRef, range: TextRange) -> Option<TextRange> {
9 let string_kinds = [COMMENT, STRING, RAW_STRING, BYTE_STRING, RAW_BYTE_STRING];
9 if range.is_empty() { 10 if range.is_empty() {
10 let offset = range.start(); 11 let offset = range.start();
11 let mut leaves = find_leaf_at_offset(root, offset); 12 let mut leaves = find_leaf_at_offset(root, offset);
@@ -15,8 +16,8 @@ pub fn extend_selection(root: SyntaxNodeRef, range: TextRange) -> Option<TextRan
15 let leaf_range = match leaves { 16 let leaf_range = match leaves {
16 LeafAtOffset::None => return None, 17 LeafAtOffset::None => return None,
17 LeafAtOffset::Single(l) => { 18 LeafAtOffset::Single(l) => {
18 if l.kind() == COMMENT { 19 if string_kinds.contains(&l.kind()) {
19 extend_single_word_in_comment(l, offset).unwrap_or_else(|| l.range()) 20 extend_single_word_in_comment_or_string(l, offset).unwrap_or_else(|| l.range())
20 } else { 21 } else {
21 l.range() 22 l.range()
22 } 23 }
@@ -26,7 +27,7 @@ pub fn extend_selection(root: SyntaxNodeRef, range: TextRange) -> Option<TextRan
26 return Some(leaf_range); 27 return Some(leaf_range);
27 }; 28 };
28 let node = find_covering_node(root, range); 29 let node = find_covering_node(root, range);
29 if node.kind() == COMMENT && range == node.range() { 30 if string_kinds.contains(&node.kind()) && range == node.range() {
30 if let Some(range) = extend_comments(node) { 31 if let Some(range) = extend_comments(node) {
31 return Some(range); 32 return Some(range);
32 } 33 }
@@ -38,7 +39,10 @@ pub fn extend_selection(root: SyntaxNodeRef, range: TextRange) -> Option<TextRan
38 } 39 }
39} 40}
40 41
41fn extend_single_word_in_comment(leaf: SyntaxNodeRef, offset: TextUnit) -> Option<TextRange> { 42fn extend_single_word_in_comment_or_string(
43 leaf: SyntaxNodeRef,
44 offset: TextUnit,
45) -> Option<TextRange> {
42 let text: &str = leaf.leaf_text()?; 46 let text: &str = leaf.leaf_text()?;
43 let cursor_position: u32 = (offset - leaf.range().start()).into(); 47 let cursor_position: u32 = (offset - leaf.range().start()).into();
44 48
@@ -262,4 +266,16 @@ impl S {
262 &["hello", "// hello world"], 266 &["hello", "// hello world"],
263 ); 267 );
264 } 268 }
269
270 #[test]
271 fn test_extend_selection_string() {
272 do_check(
273 r#"
274fn bar(){}
275
276" fn f<|>oo() {"
277 "#,
278 &["foo", "\" fn foo() {\""],
279 );
280 }
265} 281}
diff --git a/crates/ra_vfs/src/lib.rs b/crates/ra_vfs/src/lib.rs
index 757eac95b..5bbc3e993 100644
--- a/crates/ra_vfs/src/lib.rs
+++ b/crates/ra_vfs/src/lib.rs
@@ -11,7 +11,7 @@
11//! to support custom watcher events (related to https://github.com/rust-analyzer/rust-analyzer/issues/131) 11//! to support custom watcher events (related to https://github.com/rust-analyzer/rust-analyzer/issues/131)
12//! 12//!
13//! VFS is based on a concept of roots: a set of directories on the file system 13//! VFS is based on a concept of roots: a set of directories on the file system
14//! whihc are watched for changes. Typically, there will be a root for each 14//! which are watched for changes. Typically, there will be a root for each
15//! Cargo package. 15//! Cargo package.
16mod arena; 16mod arena;
17mod io; 17mod io;