diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2014-12-10 06:15:06 -0500 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2014-12-14 11:11:55 -0500 |
| commit | 22f777ba2ecfcd8d914d37db310a6feb4ad5219e (patch) | |
| tree | c8b867087fe35ee35e239f2aa31ff944d46ca4a5 /src/libsyntax | |
| parent | 5686a91914ac678ccb78220367daefe585a0d66a (diff) | |
| download | rust-22f777ba2ecfcd8d914d37db310a6feb4ad5219e.tar.gz rust-22f777ba2ecfcd8d914d37db310a6feb4ad5219e.zip | |
Parse `unsafe impl` but don't do anything particularly interesting with the results.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/ast_map/mod.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/config.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/generic/mod.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 22 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 3 |
9 files changed, 40 insertions, 16 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 1cc6b6feee8..206fb26eb55 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1617,7 +1617,8 @@ pub enum Item_ { // Currently, only Sized makes sense here. TyParamBounds, Vec<TraitItem>), - ItemImpl(Generics, + ItemImpl(Unsafety, + Generics, Option<TraitRef>, // (optional) trait this impl implements P<Ty>, // self Vec<ImplItem>), diff --git a/src/libsyntax/ast_map/mod.rs b/src/libsyntax/ast_map/mod.rs index a2cdc4d2fbc..6089f39e828 100644 --- a/src/libsyntax/ast_map/mod.rs +++ b/src/libsyntax/ast_map/mod.rs @@ -755,7 +755,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> { let parent = self.parent; self.parent = i.id; match i.node { - ItemImpl(_, _, _, ref impl_items) => { + ItemImpl(_, _, _, _, ref impl_items) => { for impl_item in impl_items.iter() { match *impl_item { MethodImplItem(ref m) => { diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs index ee651592117..d2185a00876 100644 --- a/src/libsyntax/config.rs +++ b/src/libsyntax/config.rs @@ -133,11 +133,11 @@ fn fold_item_underscore<F>(cx: &mut Context<F>, item: ast::Item_) -> ast::Item_ F: FnMut(&[ast::Attribute]) -> bool { let item = match item { - ast::ItemImpl(a, b, c, impl_items) => { + ast::ItemImpl(u, a, b, c, impl_items) => { let impl_items = impl_items.into_iter() .filter(|ii| impl_item_in_cfg(cx, ii)) .collect(); - ast::ItemImpl(a, b, c, impl_items) + ast::ItemImpl(u, a, b, c, impl_items) } ast::ItemTrait(u, a, b, c, methods) => { let methods = methods.into_iter() diff --git a/src/libsyntax/ext/deriving/generic/mod.rs b/src/libsyntax/ext/deriving/generic/mod.rs index 820ff08a255..f40be823a1a 100644 --- a/src/libsyntax/ext/deriving/generic/mod.rs +++ b/src/libsyntax/ext/deriving/generic/mod.rs @@ -462,7 +462,8 @@ impl<'a> TraitDef<'a> { self.span, ident, a, - ast::ItemImpl(trait_generics, + ast::ItemImpl(ast::Unsafety::Normal, + trait_generics, opt_trait_ref, self_type, methods.into_iter() diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 66fe672c3e5..9656629e14d 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -215,7 +215,7 @@ impl<'a, 'v> Visitor<'v> for Context<'a> { } } - ast::ItemImpl(_, _, _, ref items) => { + ast::ItemImpl(_, _, _, _, ref items) => { if attr::contains_name(i.attrs.as_slice(), "unsafe_destructor") { self.gate_feature("unsafe_destructor", diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index daed014f4eb..8a578c2cb05 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -1008,7 +1008,7 @@ pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ { let struct_def = folder.fold_struct_def(struct_def); ItemStruct(struct_def, folder.fold_generics(generics)) } - ItemImpl(generics, ifce, ty, impl_items) => { + ItemImpl(unsafety, generics, ifce, ty, impl_items) => { let mut new_impl_items = Vec::new(); for impl_item in impl_items.iter() { match *impl_item { @@ -1030,7 +1030,8 @@ pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ { Some(folder.fold_trait_ref((*trait_ref).clone())) } }; - ItemImpl(folder.fold_generics(generics), + ItemImpl(unsafety, + folder.fold_generics(generics), ifce, folder.fold_ty(ty), new_impl_items) @@ -1160,7 +1161,7 @@ pub fn noop_fold_item_simple<T: Folder>(Item {id, ident, attrs, node, vis, span} let node = folder.fold_item_underscore(node); let ident = match node { // The node may have changed, recompute the "pretty" impl name. - ItemImpl(_, ref maybe_trait, ref ty, _) => { + ItemImpl(_, _, ref maybe_trait, ref ty, _) => { ast_util::impl_pretty_name(maybe_trait, &**ty) } _ => ident diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index b2c30797cac..d1991c0463f 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4667,7 +4667,7 @@ impl<'a> Parser<'a> { /// Parses two variants (with the region/type params always optional): /// impl<T> Foo { ... } /// impl<T> ToString for ~[T] { ... } - fn parse_item_impl(&mut self) -> ItemInfo { + fn parse_item_impl(&mut self, unsafety: ast::Unsafety) -> ItemInfo { // First, parse type parameters if necessary. let mut generics = self.parse_generics(); @@ -4706,7 +4706,7 @@ impl<'a> Parser<'a> { let ident = ast_util::impl_pretty_name(&opt_trait, &*ty); (ident, - ItemImpl(generics, opt_trait, ty, impl_items), + ItemImpl(unsafety, generics, opt_trait, ty, impl_items), Some(attrs)) } @@ -5556,6 +5556,22 @@ impl<'a> Parser<'a> { maybe_append(attrs, extra_attrs)); return IoviItem(item); } + if self.token.is_keyword(keywords::Unsafe) && + self.look_ahead(1u, |t| t.is_keyword(keywords::Impl)) + { + // IMPL ITEM + self.expect_keyword(keywords::Unsafe); + self.expect_keyword(keywords::Impl); + let (ident, item_, extra_attrs) = self.parse_item_impl(ast::Unsafety::Unsafe); + let last_span = self.last_span; + let item = self.mk_item(lo, + last_span.hi, + ident, + item_, + visibility, + maybe_append(attrs, extra_attrs)); + return IoviItem(item); + } if self.token.is_keyword(keywords::Fn) && self.look_ahead(1, |f| !Parser::fn_expr_lookahead(f)) { // FUNCTION ITEM @@ -5644,7 +5660,7 @@ impl<'a> Parser<'a> { } if self.eat_keyword(keywords::Impl) { // IMPL ITEM - let (ident, item_, extra_attrs) = self.parse_item_impl(); + let (ident, item_, extra_attrs) = self.parse_item_impl(ast::Unsafety::Normal); let last_span = self.last_span; let item = self.mk_item(lo, last_span.hi, diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 037118b145f..db122f271a9 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -917,12 +917,16 @@ impl<'a> State<'a> { try!(self.print_struct(&**struct_def, generics, item.ident, item.span)); } - ast::ItemImpl(ref generics, + ast::ItemImpl(unsafety, + ref generics, ref opt_trait, ref ty, ref impl_items) => { - try!(self.head(visibility_qualified(item.vis, - "impl").as_slice())); + try!(self.head("")); + try!(self.print_visibility(item.vis)); + try!(self.print_unsafety(unsafety)); + try!(self.word_nbsp("impl")); + if generics.is_parameterized() { try!(self.print_generics(generics)); try!(space(&mut self.s)); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 7bb79a15f45..3535c6e267e 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -282,7 +282,8 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) { visitor.visit_generics(type_parameters); walk_enum_def(visitor, enum_definition, type_parameters) } - ItemImpl(ref type_parameters, + ItemImpl(_, + ref type_parameters, ref trait_reference, ref typ, ref impl_items) => { |
