From 6b823b0234ab983d7cc9304dfbf2710809da1cdc Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 14 Jul 2022 22:56:56 +0200 Subject: [PATCH] fix: Fix imports being inserted before doc comments in inline modules --- crates/ide-db/src/imports/insert_use.rs | 48 +++++++++---------- crates/ide-db/src/imports/insert_use/tests.rs | 13 +++++ 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/crates/ide-db/src/imports/insert_use.rs b/crates/ide-db/src/imports/insert_use.rs index d1cd347819703..c14182279d05e 100644 --- a/crates/ide-db/src/imports/insert_use.rs +++ b/crates/ide-db/src/imports/insert_use.rs @@ -396,10 +396,19 @@ fn insert_use_( } } + let l_curly = match scope { + ImportScope::File(_) => None, + // don't insert the imports before the item list/block expr's opening curly brace + ImportScope::Module(item_list) => item_list.l_curly_token(), + // don't insert the imports before the item list's opening curly brace + ImportScope::Block(block) => block.l_curly_token(), + }; // there are no imports in this file at all // so put the import after all inner module attributes and possible license header comments if let Some(last_inner_element) = scope_syntax .children_with_tokens() + // skip the curly brace + .skip(l_curly.is_some() as usize) .take_while(|child| match child { NodeOrToken::Node(node) => is_inner_attribute(node.clone()), NodeOrToken::Token(token) => { @@ -413,30 +422,21 @@ fn insert_use_( cov_mark::hit!(insert_empty_inner_attr); ted::insert(ted::Position::after(&last_inner_element), use_item.syntax()); ted::insert(ted::Position::after(last_inner_element), make::tokens::single_newline()); - return; - } - let l_curly = match scope { - ImportScope::File(_) => { - cov_mark::hit!(insert_empty_file); - ted::insert(ted::Position::first_child_of(scope_syntax), make::tokens::blank_line()); - ted::insert(ted::Position::first_child_of(scope_syntax), use_item.syntax()); - return; - } - // don't insert the imports before the item list/block expr's opening curly brace - ImportScope::Module(item_list) => item_list.l_curly_token(), - // don't insert the imports before the item list's opening curly brace - ImportScope::Block(block) => block.l_curly_token(), - }; - match l_curly { - Some(b) => { - cov_mark::hit!(insert_empty_module); - ted::insert(ted::Position::after(&b), make::tokens::single_newline()); - ted::insert(ted::Position::after(&b), use_item.syntax()); - } - None => { - // This should never happens, broken module syntax node - ted::insert(ted::Position::first_child_of(scope_syntax), make::tokens::blank_line()); - ted::insert(ted::Position::first_child_of(scope_syntax), use_item.syntax()); + } else { + match l_curly { + Some(b) => { + cov_mark::hit!(insert_empty_module); + ted::insert(ted::Position::after(&b), make::tokens::single_newline()); + ted::insert(ted::Position::after(&b), use_item.syntax()); + } + None => { + cov_mark::hit!(insert_empty_file); + ted::insert( + ted::Position::first_child_of(scope_syntax), + make::tokens::blank_line(), + ); + ted::insert(ted::Position::first_child_of(scope_syntax), use_item.syntax()); + } } } } diff --git a/crates/ide-db/src/imports/insert_use/tests.rs b/crates/ide-db/src/imports/insert_use/tests.rs index 70a7a1523212c..59673af3204e6 100644 --- a/crates/ide-db/src/imports/insert_use/tests.rs +++ b/crates/ide-db/src/imports/insert_use/tests.rs @@ -441,6 +441,19 @@ fn inserts_after_single_line_inner_comments() { use foo::bar::Baz;"#, ); + check_none( + "foo::bar::Baz", + r"mod foo { + //! Single line inner comments do not allow any code before them. +$0 +}", + r"mod foo { + //! Single line inner comments do not allow any code before them. + + use foo::bar::Baz; + +}", + ); } #[test]