diff options
Diffstat (limited to 'crates/ra_ide_api/src/typing.rs')
-rw-r--r-- | crates/ra_ide_api/src/typing.rs | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/crates/ra_ide_api/src/typing.rs b/crates/ra_ide_api/src/typing.rs index 501d44dbb..4510d663d 100644 --- a/crates/ra_ide_api/src/typing.rs +++ b/crates/ra_ide_api/src/typing.rs | |||
@@ -1,8 +1,8 @@ | |||
1 | use ra_syntax::{ | 1 | use ra_syntax::{ |
2 | AstNode, SourceFile, SyntaxKind::*, | 2 | AstNode, SourceFile, SyntaxKind::*, |
3 | SyntaxNode, TextUnit, TextRange, | 3 | TextUnit, TextRange, SyntaxToken, |
4 | algo::{find_node_at_offset, find_leaf_at_offset, LeafAtOffset}, | 4 | algo::{find_node_at_offset, find_token_at_offset, TokenAtOffset}, |
5 | ast::{self, AstToken}, | 5 | ast::{self}, |
6 | }; | 6 | }; |
7 | use ra_fmt::leading_indent; | 7 | use ra_fmt::leading_indent; |
8 | use ra_text_edit::{TextEdit, TextEditBuilder}; | 8 | use ra_text_edit::{TextEdit, TextEditBuilder}; |
@@ -11,11 +11,11 @@ use crate::{db::RootDatabase, SourceChange, SourceFileEdit}; | |||
11 | 11 | ||
12 | pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option<SourceChange> { | 12 | pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option<SourceChange> { |
13 | let file = db.parse(position.file_id); | 13 | let file = db.parse(position.file_id); |
14 | let comment = find_leaf_at_offset(file.syntax(), position.offset) | 14 | let comment = find_token_at_offset(file.syntax(), position.offset) |
15 | .left_biased() | 15 | .left_biased() |
16 | .and_then(ast::Comment::cast)?; | 16 | .and_then(ast::Comment::cast)?; |
17 | 17 | ||
18 | if let ast::CommentFlavor::Multiline = comment.flavor() { | 18 | if comment.flavor() == ast::CommentFlavor::Multiline { |
19 | return None; | 19 | return None; |
20 | } | 20 | } |
21 | 21 | ||
@@ -41,23 +41,23 @@ pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option<Sour | |||
41 | ) | 41 | ) |
42 | } | 42 | } |
43 | 43 | ||
44 | fn node_indent<'a>(file: &'a SourceFile, node: &SyntaxNode) -> Option<&'a str> { | 44 | fn node_indent<'a>(file: &'a SourceFile, token: SyntaxToken) -> Option<&'a str> { |
45 | let ws = match find_leaf_at_offset(file.syntax(), node.range().start()) { | 45 | let ws = match find_token_at_offset(file.syntax(), token.range().start()) { |
46 | LeafAtOffset::Between(l, r) => { | 46 | TokenAtOffset::Between(l, r) => { |
47 | assert!(r == node); | 47 | assert!(r == token); |
48 | l | 48 | l |
49 | } | 49 | } |
50 | LeafAtOffset::Single(n) => { | 50 | TokenAtOffset::Single(n) => { |
51 | assert!(n == node); | 51 | assert!(n == token); |
52 | return Some(""); | 52 | return Some(""); |
53 | } | 53 | } |
54 | LeafAtOffset::None => unreachable!(), | 54 | TokenAtOffset::None => unreachable!(), |
55 | }; | 55 | }; |
56 | if ws.kind() != WHITESPACE { | 56 | if ws.kind() != WHITESPACE { |
57 | return None; | 57 | return None; |
58 | } | 58 | } |
59 | let text = ws.leaf_text().unwrap(); | 59 | let text = ws.text(); |
60 | let pos = text.as_str().rfind('\n').map(|it| it + 1).unwrap_or(0); | 60 | let pos = text.rfind('\n').map(|it| it + 1).unwrap_or(0); |
61 | Some(&text[pos..]) | 61 | Some(&text[pos..]) |
62 | } | 62 | } |
63 | 63 | ||
@@ -88,7 +88,7 @@ pub(crate) fn on_dot_typed(db: &RootDatabase, position: FilePosition) -> Option< | |||
88 | let file = db.parse(position.file_id); | 88 | let file = db.parse(position.file_id); |
89 | assert_eq!(file.syntax().text().char_at(position.offset), Some('.')); | 89 | assert_eq!(file.syntax().text().char_at(position.offset), Some('.')); |
90 | 90 | ||
91 | let whitespace = find_leaf_at_offset(file.syntax(), position.offset) | 91 | let whitespace = find_token_at_offset(file.syntax(), position.offset) |
92 | .left_biased() | 92 | .left_biased() |
93 | .and_then(ast::Whitespace::cast)?; | 93 | .and_then(ast::Whitespace::cast)?; |
94 | 94 | ||
@@ -100,7 +100,7 @@ pub(crate) fn on_dot_typed(db: &RootDatabase, position: FilePosition) -> Option< | |||
100 | let current_indent_len = TextUnit::of_str(current_indent); | 100 | let current_indent_len = TextUnit::of_str(current_indent); |
101 | 101 | ||
102 | // Make sure dot is a part of call chain | 102 | // Make sure dot is a part of call chain |
103 | let field_expr = whitespace.syntax().parent().and_then(ast::FieldExpr::cast)?; | 103 | let field_expr = ast::FieldExpr::cast(whitespace.syntax().parent())?; |
104 | let prev_indent = leading_indent(field_expr.syntax())?; | 104 | let prev_indent = leading_indent(field_expr.syntax())?; |
105 | let target_indent = format!(" {}", prev_indent); | 105 | let target_indent = format!(" {}", prev_indent); |
106 | let target_indent_len = TextUnit::of_str(&target_indent); | 106 | let target_indent_len = TextUnit::of_str(&target_indent); |