Auto merge of #12765 - Veykril:import-insert-fix, r=Veykril

fix: Fix imports being inserted before doc comments in inline modules

Fixes https://github.com/rust-lang/rust-analyzer/issues/12758
This commit is contained in:
bors 2022-07-14 20:57:22 +00:00
commit 029184d977
2 changed files with 37 additions and 24 deletions

View File

@ -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 // there are no imports in this file at all
// so put the import after all inner module attributes and possible license header comments // so put the import after all inner module attributes and possible license header comments
if let Some(last_inner_element) = scope_syntax if let Some(last_inner_element) = scope_syntax
.children_with_tokens() .children_with_tokens()
// skip the curly brace
.skip(l_curly.is_some() as usize)
.take_while(|child| match child { .take_while(|child| match child {
NodeOrToken::Node(node) => is_inner_attribute(node.clone()), NodeOrToken::Node(node) => is_inner_attribute(node.clone()),
NodeOrToken::Token(token) => { NodeOrToken::Token(token) => {
@ -413,30 +422,21 @@ fn insert_use_(
cov_mark::hit!(insert_empty_inner_attr); 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), use_item.syntax());
ted::insert(ted::Position::after(last_inner_element), make::tokens::single_newline()); ted::insert(ted::Position::after(last_inner_element), make::tokens::single_newline());
return; } else {
} match l_curly {
let l_curly = match scope { Some(b) => {
ImportScope::File(_) => { cov_mark::hit!(insert_empty_module);
cov_mark::hit!(insert_empty_file); ted::insert(ted::Position::after(&b), make::tokens::single_newline());
ted::insert(ted::Position::first_child_of(scope_syntax), make::tokens::blank_line()); ted::insert(ted::Position::after(&b), use_item.syntax());
ted::insert(ted::Position::first_child_of(scope_syntax), use_item.syntax()); }
return; None => {
} cov_mark::hit!(insert_empty_file);
// don't insert the imports before the item list/block expr's opening curly brace ted::insert(
ImportScope::Module(item_list) => item_list.l_curly_token(), ted::Position::first_child_of(scope_syntax),
// don't insert the imports before the item list's opening curly brace make::tokens::blank_line(),
ImportScope::Block(block) => block.l_curly_token(), );
}; ted::insert(ted::Position::first_child_of(scope_syntax), use_item.syntax());
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());
} }
} }
} }

View File

@ -441,6 +441,19 @@ fn inserts_after_single_line_inner_comments() {
use foo::bar::Baz;"#, 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] #[test]