Skip to content

Commit

Permalink
Auto merge of rust-lang#12765 - Veykril:import-insert-fix, r=Veykril
Browse files Browse the repository at this point in the history
fix: Fix imports being inserted before doc comments in inline modules

Fixes rust-lang/rust-analyzer#12758
  • Loading branch information
bors committed Jul 14, 2022
2 parents 073b325 + 6b823b0 commit 029184d
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 24 deletions.
48 changes: 24 additions & 24 deletions crates/ide-db/src/imports/insert_use.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand All @@ -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());
}
}
}
}
Expand Down
13 changes: 13 additions & 0 deletions crates/ide-db/src/imports/insert_use/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down

0 comments on commit 029184d

Please sign in to comment.