diff options
author | Lukas Tobias Wirth <[email protected]> | 2021-05-20 09:25:04 +0100 |
---|---|---|
committer | Lukas Tobias Wirth <[email protected]> | 2021-05-20 09:25:04 +0100 |
commit | 2bf720900f94e36969af44ff8ac52470faf9af4b (patch) | |
tree | c31115d2c813e1f4a0e3bff9fff09d90b471edde | |
parent | b4fe479236f592fcbfa1422dda54253b77d8b0e1 (diff) |
Check for differing attributes in granularity guessing
-rw-r--r-- | crates/ide_db/src/helpers/insert_use.rs | 14 | ||||
-rw-r--r-- | crates/ide_db/src/helpers/insert_use/tests.rs | 12 | ||||
-rw-r--r-- | crates/ide_db/src/helpers/merge_imports.rs | 2 |
3 files changed, 21 insertions, 7 deletions
diff --git a/crates/ide_db/src/helpers/insert_use.rs b/crates/ide_db/src/helpers/insert_use.rs index e7ae69302..aa61c5bcb 100644 --- a/crates/ide_db/src/helpers/insert_use.rs +++ b/crates/ide_db/src/helpers/insert_use.rs | |||
@@ -4,13 +4,13 @@ use std::cmp::Ordering; | |||
4 | use hir::Semantics; | 4 | use hir::Semantics; |
5 | use syntax::{ | 5 | use syntax::{ |
6 | algo, | 6 | algo, |
7 | ast::{self, make, AstNode, ModuleItemOwner, PathSegmentKind, VisibilityOwner}, | 7 | ast::{self, make, AstNode, AttrsOwner, ModuleItemOwner, PathSegmentKind, VisibilityOwner}, |
8 | ted, AstToken, Direction, NodeOrToken, SyntaxNode, SyntaxToken, | 8 | ted, AstToken, Direction, NodeOrToken, SyntaxNode, SyntaxToken, |
9 | }; | 9 | }; |
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | helpers::merge_imports::{ | 12 | helpers::merge_imports::{ |
13 | common_prefix, eq_visibility, try_merge_imports, use_tree_path_cmp, MergeBehavior, | 13 | common_prefix, eq_attrs, eq_visibility, try_merge_imports, use_tree_path_cmp, MergeBehavior, |
14 | }, | 14 | }, |
15 | RootDatabase, | 15 | RootDatabase, |
16 | }; | 16 | }; |
@@ -88,7 +88,7 @@ impl ImportScope { | |||
88 | let use_stmt = |item| match item { | 88 | let use_stmt = |item| match item { |
89 | ast::Item::Use(use_) => { | 89 | ast::Item::Use(use_) => { |
90 | let use_tree = use_.use_tree()?; | 90 | let use_tree = use_.use_tree()?; |
91 | Some((use_tree, use_.visibility())) | 91 | Some((use_tree, use_.visibility(), use_.attrs())) |
92 | } | 92 | } |
93 | _ => None, | 93 | _ => None, |
94 | }; | 94 | }; |
@@ -98,7 +98,7 @@ impl ImportScope { | |||
98 | } | 98 | } |
99 | .filter_map(use_stmt); | 99 | .filter_map(use_stmt); |
100 | let mut res = ImportGranularityGuess::Unknown; | 100 | let mut res = ImportGranularityGuess::Unknown; |
101 | let (mut prev, mut prev_vis) = match use_stmts.next() { | 101 | let (mut prev, mut prev_vis, mut prev_attrs) = match use_stmts.next() { |
102 | Some(it) => it, | 102 | Some(it) => it, |
103 | None => return res, | 103 | None => return res, |
104 | }; | 104 | }; |
@@ -113,11 +113,12 @@ impl ImportScope { | |||
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
116 | let (curr, curr_vis) = match use_stmts.next() { | 116 | let (curr, curr_vis, curr_attrs) = match use_stmts.next() { |
117 | Some(it) => it, | 117 | Some(it) => it, |
118 | None => break res, | 118 | None => break res, |
119 | }; | 119 | }; |
120 | if eq_visibility(prev_vis, curr_vis.clone()) { | 120 | if eq_visibility(prev_vis, curr_vis.clone()) && eq_attrs(prev_attrs, curr_attrs.clone()) |
121 | { | ||
121 | if let Some((prev_path, curr_path)) = prev.path().zip(curr.path()) { | 122 | if let Some((prev_path, curr_path)) = prev.path().zip(curr.path()) { |
122 | if let Some(_) = common_prefix(&prev_path, &curr_path) { | 123 | if let Some(_) = common_prefix(&prev_path, &curr_path) { |
123 | if prev.use_tree_list().is_none() && curr.use_tree_list().is_none() { | 124 | if prev.use_tree_list().is_none() && curr.use_tree_list().is_none() { |
@@ -133,6 +134,7 @@ impl ImportScope { | |||
133 | } | 134 | } |
134 | prev = curr; | 135 | prev = curr; |
135 | prev_vis = curr_vis; | 136 | prev_vis = curr_vis; |
137 | prev_attrs = curr_attrs; | ||
136 | } | 138 | } |
137 | } | 139 | } |
138 | } | 140 | } |
diff --git a/crates/ide_db/src/helpers/insert_use/tests.rs b/crates/ide_db/src/helpers/insert_use/tests.rs index f795bbf00..78a2a87b3 100644 --- a/crates/ide_db/src/helpers/insert_use/tests.rs +++ b/crates/ide_db/src/helpers/insert_use/tests.rs | |||
@@ -718,6 +718,18 @@ pub use foo::bar::qux; | |||
718 | } | 718 | } |
719 | 719 | ||
720 | #[test] | 720 | #[test] |
721 | fn guess_skips_differing_attrs() { | ||
722 | check_guess( | ||
723 | r" | ||
724 | pub use foo::bar::baz; | ||
725 | #[doc(hidden)] | ||
726 | pub use foo::bar::qux; | ||
727 | ", | ||
728 | ImportGranularityGuess::Unknown, | ||
729 | ); | ||
730 | } | ||
731 | |||
732 | #[test] | ||
721 | fn guess_grouping_matters() { | 733 | fn guess_grouping_matters() { |
722 | check_guess( | 734 | check_guess( |
723 | r" | 735 | r" |
diff --git a/crates/ide_db/src/helpers/merge_imports.rs b/crates/ide_db/src/helpers/merge_imports.rs index 546f2d0c4..697e8bcff 100644 --- a/crates/ide_db/src/helpers/merge_imports.rs +++ b/crates/ide_db/src/helpers/merge_imports.rs | |||
@@ -299,7 +299,7 @@ pub fn eq_visibility(vis0: Option<ast::Visibility>, vis1: Option<ast::Visibility | |||
299 | } | 299 | } |
300 | } | 300 | } |
301 | 301 | ||
302 | fn eq_attrs( | 302 | pub fn eq_attrs( |
303 | attrs0: impl Iterator<Item = ast::Attr>, | 303 | attrs0: impl Iterator<Item = ast::Attr>, |
304 | attrs1: impl Iterator<Item = ast::Attr>, | 304 | attrs1: impl Iterator<Item = ast::Attr>, |
305 | ) -> bool { | 305 | ) -> bool { |