return;
}
- if expects_item || ctx.expects_non_trait_assoc_item() || ctx.expect_record_field() {
+ if !ctx.has_visibility_prev_sibling()
+ && (expects_item || ctx.expects_non_trait_assoc_item() || ctx.expect_record_field())
+ {
add_keyword("pub(crate)", "pub(crate) ");
add_keyword("pub", "pub ");
}
)
}
+ pub(crate) fn has_visibility_prev_sibling(&self) -> bool {
+ matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility))
+ }
+
pub(crate) fn after_if(&self) -> bool {
matches!(self.prev_sibling, Some(ImmediatePrevSibling::IfExpr))
}
IfExpr,
TraitDefName,
ImplDefType,
+ Visibility,
}
/// Direct parent "thing" of what we are currently completing.
_ => node,
};
let prev_sibling = non_trivia_sibling(node.into(), Direction::Prev)?.into_node()?;
+ if prev_sibling.kind() == ERROR {
+ let prev_sibling = prev_sibling.first_child()?;
+ let res = match_ast! {
+ match prev_sibling {
+ // vis followed by random ident will always error the parser
+ ast::Visibility(_it) => ImmediatePrevSibling::Visibility,
+ _ => return None,
+ }
+ };
+ return Some(res);
+ }
let res = match_ast! {
match prev_sibling {
ast::ExprStmt(it) => {
check_prev_sibling(r"fn foo() { if true {} w$0", ImmediatePrevSibling::IfExpr);
check_prev_sibling(r"fn foo() { if true {}; w$0", None);
}
+
+ #[test]
+ fn test_vis_prev_sibling() {
+ check_prev_sibling(r"pub w$0", ImmediatePrevSibling::Visibility);
+ }
}