diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2019-11-03 17:38:02 -0500 |
|---|---|---|
| committer | Mark Rousskov <mark.simulacrum@gmail.com> | 2019-11-09 11:10:13 -0500 |
| commit | 516a817dbde4d834aeccf6fbbdf52bb2164cc20b (patch) | |
| tree | a8ec0d39211008a052d4b7c9700ecb12a4082dda /src | |
| parent | 5a5027519a4a634baa6cde5b698b907d27fbe6b3 (diff) | |
| download | rust-516a817dbde4d834aeccf6fbbdf52bb2164cc20b.tar.gz rust-516a817dbde4d834aeccf6fbbdf52bb2164cc20b.zip | |
Move next_node_id to Resolver
This doesn't migrate the pretty-printing everybody loops, which will be done in the next few commits.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/hir/lowering.rs | 18 | ||||
| -rw-r--r-- | src/librustc/hir/lowering/expr.rs | 2 | ||||
| -rw-r--r-- | src/librustc/hir/lowering/item.rs | 4 | ||||
| -rw-r--r-- | src/librustc/session/mod.rs | 21 | ||||
| -rw-r--r-- | src/librustc_driver/Cargo.toml | 1 | ||||
| -rw-r--r-- | src/librustc_driver/lib.rs | 4 | ||||
| -rw-r--r-- | src/librustc_driver/pretty.rs | 8 | ||||
| -rw-r--r-- | src/librustc_interface/passes.rs | 2 | ||||
| -rw-r--r-- | src/librustc_interface/util.rs | 37 | ||||
| -rw-r--r-- | src/librustc_resolve/build_reduced_graph.rs | 2 | ||||
| -rw-r--r-- | src/librustc_resolve/lib.rs | 27 | ||||
| -rw-r--r-- | src/librustc_resolve/macros.rs | 2 |
12 files changed, 64 insertions, 64 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index 278f45371b1..f2d5f043f90 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -183,6 +183,8 @@ pub trait Resolver { ) -> (ast::Path, Res<NodeId>); fn lint_buffer(&mut self) -> &mut lint::LintBuffer; + + fn next_node_id(&mut self) -> NodeId; } type NtToTokenstream = fn(&Nonterminal, &ParseSess, Span) -> TokenStream; @@ -672,7 +674,8 @@ impl<'a> LoweringContext<'a> { } fn next_id(&mut self) -> hir::HirId { - self.lower_node_id(self.sess.next_node_id()) + let node_id = self.resolver.next_node_id(); + self.lower_node_id(node_id) } fn lower_res(&mut self, res: Res<NodeId>) -> Res { @@ -781,7 +784,7 @@ impl<'a> LoweringContext<'a> { hir_name: ParamName, parent_index: DefIndex, ) -> hir::GenericParam { - let node_id = self.sess.next_node_id(); + let node_id = self.resolver.next_node_id(); // Get the name we'll use to make the def-path. Note // that collisions are ok here and this shouldn't @@ -1106,7 +1109,7 @@ impl<'a> LoweringContext<'a> { // Desugar `AssocTy: Bounds` into `AssocTy = impl Bounds`. We do this by // constructing the HIR for `impl bounds...` and then lowering that. - let impl_trait_node_id = self.sess.next_node_id(); + let impl_trait_node_id = self.resolver.next_node_id(); let parent_def_index = self.current_hir_id_owner.last().unwrap().0; self.resolver.definitions().create_def_with_parent( parent_def_index, @@ -1117,9 +1120,10 @@ impl<'a> LoweringContext<'a> { ); self.with_dyn_type_scope(false, |this| { + let node_id = this.resolver.next_node_id(); let ty = this.lower_ty( &Ty { - id: this.sess.next_node_id(), + id: node_id, kind: TyKind::ImplTrait(impl_trait_node_id, bounds.clone()), span: constraint.span, }, @@ -1586,7 +1590,7 @@ impl<'a> LoweringContext<'a> { name, })); - let def_node_id = self.context.sess.next_node_id(); + let def_node_id = self.context.resolver.next_node_id(); let hir_id = self.context.lower_node_id_with_owner(def_node_id, self.opaque_ty_id); self.context.resolver.definitions().create_def_with_parent( @@ -3234,7 +3238,7 @@ impl<'a> LoweringContext<'a> { Some(id) => (id, "`'_` cannot be used here", "`'_` is a reserved lifetime name"), None => ( - self.sess.next_node_id(), + self.resolver.next_node_id(), "`&` without an explicit lifetime name cannot be used here", "explicit lifetime name needed here", ), @@ -3271,7 +3275,7 @@ impl<'a> LoweringContext<'a> { span, "expected 'implicit elided lifetime not allowed' error", ); - let id = self.sess.next_node_id(); + let id = self.resolver.next_node_id(); self.new_named_lifetime(id, span, hir::LifetimeName::Error) } // `PassThrough` is the normal case. diff --git a/src/librustc/hir/lowering/expr.rs b/src/librustc/hir/lowering/expr.rs index 73db762a64b..42ce74aedef 100644 --- a/src/librustc/hir/lowering/expr.rs +++ b/src/librustc/hir/lowering/expr.rs @@ -595,7 +595,7 @@ impl LoweringContext<'_> { }; // `::std::task::Poll::Ready(result) => break result` - let loop_node_id = self.sess.next_node_id(); + let loop_node_id = self.resolver.next_node_id(); let loop_hir_id = self.lower_node_id(loop_node_id); let ready_arm = { let x_ident = Ident::with_dummy_span(sym::result); diff --git a/src/librustc/hir/lowering/item.rs b/src/librustc/hir/lowering/item.rs index 7aa1aa8bb51..4e20f476d85 100644 --- a/src/librustc/hir/lowering/item.rs +++ b/src/librustc/hir/lowering/item.rs @@ -522,7 +522,7 @@ impl LoweringContext<'_> { let ident = *ident; let mut path = path.clone(); for seg in &mut path.segments { - seg.id = self.sess.next_node_id(); + seg.id = self.resolver.next_node_id(); } let span = path.span; @@ -599,7 +599,7 @@ impl LoweringContext<'_> { // Give the segments new node-ids since they are being cloned. for seg in &mut prefix.segments { - seg.id = self.sess.next_node_id(); + seg.id = self.resolver.next_node_id(); } // Each `use` import is an item and thus are owners of the diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 403b32df20e..bab7ab89ce7 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -21,7 +21,6 @@ use errors::{DiagnosticBuilder, DiagnosticId, Applicability}; use errors::emitter::{Emitter, EmitterWriter}; use errors::emitter::HumanReadableErrorType; use errors::annotate_snippet_emitter_writer::{AnnotateSnippetEmitterWriter}; -use syntax::ast::{self, NodeId}; use syntax::edition::Edition; use syntax::expand::allocator::AllocatorKind; use syntax::feature_gate::{self, AttributeType}; @@ -38,7 +37,7 @@ use rustc_data_structures::jobserver; use ::jobserver::Client; use std; -use std::cell::{self, Cell, RefCell}; +use std::cell::{self, RefCell}; use std::env; use std::fmt; use std::io::Write; @@ -127,8 +126,6 @@ pub struct Session { /// Data about code being compiled, gathered during compilation. pub code_stats: Lock<CodeStats>, - next_node_id: OneThread<Cell<ast::NodeId>>, - /// If `-zfuel=crate=n` is specified, `Some(crate)`. optimization_fuel_crate: Option<String>, @@ -355,21 +352,6 @@ impl Session { self.diagnostic().span_note_without_error(sp, msg) } - pub fn reserve_node_ids(&self, count: usize) -> ast::NodeId { - let id = self.next_node_id.get(); - - match id.as_usize().checked_add(count) { - Some(next) => { - self.next_node_id.set(ast::NodeId::from_usize(next)); - } - None => bug!("input too large; ran out of node-IDs!"), - } - - id - } - pub fn next_node_id(&self) -> NodeId { - self.reserve_node_ids(1) - } pub fn diagnostic(&self) -> &errors::Handler { &self.parse_sess.span_diagnostic } @@ -1187,7 +1169,6 @@ fn build_session_( recursion_limit: Once::new(), type_length_limit: Once::new(), const_eval_stack_frame_limit: 100, - next_node_id: OneThread::new(Cell::new(NodeId::from_u32(1))), allocator_kind: Once::new(), injected_panic_runtime: Once::new(), imported_macro_spans: OneThread::new(RefCell::new(FxHashMap::default())), diff --git a/src/librustc_driver/Cargo.toml b/src/librustc_driver/Cargo.toml index a9e4e6db1c7..0a803187d49 100644 --- a/src/librustc_driver/Cargo.toml +++ b/src/librustc_driver/Cargo.toml @@ -27,5 +27,6 @@ rustc_save_analysis = { path = "../librustc_save_analysis" } rustc_codegen_utils = { path = "../librustc_codegen_utils" } rustc_interface = { path = "../librustc_interface" } rustc_serialize = { path = "../libserialize", package = "serialize" } +rustc_resolve = { path = "../librustc_resolve" } syntax = { path = "../libsyntax" } syntax_pos = { path = "../libsyntax_pos" } diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 47acf387f35..478868579c7 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -291,7 +291,6 @@ pub fn run_compiler( if let Some((ppm, opt_uii)) = pretty_info { if ppm.needs_ast_map(&opt_uii) { - pretty::visit_crate(sess, &mut compiler.parse()?.peek_mut(), ppm); compiler.global_ctxt()?.peek_mut().enter(|tcx| { let expanded_crate = compiler.expansion()?.take().0; pretty::print_after_hir_lowering( @@ -305,8 +304,7 @@ pub fn run_compiler( Ok(()) })?; } else { - let mut krate = compiler.parse()?.take(); - pretty::visit_crate(sess, &mut krate, ppm); + let krate = compiler.parse()?.take(); pretty::print_after_parsing( sess, &compiler.input(), diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index 0de5b700b4f..42941f25061 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -8,11 +8,9 @@ use rustc::session::Session; use rustc::session::config::Input; use rustc::ty::{self, TyCtxt}; use rustc::util::common::ErrorReported; -use rustc_interface::util::ReplaceBodyWithLoop; use rustc_mir::util::{write_mir_pretty, write_mir_graphviz}; use syntax::ast; -use syntax::mut_visit::MutVisitor; use syntax::print::{pprust}; use syntax_pos::FileName; @@ -572,12 +570,6 @@ impl UserIdentifiedItem { } } -pub fn visit_crate(sess: &Session, krate: &mut ast::Crate, ppm: PpMode) { - if let PpmSource(PpmEveryBodyLoops) = ppm { - ReplaceBodyWithLoop::new(sess).visit_crate(krate); - } -} - fn get_source(input: &Input, sess: &Session) -> (String, FileName) { let src_name = source_name(input); let src = String::clone(&sess.source_map() diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index ce34caee6fa..048b5cff2bf 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -395,7 +395,7 @@ fn configure_and_expand_inner<'a>( // If we're actually rustdoc then there's no need to actually compile // anything, so switch everything to just looping if sess.opts.actually_rustdoc { - util::ReplaceBodyWithLoop::new(sess).visit_crate(&mut krate); + util::ReplaceBodyWithLoop::new(&mut resolver).visit_crate(&mut krate); } let has_proc_macro_decls = time(sess, "AST validation", || { diff --git a/src/librustc_interface/util.rs b/src/librustc_interface/util.rs index a74ea4bca39..0c08f65d11d 100644 --- a/src/librustc_interface/util.rs +++ b/src/librustc_interface/util.rs @@ -18,7 +18,7 @@ use rustc_mir; use rustc_passes; use rustc_plugin; use rustc_privacy; -use rustc_resolve; +use rustc_resolve::{self, Resolver}; use rustc_typeck; use std::env; use std::env::consts::{DLL_PREFIX, DLL_SUFFIX}; @@ -715,18 +715,18 @@ pub fn build_output_filenames( // ambitious form of the closed RFC #1637. See also [#34511]. // // [#34511]: https://github.com/rust-lang/rust/issues/34511#issuecomment-322340401 -pub struct ReplaceBodyWithLoop<'a> { +pub struct ReplaceBodyWithLoop<'a, 'b> { within_static_or_const: bool, nested_blocks: Option<Vec<ast::Block>>, - sess: &'a Session, + resolver: &'a mut Resolver<'b>, } -impl<'a> ReplaceBodyWithLoop<'a> { - pub fn new(sess: &'a Session) -> ReplaceBodyWithLoop<'a> { +impl<'a, 'b> ReplaceBodyWithLoop<'a, 'b> { + pub fn new(resolver: &'a mut Resolver<'b>) -> ReplaceBodyWithLoop<'a, 'b> { ReplaceBodyWithLoop { within_static_or_const: false, nested_blocks: None, - sess + resolver, } } @@ -788,11 +788,12 @@ impl<'a> ReplaceBodyWithLoop<'a> { } fn is_sig_const(sig: &ast::FnSig) -> bool { - sig.header.constness.node == ast::Constness::Const || Self::should_ignore_fn(&sig.decl) + sig.header.constness.node == ast::Constness::Const || + ReplaceBodyWithLoop::should_ignore_fn(&sig.decl) } } -impl<'a> MutVisitor for ReplaceBodyWithLoop<'a> { +impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> { fn visit_item_kind(&mut self, i: &mut ast::ItemKind) { let is_const = match i { ast::ItemKind::Static(..) | ast::ItemKind::Const(..) => true, @@ -827,40 +828,40 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a> { fn visit_block(&mut self, b: &mut P<ast::Block>) { fn stmt_to_block(rules: ast::BlockCheckMode, s: Option<ast::Stmt>, - sess: &Session) -> ast::Block { + resolver: &mut Resolver<'_>) -> ast::Block { ast::Block { stmts: s.into_iter().collect(), rules, - id: sess.next_node_id(), + id: resolver.next_node_id(), span: syntax_pos::DUMMY_SP, } } - fn block_to_stmt(b: ast::Block, sess: &Session) -> ast::Stmt { + fn block_to_stmt(b: ast::Block, resolver: &mut Resolver<'_>) -> ast::Stmt { let expr = P(ast::Expr { - id: sess.next_node_id(), + id: resolver.next_node_id(), kind: ast::ExprKind::Block(P(b), None), span: syntax_pos::DUMMY_SP, attrs: ThinVec::new(), }); ast::Stmt { - id: sess.next_node_id(), + id: resolver.next_node_id(), kind: ast::StmtKind::Expr(expr), span: syntax_pos::DUMMY_SP, } } - let empty_block = stmt_to_block(BlockCheckMode::Default, None, self.sess); + let empty_block = stmt_to_block(BlockCheckMode::Default, None, self.resolver); let loop_expr = P(ast::Expr { kind: ast::ExprKind::Loop(P(empty_block), None), - id: self.sess.next_node_id(), + id: self.resolver.next_node_id(), span: syntax_pos::DUMMY_SP, attrs: ThinVec::new(), }); let loop_stmt = ast::Stmt { - id: self.sess.next_node_id(), + id: self.resolver.next_node_id(), span: syntax_pos::DUMMY_SP, kind: ast::StmtKind::Expr(loop_expr), }; @@ -878,7 +879,7 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a> { // we put a Some in there earlier with that replace(), so this is valid let new_blocks = self.nested_blocks.take().unwrap(); self.nested_blocks = old_blocks; - stmts.extend(new_blocks.into_iter().map(|b| block_to_stmt(b, &self.sess))); + stmts.extend(new_blocks.into_iter().map(|b| block_to_stmt(b, self.resolver))); } let mut new_block = ast::Block { @@ -892,7 +893,7 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a> { old_blocks.push(new_block); } - stmt_to_block(b.rules, Some(loop_stmt), self.sess) + stmt_to_block(b.rules, Some(loop_stmt), &mut self.resolver) } else { //push `loop {}` onto the end of our fresh block and yield that new_block.stmts.push(loop_stmt); diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index 4239518b879..1ce356d4891 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -449,7 +449,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> { name: kw::PathRoot, span: source.ident.span, }, - id: Some(self.r.session.next_node_id()), + id: Some(self.r.next_node_id()), }); source.ident.name = crate_name; } diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 5c996bffb9a..94b4418c16a 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -961,6 +961,8 @@ pub struct Resolver<'a> { variant_vis: DefIdMap<ty::Visibility>, lint_buffer: lint::LintBuffer, + + next_node_id: NodeId, } /// Nothing really interesting here; it just provides memory for the rest of the crate. @@ -1078,6 +1080,10 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> { fn lint_buffer(&mut self) -> &mut lint::LintBuffer { &mut self.lint_buffer } + + fn next_node_id(&mut self) -> NodeId { + self.next_node_id() + } } impl<'a> Resolver<'a> { @@ -1226,7 +1232,24 @@ impl<'a> Resolver<'a> { .collect(), variant_vis: Default::default(), lint_buffer: lint::LintBuffer::default(), + next_node_id: NodeId::from_u32(1), + } + } + + pub fn reserve_node_ids(&mut self, count: usize) -> ast::NodeId { + let id = self.next_node_id; + + match id.as_usize().checked_add(count) { + Some(next) => { + self.next_node_id = ast::NodeId::from_usize(next); + } + None => panic!("input too large; ran out of node-IDs!"), } + + id + } + pub fn next_node_id(&mut self) -> NodeId { + self.reserve_node_ids(1) } pub fn lint_buffer(&mut self) -> &mut lint::LintBuffer { @@ -2827,9 +2850,9 @@ impl<'a> Resolver<'a> { } } - fn new_ast_path_segment(&self, ident: Ident) -> ast::PathSegment { + fn new_ast_path_segment(&mut self, ident: Ident) -> ast::PathSegment { let mut seg = ast::PathSegment::from_ident(ident); - seg.id = self.session.next_node_id(); + seg.id = self.next_node_id(); seg } diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 3d5a7f26eda..cc811d3b59a 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -95,7 +95,7 @@ fn fast_print_path(path: &ast::Path) -> Symbol { impl<'a> base::Resolver for Resolver<'a> { fn next_node_id(&mut self) -> NodeId { - self.session.next_node_id() + self.next_node_id() } fn resolve_dollar_crates(&mut self) { |
