delegation: Implement glob delegation
This commit is contained in:
parent
7ac6c2fc68
commit
22d0b1ee18
31 changed files with 892 additions and 135 deletions
|
@ -9,6 +9,12 @@ use rustc_ast::ptr::P;
|
|||
use rustc_ast::ModKind;
|
||||
use rustc_span::symbol::Ident;
|
||||
|
||||
enum DelegationKind<'a> {
|
||||
Single,
|
||||
List(&'a [(Ident, Option<Ident>)]),
|
||||
Glob,
|
||||
}
|
||||
|
||||
fn visibility_qualified(vis: &ast::Visibility, s: &str) -> String {
|
||||
format!("{}{}", State::to_string(|s| s.print_visibility(vis)), s)
|
||||
}
|
||||
|
@ -387,7 +393,7 @@ impl<'a> State<'a> {
|
|||
&item.vis,
|
||||
&deleg.qself,
|
||||
&deleg.path,
|
||||
None,
|
||||
DelegationKind::Single,
|
||||
&deleg.body,
|
||||
),
|
||||
ast::ItemKind::DelegationMac(deleg) => self.print_delegation(
|
||||
|
@ -395,7 +401,7 @@ impl<'a> State<'a> {
|
|||
&item.vis,
|
||||
&deleg.qself,
|
||||
&deleg.prefix,
|
||||
Some(&deleg.suffixes),
|
||||
deleg.suffixes.as_ref().map_or(DelegationKind::Glob, |s| DelegationKind::List(s)),
|
||||
&deleg.body,
|
||||
),
|
||||
}
|
||||
|
@ -579,7 +585,7 @@ impl<'a> State<'a> {
|
|||
vis,
|
||||
&deleg.qself,
|
||||
&deleg.path,
|
||||
None,
|
||||
DelegationKind::Single,
|
||||
&deleg.body,
|
||||
),
|
||||
ast::AssocItemKind::DelegationMac(deleg) => self.print_delegation(
|
||||
|
@ -587,20 +593,20 @@ impl<'a> State<'a> {
|
|||
vis,
|
||||
&deleg.qself,
|
||||
&deleg.prefix,
|
||||
Some(&deleg.suffixes),
|
||||
deleg.suffixes.as_ref().map_or(DelegationKind::Glob, |s| DelegationKind::List(s)),
|
||||
&deleg.body,
|
||||
),
|
||||
}
|
||||
self.ann.post(self, AnnNode::SubItem(id))
|
||||
}
|
||||
|
||||
pub(crate) fn print_delegation(
|
||||
fn print_delegation(
|
||||
&mut self,
|
||||
attrs: &[ast::Attribute],
|
||||
vis: &ast::Visibility,
|
||||
qself: &Option<P<ast::QSelf>>,
|
||||
path: &ast::Path,
|
||||
suffixes: Option<&[(Ident, Option<Ident>)]>,
|
||||
kind: DelegationKind<'_>,
|
||||
body: &Option<P<ast::Block>>,
|
||||
) {
|
||||
if body.is_some() {
|
||||
|
@ -614,21 +620,28 @@ impl<'a> State<'a> {
|
|||
} else {
|
||||
self.print_path(path, false, 0);
|
||||
}
|
||||
if let Some(suffixes) = suffixes {
|
||||
self.word("::");
|
||||
self.word("{");
|
||||
for (i, (ident, rename)) in suffixes.iter().enumerate() {
|
||||
self.print_ident(*ident);
|
||||
if let Some(rename) = rename {
|
||||
self.nbsp();
|
||||
self.word_nbsp("as");
|
||||
self.print_ident(*rename);
|
||||
}
|
||||
if i != suffixes.len() - 1 {
|
||||
self.word_space(",");
|
||||
match kind {
|
||||
DelegationKind::Single => {}
|
||||
DelegationKind::List(suffixes) => {
|
||||
self.word("::");
|
||||
self.word("{");
|
||||
for (i, (ident, rename)) in suffixes.iter().enumerate() {
|
||||
self.print_ident(*ident);
|
||||
if let Some(rename) = rename {
|
||||
self.nbsp();
|
||||
self.word_nbsp("as");
|
||||
self.print_ident(*rename);
|
||||
}
|
||||
if i != suffixes.len() - 1 {
|
||||
self.word_space(",");
|
||||
}
|
||||
}
|
||||
self.word("}");
|
||||
}
|
||||
DelegationKind::Glob => {
|
||||
self.word("::");
|
||||
self.word("*");
|
||||
}
|
||||
self.word("}");
|
||||
}
|
||||
if let Some(body) = body {
|
||||
self.nbsp();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue