delegation: Support renaming
This commit is contained in:
parent
c2f2db79ca
commit
99b635eafa
@ -3112,6 +3112,7 @@ pub struct Delegation {
|
|||||||
/// Path resolution id.
|
/// Path resolution id.
|
||||||
pub id: NodeId,
|
pub id: NodeId,
|
||||||
pub qself: Option<P<QSelf>>,
|
pub qself: Option<P<QSelf>>,
|
||||||
|
pub rename: Option<Ident>,
|
||||||
pub path: Path,
|
pub path: Path,
|
||||||
pub body: Option<P<Block>>,
|
pub body: Option<P<Block>>,
|
||||||
}
|
}
|
||||||
|
@ -1149,10 +1149,13 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
|
|||||||
}
|
}
|
||||||
ItemKind::MacCall(m) => vis.visit_mac_call(m),
|
ItemKind::MacCall(m) => vis.visit_mac_call(m),
|
||||||
ItemKind::MacroDef(def) => vis.visit_macro_def(def),
|
ItemKind::MacroDef(def) => vis.visit_macro_def(def),
|
||||||
ItemKind::Delegation(box Delegation { id, qself, path, body }) => {
|
ItemKind::Delegation(box Delegation { id, qself, path, rename, body }) => {
|
||||||
vis.visit_id(id);
|
vis.visit_id(id);
|
||||||
vis.visit_qself(qself);
|
vis.visit_qself(qself);
|
||||||
vis.visit_path(path);
|
vis.visit_path(path);
|
||||||
|
if let Some(rename) = rename {
|
||||||
|
vis.visit_ident(rename);
|
||||||
|
}
|
||||||
if let Some(body) = body {
|
if let Some(body) = body {
|
||||||
vis.visit_block(body);
|
vis.visit_block(body);
|
||||||
}
|
}
|
||||||
@ -1195,10 +1198,13 @@ pub fn noop_flat_map_assoc_item<T: MutVisitor>(
|
|||||||
visit_opt(ty, |ty| visitor.visit_ty(ty));
|
visit_opt(ty, |ty| visitor.visit_ty(ty));
|
||||||
}
|
}
|
||||||
AssocItemKind::MacCall(mac) => visitor.visit_mac_call(mac),
|
AssocItemKind::MacCall(mac) => visitor.visit_mac_call(mac),
|
||||||
AssocItemKind::Delegation(box Delegation { id, qself, path, body }) => {
|
AssocItemKind::Delegation(box Delegation { id, qself, path, rename, body }) => {
|
||||||
visitor.visit_id(id);
|
visitor.visit_id(id);
|
||||||
visitor.visit_qself(qself);
|
visitor.visit_qself(qself);
|
||||||
visitor.visit_path(path);
|
visitor.visit_path(path);
|
||||||
|
if let Some(rename) = rename {
|
||||||
|
visitor.visit_ident(rename);
|
||||||
|
}
|
||||||
if let Some(body) = body {
|
if let Some(body) = body {
|
||||||
visitor.visit_block(body);
|
visitor.visit_block(body);
|
||||||
}
|
}
|
||||||
|
@ -382,11 +382,12 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) -> V::Resu
|
|||||||
}
|
}
|
||||||
ItemKind::MacCall(mac) => try_visit!(visitor.visit_mac_call(mac)),
|
ItemKind::MacCall(mac) => try_visit!(visitor.visit_mac_call(mac)),
|
||||||
ItemKind::MacroDef(ts) => try_visit!(visitor.visit_mac_def(ts, item.id)),
|
ItemKind::MacroDef(ts) => try_visit!(visitor.visit_mac_def(ts, item.id)),
|
||||||
ItemKind::Delegation(box Delegation { id, qself, path, body }) => {
|
ItemKind::Delegation(box Delegation { id, qself, path, rename, body }) => {
|
||||||
if let Some(qself) = qself {
|
if let Some(qself) = qself {
|
||||||
try_visit!(visitor.visit_ty(&qself.ty));
|
try_visit!(visitor.visit_ty(&qself.ty));
|
||||||
}
|
}
|
||||||
try_visit!(visitor.visit_path(path, *id));
|
try_visit!(visitor.visit_path(path, *id));
|
||||||
|
visit_opt!(visitor, visit_ident, *rename);
|
||||||
visit_opt!(visitor, visit_block, body);
|
visit_opt!(visitor, visit_block, body);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -782,11 +783,12 @@ pub fn walk_assoc_item<'a, V: Visitor<'a>>(
|
|||||||
AssocItemKind::MacCall(mac) => {
|
AssocItemKind::MacCall(mac) => {
|
||||||
try_visit!(visitor.visit_mac_call(mac));
|
try_visit!(visitor.visit_mac_call(mac));
|
||||||
}
|
}
|
||||||
AssocItemKind::Delegation(box Delegation { id, qself, path, body }) => {
|
AssocItemKind::Delegation(box Delegation { id, qself, path, rename, body }) => {
|
||||||
if let Some(qself) = qself {
|
if let Some(qself) = qself {
|
||||||
try_visit!(visitor.visit_ty(&qself.ty));
|
try_visit!(visitor.visit_ty(&qself.ty));
|
||||||
}
|
}
|
||||||
try_visit!(visitor.visit_path(path, *id));
|
try_visit!(visitor.visit_path(path, *id));
|
||||||
|
visit_opt!(visitor, visit_ident, *rename);
|
||||||
visit_opt!(visitor, visit_block, body);
|
visit_opt!(visitor, visit_block, body);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -686,6 +686,8 @@ impl<'a> Parser<'a> {
|
|||||||
(None, self.parse_path(PathStyle::Expr)?)
|
(None, self.parse_path(PathStyle::Expr)?)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let rename = if self.eat_keyword(kw::As) { Some(self.parse_ident()?) } else { None };
|
||||||
|
|
||||||
let body = if self.check(&token::OpenDelim(Delimiter::Brace)) {
|
let body = if self.check(&token::OpenDelim(Delimiter::Brace)) {
|
||||||
Some(self.parse_block()?)
|
Some(self.parse_block()?)
|
||||||
} else {
|
} else {
|
||||||
@ -695,11 +697,9 @@ impl<'a> Parser<'a> {
|
|||||||
let span = span.to(self.prev_token.span);
|
let span = span.to(self.prev_token.span);
|
||||||
self.psess.gated_spans.gate(sym::fn_delegation, span);
|
self.psess.gated_spans.gate(sym::fn_delegation, span);
|
||||||
|
|
||||||
let ident = path.segments.last().map(|seg| seg.ident).unwrap_or(Ident::empty());
|
let ident = rename.unwrap_or_else(|| path.segments.last().unwrap().ident);
|
||||||
Ok((
|
let deleg = Delegation { id: DUMMY_NODE_ID, qself, path, rename, body };
|
||||||
ident,
|
Ok((ident, ItemKind::Delegation(Box::new(deleg))))
|
||||||
ItemKind::Delegation(Box::new(Delegation { id: DUMMY_NODE_ID, qself, path, body })),
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_item_list<T>(
|
fn parse_item_list<T>(
|
||||||
|
20
tests/ui/delegation/rename.rs
Normal file
20
tests/ui/delegation/rename.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#![feature(fn_delegation)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
mod to_reuse {
|
||||||
|
pub fn a() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
reuse to_reuse::a as b;
|
||||||
|
|
||||||
|
struct S;
|
||||||
|
impl S {
|
||||||
|
reuse to_reuse::a as b;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
b();
|
||||||
|
S::b();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user