diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2024-12-06 14:15:13 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-06 14:15:13 +0000 |
| commit | 9549e473a02aba6f3bd8bf5b988c5c7ca1c03e82 (patch) | |
| tree | c18b35ce4263fdfdadf038a9c9665948af5338dc | |
| parent | 2a06000caea1c75450bd0178a3f11cd8fb6e24f5 (diff) | |
| parent | a086560b23fd1523bbb88a33b66a95a1f04b9c3c (diff) | |
| download | rust-9549e473a02aba6f3bd8bf5b988c5c7ca1c03e82.tar.gz rust-9549e473a02aba6f3bd8bf5b988c5c7ca1c03e82.zip | |
Merge pull request #18627 from Veykril/push-tzvnrnytrksr
Improve heuristics for on typing semicolon insertion
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide/src/typing.rs | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/tools/rust-analyzer/crates/ide/src/typing.rs b/src/tools/rust-analyzer/crates/ide/src/typing.rs index 5840719ff68..cfa1d6ff031 100644 --- a/src/tools/rust-analyzer/crates/ide/src/typing.rs +++ b/src/tools/rust-analyzer/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] |
