Skip to content

Commit 8454413

Browse files
committed
Auto merge of #12811 - TopGunSnake:12790, r=Veykril
fix: Insert `pub(crate)` after doc comments and attribute macros Fixes #12790 Original behavior was to insert `pub(crate)` at the `first_child_or_token`, which for an item with a comment or attribute macro, would put the visibility marker before the comment or macro, instead of after. This merge request alters the call to find the node with appropriate `SyntaxKind` in the `children_or_tokens`. It also adds a test case to the module to verify the behavior. Test case verifies function, module, records, enum, impl, trait, and type cases.
2 parents c001b9c + 6df414f commit 8454413

File tree

1 file changed

+188
-2
lines changed

1 file changed

+188
-2
lines changed

crates/ide-assists/src/handlers/extract_module.rs

+188-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use syntax::{
1919
make, HasName, HasVisibility,
2020
},
2121
match_ast, ted, AstNode, SourceFile,
22-
SyntaxKind::WHITESPACE,
22+
SyntaxKind::{self, WHITESPACE},
2323
SyntaxNode, TextRange,
2424
};
2525

@@ -380,7 +380,16 @@ impl Module {
380380
}
381381

382382
for (vis, syntax) in replacements {
383-
add_change_vis(vis, syntax.first_child_or_token());
383+
let item = syntax.children_with_tokens().find(|node_or_token| {
384+
match node_or_token.kind() {
385+
// We're skipping comments, doc comments, and attribute macros that may precede the keyword
386+
// that the visibility should be placed before.
387+
SyntaxKind::COMMENT | SyntaxKind::ATTR | SyntaxKind::WHITESPACE => false,
388+
_ => true,
389+
}
390+
});
391+
392+
add_change_vis(vis, item);
384393
}
385394
}
386395

@@ -1581,4 +1590,181 @@ mod modname {
15811590
",
15821591
)
15831592
}
1593+
1594+
#[test]
1595+
fn test_issue_12790() {
1596+
check_assist(
1597+
extract_module,
1598+
r"
1599+
$0/// A documented function
1600+
fn documented_fn() {}
1601+
1602+
// A commented function with a #[] attribute macro
1603+
#[cfg(test)]
1604+
fn attribute_fn() {}
1605+
1606+
// A normally commented function
1607+
fn normal_fn() {}
1608+
1609+
/// A documented Struct
1610+
struct DocumentedStruct {
1611+
// Normal field
1612+
x: i32,
1613+
1614+
/// Documented field
1615+
y: i32,
1616+
1617+
// Macroed field
1618+
#[cfg(test)]
1619+
z: i32,
1620+
}
1621+
1622+
// A macroed Struct
1623+
#[cfg(test)]
1624+
struct MacroedStruct {
1625+
// Normal field
1626+
x: i32,
1627+
1628+
/// Documented field
1629+
y: i32,
1630+
1631+
// Macroed field
1632+
#[cfg(test)]
1633+
z: i32,
1634+
}
1635+
1636+
// A normal Struct
1637+
struct NormalStruct {
1638+
// Normal field
1639+
x: i32,
1640+
1641+
/// Documented field
1642+
y: i32,
1643+
1644+
// Macroed field
1645+
#[cfg(test)]
1646+
z: i32,
1647+
}
1648+
1649+
/// A documented type
1650+
type DocumentedType = i32;
1651+
1652+
// A macroed type
1653+
#[cfg(test)]
1654+
type MacroedType = i32;
1655+
1656+
/// A module to move
1657+
mod module {}
1658+
1659+
/// An impl to move
1660+
impl NormalStruct {
1661+
/// A method
1662+
fn new() {}
1663+
}
1664+
1665+
/// A documented trait
1666+
trait DocTrait {
1667+
/// Inner function
1668+
fn doc() {}
1669+
}
1670+
1671+
/// An enum
1672+
enum DocumentedEnum {
1673+
/// A variant
1674+
A,
1675+
/// Another variant
1676+
B { x: i32, y: i32 }
1677+
}
1678+
1679+
/// Documented const
1680+
const MY_CONST: i32 = 0;$0
1681+
",
1682+
r"
1683+
mod modname {
1684+
/// A documented function
1685+
pub(crate) fn documented_fn() {}
1686+
1687+
// A commented function with a #[] attribute macro
1688+
#[cfg(test)]
1689+
pub(crate) fn attribute_fn() {}
1690+
1691+
// A normally commented function
1692+
pub(crate) fn normal_fn() {}
1693+
1694+
/// A documented Struct
1695+
pub(crate) struct DocumentedStruct {
1696+
// Normal field
1697+
pub(crate) x: i32,
1698+
1699+
/// Documented field
1700+
pub(crate) y: i32,
1701+
1702+
// Macroed field
1703+
#[cfg(test)]
1704+
pub(crate) z: i32,
1705+
}
1706+
1707+
// A macroed Struct
1708+
#[cfg(test)]
1709+
pub(crate) struct MacroedStruct {
1710+
// Normal field
1711+
pub(crate) x: i32,
1712+
1713+
/// Documented field
1714+
pub(crate) y: i32,
1715+
1716+
// Macroed field
1717+
#[cfg(test)]
1718+
pub(crate) z: i32,
1719+
}
1720+
1721+
// A normal Struct
1722+
pub(crate) struct NormalStruct {
1723+
// Normal field
1724+
pub(crate) x: i32,
1725+
1726+
/// Documented field
1727+
pub(crate) y: i32,
1728+
1729+
// Macroed field
1730+
#[cfg(test)]
1731+
pub(crate) z: i32,
1732+
}
1733+
1734+
/// A documented type
1735+
pub(crate) type DocumentedType = i32;
1736+
1737+
// A macroed type
1738+
#[cfg(test)]
1739+
pub(crate) type MacroedType = i32;
1740+
1741+
/// A module to move
1742+
pub(crate) mod module {}
1743+
1744+
/// An impl to move
1745+
impl NormalStruct {
1746+
/// A method
1747+
pub(crate) fn new() {}
1748+
}
1749+
1750+
/// A documented trait
1751+
pub(crate) trait DocTrait {
1752+
/// Inner function
1753+
fn doc() {}
1754+
}
1755+
1756+
/// An enum
1757+
pub(crate) enum DocumentedEnum {
1758+
/// A variant
1759+
A,
1760+
/// Another variant
1761+
B { x: i32, y: i32 }
1762+
}
1763+
1764+
/// Documented const
1765+
pub(crate) const MY_CONST: i32 = 0;
1766+
}
1767+
",
1768+
)
1769+
}
15841770
}

0 commit comments

Comments
 (0)