From 9c6430b3257a96d587349d85aa7596d3f4704c28 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Fri, 17 Mar 2017 21:58:48 +0000 Subject: Refactor out `ast::MacroDef`. --- src/libsyntax/parse/parser.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c28f678cb51..3c9ad8ca9c0 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3781,7 +3781,9 @@ impl<'a> Parser<'a> { } let span = lo.to(self.prev_span); - let kind = ItemKind::MacroDef(tts); + let kind = ItemKind::MacroDef(ast::MacroDef { + tokens: tts, + }); Ok(Some(self.mk_item(span, id, kind, Visibility::Inherited, attrs.to_owned()))) } -- cgit 1.4.1-3-g733a5 From 2a1d2edb821e123586049f349bb4aaee2d001cc6 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Sat, 18 Mar 2017 01:55:51 +0000 Subject: Declarative macros 2.0 without hygiene. --- .../src/language-features/decl-macro.md | 10 ++++ src/librustc/hir/lowering.rs | 7 ++- src/librustc/hir/mod.rs | 1 + src/librustc/ich/impls_hir.rs | 1 + src/librustc_metadata/cstore_impl.rs | 1 + src/librustc_resolve/build_reduced_graph.rs | 4 +- src/librustc_resolve/lib.rs | 12 +++- src/librustc_resolve/macros.rs | 29 ++++++--- src/librustc_resolve/resolve_imports.rs | 2 +- src/libsyntax/ast.rs | 1 + src/libsyntax/ext/tt/macro_rules.rs | 15 ++--- src/libsyntax/feature_gate.rs | 10 +++- src/libsyntax/fold.rs | 1 + src/libsyntax/parse/parser.rs | 68 +++++++++++++++------- 14 files changed, 116 insertions(+), 46 deletions(-) create mode 100644 src/doc/unstable-book/src/language-features/decl-macro.md (limited to 'src/libsyntax/parse') diff --git a/src/doc/unstable-book/src/language-features/decl-macro.md b/src/doc/unstable-book/src/language-features/decl-macro.md new file mode 100644 index 00000000000..4700b252e2d --- /dev/null +++ b/src/doc/unstable-book/src/language-features/decl-macro.md @@ -0,0 +1,10 @@ +# `decl_macro` + +The tracking issue for this feature is: [#39412] + +[#39412]: https://github.com/rust-lang/rust/issues/39412 + +------------------------ + + + diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index 77bcde22ef7..5ec8dd0156a 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -1502,10 +1502,11 @@ impl<'a> LoweringContext<'a> { pub fn lower_item(&mut self, i: &Item) -> Option { let mut name = i.ident.name; let attrs = self.lower_attrs(&i.attrs); - if let ItemKind::MacroDef(ref tts) = i.node { - if i.attrs.iter().any(|attr| attr.path == "macro_export") { + if let ItemKind::MacroDef(ref def) = i.node { + if !def.legacy || i.attrs.iter().any(|attr| attr.path == "macro_export") { + let (body, legacy) = (def.stream(), def.legacy); self.exported_macros.push(hir::MacroDef { - name: name, attrs: attrs, id: i.id, span: i.span, body: tts.stream(), + name: name, attrs: attrs, id: i.id, span: i.span, body: body, legacy: legacy, }); } return None; diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index cb7f530b995..6c355608f13 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -536,6 +536,7 @@ pub struct MacroDef { pub id: NodeId, pub span: Span, pub body: TokenStream, + pub legacy: bool, } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs index abc51601b6e..f9758ceea1e 100644 --- a/src/librustc/ich/impls_hir.rs +++ b/src/librustc/ich/impls_hir.rs @@ -332,6 +332,7 @@ impl_stable_hash_for!(struct hir::MacroDef { attrs, id, span, + legacy, body }); diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 06472ed7fd1..4e16c97ca4d 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -388,6 +388,7 @@ impl CrateStore for cstore::CStore { attrs: attrs.iter().cloned().collect(), node: ast::ItemKind::MacroDef(ast::MacroDef { tokens: body.into(), + legacy: true, }), vis: ast::Visibility::Inherited, }) diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index 57639a1ecef..b7b75f8af73 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -77,7 +77,7 @@ struct LegacyMacroImports { impl<'a> Resolver<'a> { /// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined; /// otherwise, reports an error. - fn define(&mut self, parent: Module<'a>, ident: Ident, ns: Namespace, def: T) + pub fn define(&mut self, parent: Module<'a>, ident: Ident, ns: Namespace, def: T) where T: ToNameBinding<'a>, { let binding = def.to_name_binding(self.arenas); @@ -730,7 +730,7 @@ impl<'a, 'b> Visitor<'a> for BuildReducedGraphVisitor<'a, 'b> { fn visit_item(&mut self, item: &'a Item) { let macro_use = match item.node { ItemKind::MacroDef(..) => { - self.resolver.define_macro(item, &mut self.legacy_scope); + self.resolver.define_macro(item, self.expansion, &mut self.legacy_scope); return } ItemKind::Mac(..) => { diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 6ea666e21dc..500277e78e6 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1058,6 +1058,13 @@ impl<'a> NameBinding<'a> { _ => true, } } + + fn is_macro_def(&self) -> bool { + match self.kind { + NameBindingKind::Def(Def::Macro(..)) => true, + _ => false, + } + } } /// Interns the names of the primitive types. @@ -1377,8 +1384,9 @@ impl<'a> Resolver<'a> { vis: ty::Visibility::Public, }), - // `#![feature(proc_macro)]` implies `#[feature(extern_macros)]` - use_extern_macros: features.use_extern_macros || features.proc_macro, + // The `proc_macro` and `decl_macro` features imply `use_extern_macros` + use_extern_macros: + features.use_extern_macros || features.proc_macro || features.decl_macro, crate_loader: crate_loader, macro_names: FxHashSet(), diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 231d30cd2a2..bf21344330b 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -687,7 +687,10 @@ impl<'a> Resolver<'a> { }); } - pub fn define_macro(&mut self, item: &ast::Item, legacy_scope: &mut LegacyScope<'a>) { + pub fn define_macro(&mut self, + item: &ast::Item, + expansion: Mark, + legacy_scope: &mut LegacyScope<'a>) { self.local_macro_def_scopes.insert(item.id, self.current_module); let ident = item.ident; if ident.name == "macro_rules" { @@ -699,16 +702,24 @@ impl<'a> Resolver<'a> { &self.session.features, item)); self.macro_map.insert(def_id, ext); - *legacy_scope = LegacyScope::Binding(self.arenas.alloc_legacy_binding(LegacyBinding { - parent: Cell::new(*legacy_scope), name: ident.name, def_id: def_id, span: item.span, - })); - self.macro_names.insert(ident.name); - if attr::contains_name(&item.attrs, "macro_export") { - let def = Def::Macro(def_id, MacroKind::Bang); - self.macro_exports.push(Export { name: ident.name, def: def, span: item.span }); + let def = match item.node { ast::ItemKind::MacroDef(ref def) => def, _ => unreachable!() }; + if def.legacy { + self.macro_names.insert(ident.name); + *legacy_scope = LegacyScope::Binding(self.arenas.alloc_legacy_binding(LegacyBinding { + parent: Cell::new(*legacy_scope), name: ident.name, def_id: def_id, span: item.span, + })); + if attr::contains_name(&item.attrs, "macro_export") { + let def = Def::Macro(def_id, MacroKind::Bang); + self.macro_exports.push(Export { name: ident.name, def: def, span: item.span }); + } else { + self.unused_macros.insert(def_id); + } } else { - self.unused_macros.insert(def_id); + let module = self.current_module; + let def = Def::Macro(def_id, MacroKind::Bang); + let vis = self.resolve_visibility(&item.vis); + self.define(module, ident, MacroNS, (def, vis, item.span, expansion)); } } diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 1d4ba4ed100..fdca931ad47 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -803,7 +803,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { }; if binding.vis == ty::Visibility::Public && - (binding.is_import() || binding.is_extern_crate()) { + (binding.is_import() || binding.is_macro_def()) { let def = binding.def(); if def != Def::Err { if !def.def_id().is_local() { diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 6a30072c835..3dcb77a0497 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1022,6 +1022,7 @@ impl Mac_ { #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] pub struct MacroDef { pub tokens: ThinTokenStream, + pub legacy: bool, } impl MacroDef { diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 7ac3990def4..ad09d583734 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -162,6 +162,12 @@ pub fn compile(sess: &ParseSess, features: &RefCell, def: &ast::Item) let lhs_nm = ast::Ident::with_empty_ctxt(Symbol::gensym("lhs")); let rhs_nm = ast::Ident::with_empty_ctxt(Symbol::gensym("rhs")); + // Parse the macro_rules! invocation + let body = match def.node { + ast::ItemKind::MacroDef(ref body) => body, + _ => unreachable!(), + }; + // The pattern that macro_rules matches. // The grammar for macro_rules! is: // $( $lhs:tt => $rhs:tt );+ @@ -174,7 +180,7 @@ pub fn compile(sess: &ParseSess, features: &RefCell, def: &ast::Item) quoted::TokenTree::Token(DUMMY_SP, token::FatArrow), quoted::TokenTree::MetaVarDecl(DUMMY_SP, rhs_nm, ast::Ident::from_str("tt")), ], - separator: Some(token::Semi), + separator: Some(if body.legacy { token::Semi } else { token::Comma }), op: quoted::KleeneOp::OneOrMore, num_captures: 2, })), @@ -187,12 +193,7 @@ pub fn compile(sess: &ParseSess, features: &RefCell, def: &ast::Item) })), ]; - // Parse the macro_rules! invocation - let body = match def.node { - ast::ItemKind::MacroDef(ref body) => body.stream(), - _ => unreachable!(), - }; - let argument_map = match parse(sess, body, &argument_gram, None, true) { + let argument_map = match parse(sess, body.stream(), &argument_gram, None, true) { Success(m) => m, Failure(sp, tok) => { let s = parse_failure_msg(tok); diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index e1b7d4681ad..076639a31ea 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -309,9 +309,12 @@ declare_features! ( // The `unadjusted` ABI. Perma unstable. (active, abi_unadjusted, "1.16.0", None), - // Macros 1.1 + // Procedural macros 2.0. (active, proc_macro, "1.16.0", Some(38356)), + // Declarative macros 2.0 (`macro`). + (active, decl_macro, "1.17.0", Some(39412)), + // Allows attributes on struct literal fields. (active, struct_field_attributes, "1.16.0", Some(38814)), @@ -1229,6 +1232,11 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { } } + ast::ItemKind::MacroDef(ast::MacroDef { legacy: false, .. }) => { + let msg = "`macro` is experimental"; + gate_feature_post!(&self, decl_macro, i.span, msg); + } + _ => {} } diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 9aeb9ecca5a..1d1e46cf576 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -522,6 +522,7 @@ pub fn noop_fold_mac(Spanned {node, span}: Mac, fld: &mut T) -> Mac { pub fn noop_fold_macro_def(def: MacroDef, fld: &mut T) -> MacroDef { MacroDef { tokens: fld.fold_tts(def.tokens.into()).into(), + legacy: def.legacy, } } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 3c9ad8ca9c0..bc9be809ca4 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3758,33 +3758,59 @@ impl<'a> Parser<'a> { fn eat_macro_def(&mut self, attrs: &[Attribute], vis: &Visibility) -> PResult<'a, Option>> { let lo = self.span; - match self.token { - token::Ident(ident) if ident.name == "macro_rules" => { - if self.look_ahead(1, |t| *t == token::Not) { - let prev_span = self.prev_span; - self.complain_if_pub_macro(vis, prev_span); - self.bump(); - self.bump(); + let (ident, def) = match self.token { + token::Ident(ident) if ident.name == keywords::Macro.name() => { + self.bump(); + let ident = self.parse_ident()?; + let tokens = if self.check(&token::OpenDelim(token::Brace)) { + match self.parse_token_tree() { + TokenTree::Delimited(_, ref delimited) => delimited.stream(), + _ => unreachable!(), + } + } else if self.check(&token::OpenDelim(token::Paren)) { + let args = self.parse_token_tree(); + let body = if self.check(&token::OpenDelim(token::Brace)) { + self.parse_token_tree() + } else { + self.unexpected()?; + unreachable!() + }; + TokenStream::concat(vec![ + args.into(), + TokenTree::Token(lo.to(self.prev_span), token::FatArrow).into(), + body.into(), + ]) + } else { + self.unexpected()?; + unreachable!() + }; + + (ident, ast::MacroDef { tokens: tokens.into(), legacy: false }) + } + token::Ident(ident) if ident.name == "macro_rules" && + self.look_ahead(1, |t| *t == token::Not) => { + let prev_span = self.prev_span; + self.complain_if_pub_macro(vis, prev_span); + self.bump(); + self.bump(); + + let ident = self.parse_ident()?; + let (delim, tokens) = self.expect_delimited_token_tree()?; + if delim != token::Brace { + if !self.eat(&token::Semi) { + let msg = "macros that expand to items must either \ + be surrounded with braces or followed by a semicolon"; + self.span_err(self.prev_span, msg); + } } + + (ident, ast::MacroDef { tokens: tokens, legacy: true }) } _ => return Ok(None), }; - let id = self.parse_ident()?; - let (delim, tts) = self.expect_delimited_token_tree()?; - if delim != token::Brace { - if !self.eat(&token::Semi) { - let msg = "macros that expand to items must either be surrounded with braces \ - or followed by a semicolon"; - self.span_err(self.prev_span, msg); - } - } - let span = lo.to(self.prev_span); - let kind = ItemKind::MacroDef(ast::MacroDef { - tokens: tts, - }); - Ok(Some(self.mk_item(span, id, kind, Visibility::Inherited, attrs.to_owned()))) + Ok(Some(self.mk_item(span, ident, ItemKind::MacroDef(def), vis.clone(), attrs.to_vec()))) } fn parse_stmt_without_recovery(&mut self, -- cgit 1.4.1-3-g733a5 From 7fdc1fb2e40bc8fc5f1f59eb3b9d180619bcb210 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Sat, 25 Mar 2017 21:14:18 +0000 Subject: Hygienize lifetimes. --- src/librustc/hir/lowering.rs | 2 +- src/librustc/hir/map/def_collector.rs | 2 +- src/librustc/hir/mod.rs | 2 +- src/librustc/middle/resolve_lifetime.rs | 3 +-- src/librustc_passes/ast_validation.rs | 4 ++-- src/librustc_save_analysis/lib.rs | 2 +- src/libsyntax/ast.rs | 2 +- src/libsyntax/diagnostics/plugin.rs | 2 +- src/libsyntax/ext/build.rs | 12 ++++++------ src/libsyntax/fold.rs | 2 +- src/libsyntax/parse/parser.rs | 2 +- src/libsyntax/print/pprust.rs | 2 +- src/libsyntax/test.rs | 2 +- src/libsyntax/visit.rs | 2 +- src/libsyntax_ext/deriving/generic/ty.rs | 12 ++++++------ src/libsyntax_ext/env.rs | 7 +++---- src/libsyntax_ext/format.rs | 4 ++-- 17 files changed, 31 insertions(+), 33 deletions(-) (limited to 'src/libsyntax/parse') diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index f5c8d11caaa..5ef278207ed 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -985,7 +985,7 @@ impl<'a> LoweringContext<'a> { fn lower_lifetime(&mut self, l: &Lifetime) -> hir::Lifetime { hir::Lifetime { id: self.lower_node_id(l.id), - name: l.name, + name: self.lower_ident(l.ident), span: l.span, } } diff --git a/src/librustc/hir/map/def_collector.rs b/src/librustc/hir/map/def_collector.rs index 88750ce3acd..f834c744f95 100644 --- a/src/librustc/hir/map/def_collector.rs +++ b/src/librustc/hir/map/def_collector.rs @@ -283,7 +283,7 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> { fn visit_lifetime_def(&mut self, def: &'a LifetimeDef) { self.create_def(def.lifetime.id, - DefPathData::LifetimeDef(def.lifetime.name.as_str()), + DefPathData::LifetimeDef(def.lifetime.ident.name.as_str()), REGULAR_SPACE); } diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index 74a47b4e5b9..500e95a8a77 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -162,7 +162,7 @@ impl Lifetime { } pub fn is_static(&self) -> bool { - self.name == keywords::StaticLifetime.name() + self.name == "'static" } } diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index 7d7308d73bb..1a07423bcbc 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -26,7 +26,6 @@ use std::mem::replace; use syntax::ast; use syntax::attr; use syntax::ptr::P; -use syntax::symbol::keywords; use syntax_pos::Span; use errors::DiagnosticBuilder; use util::nodemap::{NodeMap, NodeSet, FxHashSet, FxHashMap, DefIdMap}; @@ -746,7 +745,7 @@ fn object_lifetime_defaults_for_item(hir_map: &Map, generics: &hir::Generics) match set { Set1::Empty => Set1::Empty, Set1::One(name) => { - if name == keywords::StaticLifetime.name() { + if name == "'static" { Set1::One(Region::Static) } else { generics.lifetimes.iter().enumerate().find(|&(_, def)| { diff --git a/src/librustc_passes/ast_validation.rs b/src/librustc_passes/ast_validation.rs index d7fee7f3110..79d90210d47 100644 --- a/src/librustc_passes/ast_validation.rs +++ b/src/librustc_passes/ast_validation.rs @@ -103,11 +103,11 @@ impl<'a> AstValidator<'a> { impl<'a> Visitor<'a> for AstValidator<'a> { fn visit_lifetime(&mut self, lt: &'a Lifetime) { - if lt.name == "'_" { + if lt.ident.name == "'_" { self.session.add_lint(lint::builtin::LIFETIME_UNDERSCORE, lt.id, lt.span, - format!("invalid lifetime name `{}`", lt.name)); + format!("invalid lifetime name `{}`", lt.ident)); } visit::walk_lifetime(self, lt) diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs index 5a8acf9abe1..d83740936d5 100644 --- a/src/librustc_save_analysis/lib.rs +++ b/src/librustc_save_analysis/lib.rs @@ -828,7 +828,7 @@ fn make_signature(decl: &ast::FnDecl, generics: &ast::Generics) -> String { if !generics.lifetimes.is_empty() || !generics.ty_params.is_empty() { sig.push('<'); sig.push_str(&generics.lifetimes.iter() - .map(|l| l.lifetime.name.to_string()) + .map(|l| l.lifetime.ident.name.to_string()) .collect::>() .join(", ")); if !generics.lifetimes.is_empty() { diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 3dcb77a0497..2eb39bc26b5 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -37,7 +37,7 @@ use std::u32; pub struct Lifetime { pub id: NodeId, pub span: Span, - pub name: Name + pub ident: Ident, } impl fmt::Debug for Lifetime { diff --git a/src/libsyntax/diagnostics/plugin.rs b/src/libsyntax/diagnostics/plugin.rs index 73aeb40df84..2a5de3c7382 100644 --- a/src/libsyntax/diagnostics/plugin.rs +++ b/src/libsyntax/diagnostics/plugin.rs @@ -206,7 +206,7 @@ pub fn expand_build_diagnostic_array<'cx>(ecx: &'cx mut ExtCtxt, (descriptions.len(), ecx.expr_vec(span, descriptions)) }); - let static_ = ecx.lifetime(span, ecx.name_of("'static")); + let static_ = ecx.lifetime(span, Ident::from_str("'static")); let ty_str = ecx.ty_rptr( span, ecx.ty_ident(span, ecx.ident_of("str")), diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 09f22e8691e..a4580ea3939 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -76,10 +76,10 @@ pub trait AstBuilder { fn trait_ref(&self, path: ast::Path) -> ast::TraitRef; fn poly_trait_ref(&self, span: Span, path: ast::Path) -> ast::PolyTraitRef; fn typarambound(&self, path: ast::Path) -> ast::TyParamBound; - fn lifetime(&self, span: Span, ident: ast::Name) -> ast::Lifetime; + fn lifetime(&self, span: Span, ident: ast::Ident) -> ast::Lifetime; fn lifetime_def(&self, span: Span, - name: ast::Name, + ident: ast::Ident, attrs: Vec, bounds: Vec) -> ast::LifetimeDef; @@ -478,19 +478,19 @@ impl<'a> AstBuilder for ExtCtxt<'a> { ast::TraitTyParamBound(self.poly_trait_ref(path.span, path), ast::TraitBoundModifier::None) } - fn lifetime(&self, span: Span, name: ast::Name) -> ast::Lifetime { - ast::Lifetime { id: ast::DUMMY_NODE_ID, span: span, name: name } + fn lifetime(&self, span: Span, ident: ast::Ident) -> ast::Lifetime { + ast::Lifetime { id: ast::DUMMY_NODE_ID, span: span, ident: ident } } fn lifetime_def(&self, span: Span, - name: ast::Name, + ident: ast::Ident, attrs: Vec, bounds: Vec) -> ast::LifetimeDef { ast::LifetimeDef { attrs: attrs.into(), - lifetime: self.lifetime(span, name), + lifetime: self.lifetime(span, ident), bounds: bounds } } diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 5bbda5f2689..4c6cf49a8db 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -694,7 +694,7 @@ pub fn noop_fold_ty_params(tps: Vec, fld: &mut T) -> Vec(l: Lifetime, fld: &mut T) -> Lifetime { Lifetime { id: fld.new_id(l.id), - name: l.name, + ident: fld.fold_ident(l.ident), span: fld.new_span(l.span) } } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index bc9be809ca4..8d7c8c5248b 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1958,7 +1958,7 @@ impl<'a> Parser<'a> { token::Lifetime(ident) => { let ident_span = self.span; self.bump(); - Lifetime { name: ident.name, span: ident_span, id: ast::DUMMY_NODE_ID } + Lifetime { ident: ident, span: ident_span, id: ast::DUMMY_NODE_ID } } _ => self.span_bug(self.span, "not a lifetime") } diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 6c5bf56070e..073ededcb0c 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -2764,7 +2764,7 @@ impl<'a> State<'a> { lifetime: &ast::Lifetime) -> io::Result<()> { - self.print_name(lifetime.name) + self.print_name(lifetime.ident.name) } pub fn print_lifetime_bounds(&mut self, diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs index 3df61fadc35..837c3eb0100 100644 --- a/src/libsyntax/test.rs +++ b/src/libsyntax/test.rs @@ -591,7 +591,7 @@ fn mk_tests(cx: &TestCtxt) -> P { let struct_type = ecx.ty_path(ecx.path(sp, vec![ecx.ident_of("self"), ecx.ident_of("test"), ecx.ident_of("TestDescAndFn")])); - let static_lt = ecx.lifetime(sp, keywords::StaticLifetime.name()); + let static_lt = ecx.lifetime(sp, keywords::StaticLifetime.ident()); // &'static [self::test::TestDescAndFn] let static_type = ecx.ty_rptr(sp, ecx.ty(sp, ast::TyKind::Slice(struct_type)), diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index d29d2497afe..18a0949af0e 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -195,7 +195,7 @@ pub fn walk_local<'a, V: Visitor<'a>>(visitor: &mut V, local: &'a Local) { } pub fn walk_lifetime<'a, V: Visitor<'a>>(visitor: &mut V, lifetime: &'a Lifetime) { - visitor.visit_name(lifetime.span, lifetime.name); + visitor.visit_ident(lifetime.span, lifetime.ident); } pub fn walk_lifetime_def<'a, V: Visitor<'a>>(visitor: &mut V, lifetime_def: &'a LifetimeDef) { diff --git a/src/libsyntax_ext/deriving/generic/ty.rs b/src/libsyntax_ext/deriving/generic/ty.rs index cfd52381538..9c89f99cbb5 100644 --- a/src/libsyntax_ext/deriving/generic/ty.rs +++ b/src/libsyntax_ext/deriving/generic/ty.rs @@ -118,14 +118,14 @@ pub fn nil_ty<'r>() -> Ty<'r> { fn mk_lifetime(cx: &ExtCtxt, span: Span, lt: &Option<&str>) -> Option { match *lt { - Some(ref s) => Some(cx.lifetime(span, cx.ident_of(*s).name)), + Some(s) => Some(cx.lifetime(span, Ident::from_str(s))), None => None, } } fn mk_lifetimes(cx: &ExtCtxt, span: Span, lt: &Option<&str>) -> Vec { match *lt { - Some(ref s) => vec![cx.lifetime(span, cx.ident_of(*s).name)], + Some(s) => vec![cx.lifetime(span, Ident::from_str(s))], None => vec![], } } @@ -243,11 +243,11 @@ impl<'a> LifetimeBounds<'a> { -> Generics { let lifetimes = self.lifetimes .iter() - .map(|&(ref lt, ref bounds)| { + .map(|&(lt, ref bounds)| { let bounds = bounds.iter() - .map(|b| cx.lifetime(span, cx.ident_of(*b).name)) + .map(|b| cx.lifetime(span, Ident::from_str(b))) .collect(); - cx.lifetime_def(span, cx.ident_of(*lt).name, vec![], bounds) + cx.lifetime_def(span, Ident::from_str(lt), vec![], bounds) }) .collect(); let ty_params = self.bounds @@ -277,7 +277,7 @@ pub fn get_explicit_self(cx: &ExtCtxt, respan(span, match *ptr { Borrowed(ref lt, mutbl) => { - let lt = lt.map(|s| cx.lifetime(span, cx.ident_of(s).name)); + let lt = lt.map(|s| cx.lifetime(span, Ident::from_str(s))); SelfKind::Region(lt, mutbl) } Raw(_) => { diff --git a/src/libsyntax_ext/env.rs b/src/libsyntax_ext/env.rs index ecf0a8f377e..affebbabbbd 100644 --- a/src/libsyntax_ext/env.rs +++ b/src/libsyntax_ext/env.rs @@ -13,7 +13,7 @@ // interface. // -use syntax::ast; +use syntax::ast::{self, Ident}; use syntax::ext::base::*; use syntax::ext::base; use syntax::ext::build::AstBuilder; @@ -39,10 +39,9 @@ pub fn expand_option_env<'cx>(cx: &'cx mut ExtCtxt, cx.std_path(&["option", "Option", "None"]), Vec::new(), vec![cx.ty_rptr(sp, - cx.ty_ident(sp, cx.ident_of("str")), + cx.ty_ident(sp, Ident::from_str("str")), Some(cx.lifetime(sp, - cx.ident_of("'static") - .name)), + Ident::from_str("'static"))), ast::Mutability::Immutable)], Vec::new())) } diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs index 6f5ab50b2fe..24c1dfe289b 100644 --- a/src/libsyntax_ext/format.rs +++ b/src/libsyntax_ext/format.rs @@ -508,7 +508,7 @@ impl<'a, 'b> Context<'a, 'b> { let sp = piece_ty.span; let ty = ecx.ty_rptr(sp, ecx.ty(sp, ast::TyKind::Slice(piece_ty)), - Some(ecx.lifetime(sp, keywords::StaticLifetime.name())), + Some(ecx.lifetime(sp, keywords::StaticLifetime.ident())), ast::Mutability::Immutable); let slice = ecx.expr_vec_slice(sp, pieces); // static instead of const to speed up codegen by not requiring this to be inlined @@ -536,7 +536,7 @@ impl<'a, 'b> Context<'a, 'b> { // First, build up the static array which will become our precompiled // format "string" - let static_lifetime = self.ecx.lifetime(self.fmtsp, keywords::StaticLifetime.name()); + let static_lifetime = self.ecx.lifetime(self.fmtsp, keywords::StaticLifetime.ident()); let piece_ty = self.ecx.ty_rptr(self.fmtsp, self.ecx.ty_ident(self.fmtsp, self.ecx.ident_of("str")), Some(static_lifetime), -- cgit 1.4.1-3-g733a5