Unnamed repository; edit this file 'description' to name the repository.
Merge #11311
11311: fix: insert auto-imports after header comments r=repnop a=repnop
Fixes #8607.
This commit changes the auto-import functionality and causes it to add imports after any leading comments, which are commonly license headers. This does not affect comments on items as they're considered part of the item itself and not separate.
Co-authored-by: Wesley Norris <[email protected]>
| -rw-r--r-- | crates/ide_db/src/helpers/insert_use.rs | 7 | ||||
| -rw-r--r-- | crates/ide_db/src/helpers/insert_use/tests.rs | 56 |
2 files changed, 59 insertions, 4 deletions
diff --git a/crates/ide_db/src/helpers/insert_use.rs b/crates/ide_db/src/helpers/insert_use.rs index 1f3e3c55bf..d6f8cd0f4b 100644 --- a/crates/ide_db/src/helpers/insert_use.rs +++ b/crates/ide_db/src/helpers/insert_use.rs @@ -401,7 +401,7 @@ fn insert_use_( .children_with_tokens() .filter(|child| match child { NodeOrToken::Node(node) => is_inner_attribute(node.clone()), - NodeOrToken::Token(token) => is_inner_comment(token.clone()), + NodeOrToken::Token(token) => is_comment(token.clone()), }) .last() { @@ -440,7 +440,6 @@ fn is_inner_attribute(node: SyntaxNode) -> bool { ast::Attr::cast(node).map(|attr| attr.kind()) == Some(ast::AttrKind::Inner) } -fn is_inner_comment(token: SyntaxToken) -> bool { - ast::Comment::cast(token).and_then(|comment| comment.kind().doc) - == Some(ast::CommentPlacement::Inner) +fn is_comment(token: SyntaxToken) -> bool { + ast::Comment::cast(token).is_some() } diff --git a/crates/ide_db/src/helpers/insert_use/tests.rs b/crates/ide_db/src/helpers/insert_use/tests.rs index a5763eb41c..4219358a07 100644 --- a/crates/ide_db/src/helpers/insert_use/tests.rs +++ b/crates/ide_db/src/helpers/insert_use/tests.rs @@ -391,6 +391,62 @@ use foo::bar::Baz;"#, } #[test] +fn inserts_after_single_line_comments() { + check_none( + "foo::bar::Baz", + "// Represents a possible license header and/or general module comments", + r#"// Represents a possible license header and/or general module comments + +use foo::bar::Baz;"#, + ); +} + +#[test] +fn inserts_after_multiple_single_line_comments() { + check_none( + "foo::bar::Baz", + "// Represents a possible license header and/or general module comments +// Second single-line comment +// Third single-line comment", + r#"// Represents a possible license header and/or general module comments +// Second single-line comment +// Third single-line comment + +use foo::bar::Baz;"#, + ); +} + +#[test] +fn inserts_before_single_line_item_comments() { + check_none( + "foo::bar::Baz", + r#"// Represents a comment about a function +fn foo() {}"#, + r#"use foo::bar::Baz; + +// Represents a comment about a function +fn foo() {}"#, + ); +} + +#[test] +fn inserts_after_single_line_header_comments_and_before_item() { + check_none( + "foo::bar::Baz", + r#"// Represents a possible license header +// Line two of possible license header + +fn foo() {}"#, + r#"// Represents a possible license header +// Line two of possible license header + +use foo::bar::Baz; + +fn foo() {}"#, + ); +} + +#[test] fn inserts_after_multiline_inner_comments() { check_none( "foo::bar::Baz", |