Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/typing.rs')
-rw-r--r--crates/ide/src/typing.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/crates/ide/src/typing.rs b/crates/ide/src/typing.rs
index 5840719ff6..cfa1d6ff03 100644
--- a/crates/ide/src/typing.rs
+++ b/crates/ide/src/typing.rs
@@ -15,6 +15,8 @@
mod on_enter;
+use std::iter;
+
use ide_db::{base_db::SourceDatabase, FilePosition, RootDatabase};
use span::{Edition, EditionedFileId};
use syntax::{
@@ -120,7 +122,8 @@ fn on_opening_delimiter_typed(
'(' => (
')',
SyntaxKind::L_PAREN,
- &[ast::Expr::can_cast, ast::Pat::can_cast, ast::Type::can_cast] as &[FilterFn],
+ &[ast::Expr::can_cast as FilterFn, ast::Pat::can_cast, ast::Type::can_cast]
+ as &[FilterFn],
),
'<' => ('>', SyntaxKind::L_ANGLE, &[ast::Type::can_cast as FilterFn] as &[FilterFn]),
_ => return None,
@@ -208,7 +211,18 @@ fn on_delimited_node_typed(
/// this works when adding `let =`.
// FIXME: use a snippet completion instead of this hack here.
fn on_eq_typed(file: &SourceFile, offset: TextSize) -> Option<TextEdit> {
- if !stdx::always!(file.syntax().text().char_at(offset) == Some('=')) {
+ let text = file.syntax().text();
+ if !stdx::always!(text.char_at(offset) == Some('=')) {
+ return None;
+ }
+
+ let has_newline = iter::successors(Some(offset), |&offset| Some(offset + TextSize::new(1)))
+ .filter_map(|offset| text.char_at(offset))
+ .find(|&c| !c.is_whitespace() || c == '\n')
+ == Some('n');
+ // don't attempt to add `;` if there is a newline after the `=`, the intent is likely to write
+ // out the expression afterwards!
+ if has_newline {
return None;
}
@@ -468,6 +482,15 @@ fn foo() {
}
",
);
+ type_char_noop(
+ '=',
+ r"
+fn foo() {
+ let foo =$0
+ 1 + 1
+}
+",
+ );
}
#[test]