Do not add imports before inner attributes

This commit is contained in:
Kirill Bulatov 2020-02-12 16:21:55 +02:00
parent 759100fb0d
commit 1596b31698
2 changed files with 38 additions and 1 deletions

View file

@ -431,7 +431,13 @@ fn best_action_for_target(
.find(|n| n.text_range().start() < anchor.text_range().start())
.or_else(|| Some(anchor));
ImportAction::add_new_use(anchor, false)
let add_after_anchor = anchor
.clone()
.and_then(ast::Attr::cast)
.as_ref()
.map(ast::Attr::is_inner_attribute)
.unwrap_or(false);
ImportAction::add_new_use(anchor, add_after_anchor)
}
}
}
@ -958,6 +964,28 @@ mod foo {
Debug<|>
}
}
",
);
}
#[test]
fn inserts_imports_after_inner_attributes() {
check_assist(
replace_qualified_name_with_use,
"
#![allow(dead_code)]
fn main() {
std::fmt::Debug<|>
}
",
"
#![allow(dead_code)]
use std::fmt::Debug;
fn main() {
Debug<|>
}
",
);

View file

@ -71,6 +71,15 @@ impl ast::Attr {
_ => None,
}
}
pub fn is_inner_attribute(&self) -> bool {
let first_token = self.syntax().first_token();
let first_token_kind = first_token.as_ref().map(SyntaxToken::kind);
let second_token_kind =
first_token.and_then(|token| token.next_token()).as_ref().map(SyntaxToken::kind);
return first_token_kind == Some(SyntaxKind::POUND)
&& second_token_kind == Some(SyntaxKind::EXCL);
}
}
#[derive(Debug, Clone, PartialEq, Eq)]