mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Auto merge of #52927 - Mark-Simulacrum:cratestore-cleanup, r=alexcrichton
Crate store cleanup Each commit mostly stands on its own. Most of the diff is lifetime-related and uninteresting.
This commit is contained in:
commit
c11f2d286c
@ -2219,6 +2219,7 @@ dependencies = [
|
||||
"rustc 0.0.0",
|
||||
"rustc_data_structures 0.0.0",
|
||||
"rustc_incremental 0.0.0",
|
||||
"rustc_metadata_utils 0.0.0",
|
||||
"rustc_mir 0.0.0",
|
||||
"rustc_target 0.0.0",
|
||||
"syntax 0.0.0",
|
||||
@ -2352,6 +2353,7 @@ dependencies = [
|
||||
"rustc 0.0.0",
|
||||
"rustc_data_structures 0.0.0",
|
||||
"rustc_errors 0.0.0",
|
||||
"rustc_metadata_utils 0.0.0",
|
||||
"rustc_target 0.0.0",
|
||||
"serialize 0.0.0",
|
||||
"syntax 0.0.0",
|
||||
@ -2359,6 +2361,15 @@ dependencies = [
|
||||
"syntax_pos 0.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc_metadata_utils"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"rustc 0.0.0",
|
||||
"syntax 0.0.0",
|
||||
"syntax_pos 0.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc_mir"
|
||||
version = "0.0.0"
|
||||
@ -2441,6 +2452,7 @@ dependencies = [
|
||||
"rustc 0.0.0",
|
||||
"rustc_data_structures 0.0.0",
|
||||
"rustc_errors 0.0.0",
|
||||
"rustc_metadata 0.0.0",
|
||||
"syntax 0.0.0",
|
||||
"syntax_pos 0.0.0",
|
||||
]
|
||||
|
@ -22,10 +22,9 @@
|
||||
//! are *mostly* used as a part of that interface, but these should
|
||||
//! probably get a better home if someone can find one.
|
||||
|
||||
use hir::def;
|
||||
use hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
||||
use hir::map as hir_map;
|
||||
use hir::map::definitions::{Definitions, DefKey, DefPathTable};
|
||||
use hir::map::definitions::{DefKey, DefPathTable};
|
||||
use hir::svh::Svh;
|
||||
use ty::{self, TyCtxt};
|
||||
use session::{Session, CrateDisambiguator};
|
||||
@ -34,8 +33,6 @@ use session::search_paths::PathKind;
|
||||
use std::any::Any;
|
||||
use std::path::{Path, PathBuf};
|
||||
use syntax::ast;
|
||||
use syntax::edition::Edition;
|
||||
use syntax::ext::base::SyntaxExtension;
|
||||
use syntax::symbol::Symbol;
|
||||
use syntax_pos::Span;
|
||||
use rustc_target::spec::Target;
|
||||
@ -140,11 +137,6 @@ pub struct ForeignModule {
|
||||
pub def_id: DefId,
|
||||
}
|
||||
|
||||
pub enum LoadedMacro {
|
||||
MacroDef(ast::Item),
|
||||
ProcMacro(Lrc<SyntaxExtension>),
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct ExternCrate {
|
||||
pub src: ExternCrateSource,
|
||||
@ -221,9 +213,6 @@ pub trait MetadataLoader {
|
||||
pub trait CrateStore {
|
||||
fn crate_data_as_rc_any(&self, krate: CrateNum) -> Lrc<dyn Any>;
|
||||
|
||||
// access to the metadata loader
|
||||
fn metadata_loader(&self) -> &dyn MetadataLoader;
|
||||
|
||||
// resolve
|
||||
fn def_key(&self, def: DefId) -> DefKey;
|
||||
fn def_path(&self, def: DefId) -> hir_map::DefPath;
|
||||
@ -231,19 +220,11 @@ pub trait CrateStore {
|
||||
fn def_path_table(&self, cnum: CrateNum) -> Lrc<DefPathTable>;
|
||||
|
||||
// "queries" used in resolve that aren't tracked for incremental compilation
|
||||
fn visibility_untracked(&self, def: DefId) -> ty::Visibility;
|
||||
fn export_macros_untracked(&self, cnum: CrateNum);
|
||||
fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind;
|
||||
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol;
|
||||
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator;
|
||||
fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh;
|
||||
fn crate_edition_untracked(&self, cnum: CrateNum) -> Edition;
|
||||
fn struct_field_names_untracked(&self, def: DefId) -> Vec<ast::Name>;
|
||||
fn item_children_untracked(&self, did: DefId, sess: &Session) -> Vec<def::Export>;
|
||||
fn load_macro_untracked(&self, did: DefId, sess: &Session) -> LoadedMacro;
|
||||
fn extern_mod_stmt_cnum_untracked(&self, emod_id: ast::NodeId) -> Option<CrateNum>;
|
||||
fn item_generics_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::Generics;
|
||||
fn associated_item_cloned_untracked(&self, def: DefId) -> ty::AssociatedItem;
|
||||
fn postorder_cnums_untracked(&self) -> Vec<CrateNum>;
|
||||
|
||||
// This is basically a 1-based range of ints, which is a little
|
||||
@ -260,116 +241,6 @@ pub trait CrateStore {
|
||||
|
||||
pub type CrateStoreDyn = dyn CrateStore + sync::Sync;
|
||||
|
||||
// FIXME: find a better place for this?
|
||||
pub fn validate_crate_name(sess: Option<&Session>, s: &str, sp: Option<Span>) {
|
||||
let mut err_count = 0;
|
||||
{
|
||||
let mut say = |s: &str| {
|
||||
match (sp, sess) {
|
||||
(_, None) => bug!("{}", s),
|
||||
(Some(sp), Some(sess)) => sess.span_err(sp, s),
|
||||
(None, Some(sess)) => sess.err(s),
|
||||
}
|
||||
err_count += 1;
|
||||
};
|
||||
if s.is_empty() {
|
||||
say("crate name must not be empty");
|
||||
}
|
||||
for c in s.chars() {
|
||||
if c.is_alphanumeric() { continue }
|
||||
if c == '_' { continue }
|
||||
say(&format!("invalid character `{}` in crate name: `{}`", c, s));
|
||||
}
|
||||
}
|
||||
|
||||
if err_count > 0 {
|
||||
sess.unwrap().abort_if_errors();
|
||||
}
|
||||
}
|
||||
|
||||
/// A dummy crate store that does not support any non-local crates,
|
||||
/// for test purposes.
|
||||
pub struct DummyCrateStore;
|
||||
|
||||
#[allow(unused_variables)]
|
||||
impl CrateStore for DummyCrateStore {
|
||||
fn crate_data_as_rc_any(&self, krate: CrateNum) -> Lrc<dyn Any>
|
||||
{ bug!("crate_data_as_rc_any") }
|
||||
// item info
|
||||
fn visibility_untracked(&self, def: DefId) -> ty::Visibility { bug!("visibility") }
|
||||
fn item_generics_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::Generics
|
||||
{ bug!("item_generics_cloned") }
|
||||
|
||||
// trait/impl-item info
|
||||
fn associated_item_cloned_untracked(&self, def: DefId) -> ty::AssociatedItem
|
||||
{ bug!("associated_item_cloned") }
|
||||
|
||||
// crate metadata
|
||||
fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind { bug!("is_explicitly_linked") }
|
||||
fn export_macros_untracked(&self, cnum: CrateNum) { bug!("export_macros") }
|
||||
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol { bug!("crate_name") }
|
||||
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator {
|
||||
bug!("crate_disambiguator")
|
||||
}
|
||||
fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh { bug!("crate_hash") }
|
||||
fn crate_edition_untracked(&self, cnum: CrateNum) -> Edition { bug!("crate_edition_untracked") }
|
||||
|
||||
// resolve
|
||||
fn def_key(&self, def: DefId) -> DefKey { bug!("def_key") }
|
||||
fn def_path(&self, def: DefId) -> hir_map::DefPath {
|
||||
bug!("relative_def_path")
|
||||
}
|
||||
fn def_path_hash(&self, def: DefId) -> hir_map::DefPathHash {
|
||||
bug!("def_path_hash")
|
||||
}
|
||||
fn def_path_table(&self, cnum: CrateNum) -> Lrc<DefPathTable> {
|
||||
bug!("def_path_table")
|
||||
}
|
||||
fn struct_field_names_untracked(&self, def: DefId) -> Vec<ast::Name> {
|
||||
bug!("struct_field_names")
|
||||
}
|
||||
fn item_children_untracked(&self, did: DefId, sess: &Session) -> Vec<def::Export> {
|
||||
bug!("item_children")
|
||||
}
|
||||
fn load_macro_untracked(&self, did: DefId, sess: &Session) -> LoadedMacro { bug!("load_macro") }
|
||||
|
||||
fn crates_untracked(&self) -> Vec<CrateNum> { vec![] }
|
||||
|
||||
// utility functions
|
||||
fn extern_mod_stmt_cnum_untracked(&self, emod_id: ast::NodeId) -> Option<CrateNum> { None }
|
||||
fn encode_metadata<'a, 'tcx>(&self,
|
||||
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
link_meta: &LinkMeta)
|
||||
-> EncodedMetadata {
|
||||
bug!("encode_metadata")
|
||||
}
|
||||
fn metadata_encoding_version(&self) -> &[u8] { bug!("metadata_encoding_version") }
|
||||
fn postorder_cnums_untracked(&self) -> Vec<CrateNum> { bug!("postorder_cnums_untracked") }
|
||||
|
||||
// access to the metadata loader
|
||||
fn metadata_loader(&self) -> &dyn MetadataLoader { bug!("metadata_loader") }
|
||||
}
|
||||
|
||||
pub trait CrateLoader {
|
||||
fn process_extern_crate(&mut self, item: &ast::Item, defs: &Definitions) -> CrateNum;
|
||||
|
||||
fn process_path_extern(
|
||||
&mut self,
|
||||
name: Symbol,
|
||||
span: Span,
|
||||
) -> CrateNum;
|
||||
|
||||
fn process_use_extern(
|
||||
&mut self,
|
||||
name: Symbol,
|
||||
span: Span,
|
||||
id: ast::NodeId,
|
||||
defs: &Definitions,
|
||||
) -> CrateNum;
|
||||
|
||||
fn postprocess(&mut self, krate: &ast::Crate);
|
||||
}
|
||||
|
||||
// This method is used when generating the command line to pass through to
|
||||
// system linker. The linker expects undefined symbols on the left of the
|
||||
// command line to be defined in libraries on the right, not the other way
|
||||
|
@ -20,3 +20,4 @@ rustc_target = { path = "../librustc_target" }
|
||||
rustc_data_structures = { path = "../librustc_data_structures" }
|
||||
rustc_mir = { path = "../librustc_mir" }
|
||||
rustc_incremental = { path = "../librustc_incremental" }
|
||||
rustc_metadata_utils = { path = "../librustc_metadata_utils" }
|
||||
|
@ -37,6 +37,7 @@ extern crate rustc_incremental;
|
||||
extern crate syntax;
|
||||
extern crate syntax_pos;
|
||||
#[macro_use] extern crate rustc_data_structures;
|
||||
extern crate rustc_metadata_utils;
|
||||
|
||||
use rustc::ty::TyCtxt;
|
||||
|
||||
|
@ -10,11 +10,12 @@
|
||||
|
||||
use rustc::session::config::{self, OutputFilenames, Input, OutputType};
|
||||
use rustc::session::Session;
|
||||
use rustc::middle::cstore::{self, LinkMeta};
|
||||
use rustc::middle::cstore::LinkMeta;
|
||||
use rustc::hir::svh::Svh;
|
||||
use std::path::{Path, PathBuf};
|
||||
use syntax::{ast, attr};
|
||||
use syntax_pos::Span;
|
||||
use rustc_metadata_utils::validate_crate_name;
|
||||
|
||||
pub fn out_filename(sess: &Session,
|
||||
crate_type: config::CrateType,
|
||||
@ -61,7 +62,7 @@ pub fn find_crate_name(sess: Option<&Session>,
|
||||
attrs: &[ast::Attribute],
|
||||
input: &Input) -> String {
|
||||
let validate = |s: String, span: Option<Span>| {
|
||||
cstore::validate_crate_name(sess, &s, span);
|
||||
validate_crate_name(sess, &s, span);
|
||||
s
|
||||
};
|
||||
|
||||
|
@ -20,7 +20,6 @@ use rustc::session::config::{self, Input, OutputFilenames, OutputType};
|
||||
use rustc::session::search_paths::PathKind;
|
||||
use rustc::lint;
|
||||
use rustc::middle::{self, reachable, resolve_lifetime, stability};
|
||||
use rustc::middle::cstore::CrateStoreDyn;
|
||||
use rustc::middle::privacy::AccessLevels;
|
||||
use rustc::ty::{self, AllArenas, Resolutions, TyCtxt};
|
||||
use rustc::traits;
|
||||
@ -484,7 +483,7 @@ impl<'a> ::CompilerCalls<'a> for CompileController<'a> {
|
||||
codegen_backend: &dyn (::CodegenBackend),
|
||||
matches: &::getopts::Matches,
|
||||
sess: &Session,
|
||||
cstore: &dyn (::CrateStore),
|
||||
cstore: &CStore,
|
||||
input: &Input,
|
||||
odir: &Option<PathBuf>,
|
||||
ofile: &Option<PathBuf>,
|
||||
@ -728,9 +727,9 @@ pub struct ExpansionResult {
|
||||
pub hir_forest: hir_map::Forest,
|
||||
}
|
||||
|
||||
pub struct InnerExpansionResult<'a> {
|
||||
pub struct InnerExpansionResult<'a, 'b: 'a> {
|
||||
pub expanded_crate: ast::Crate,
|
||||
pub resolver: Resolver<'a>,
|
||||
pub resolver: Resolver<'a, 'b>,
|
||||
pub hir_forest: hir_map::Forest,
|
||||
}
|
||||
|
||||
@ -806,7 +805,7 @@ where
|
||||
|
||||
/// Same as phase_2_configure_and_expand, but doesn't let you keep the resolver
|
||||
/// around
|
||||
pub fn phase_2_configure_and_expand_inner<'a, F>(
|
||||
pub fn phase_2_configure_and_expand_inner<'a, 'b: 'a, F>(
|
||||
sess: &'a Session,
|
||||
cstore: &'a CStore,
|
||||
mut krate: ast::Crate,
|
||||
@ -815,9 +814,9 @@ pub fn phase_2_configure_and_expand_inner<'a, F>(
|
||||
addl_plugins: Option<Vec<String>>,
|
||||
make_glob_map: MakeGlobMap,
|
||||
resolver_arenas: &'a ResolverArenas<'a>,
|
||||
crate_loader: &'a mut CrateLoader,
|
||||
crate_loader: &'a mut CrateLoader<'b>,
|
||||
after_expand: F,
|
||||
) -> Result<InnerExpansionResult<'a>, CompileIncomplete>
|
||||
) -> Result<InnerExpansionResult<'a, 'b>, CompileIncomplete>
|
||||
where
|
||||
F: FnOnce(&ast::Crate) -> CompileResult,
|
||||
{
|
||||
@ -1209,7 +1208,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(
|
||||
codegen_backend: &dyn CodegenBackend,
|
||||
control: &CompileController,
|
||||
sess: &'tcx Session,
|
||||
cstore: &'tcx CrateStoreDyn,
|
||||
cstore: &'tcx CStore,
|
||||
hir_map: hir_map::Map<'tcx>,
|
||||
mut analysis: ty::CrateAnalysis,
|
||||
resolutions: Resolutions,
|
||||
|
@ -78,7 +78,6 @@ use rustc::session::filesearch;
|
||||
use rustc::session::{early_error, early_warn};
|
||||
use rustc::lint::Lint;
|
||||
use rustc::lint;
|
||||
use rustc::middle::cstore::CrateStore;
|
||||
use rustc_metadata::locator;
|
||||
use rustc_metadata::cstore::CStore;
|
||||
use rustc_metadata::dynamic_lib::DynamicLibrary;
|
||||
@ -676,7 +675,7 @@ pub trait CompilerCalls<'a> {
|
||||
_: &dyn CodegenBackend,
|
||||
_: &getopts::Matches,
|
||||
_: &Session,
|
||||
_: &dyn CrateStore,
|
||||
_: &CStore,
|
||||
_: &Input,
|
||||
_: &Option<PathBuf>,
|
||||
_: &Option<PathBuf>)
|
||||
@ -884,7 +883,7 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
|
||||
codegen_backend: &dyn CodegenBackend,
|
||||
matches: &getopts::Matches,
|
||||
sess: &Session,
|
||||
cstore: &dyn CrateStore,
|
||||
cstore: &CStore,
|
||||
input: &Input,
|
||||
odir: &Option<PathBuf>,
|
||||
ofile: &Option<PathBuf>)
|
||||
@ -990,7 +989,7 @@ pub fn enable_save_analysis(control: &mut CompileController) {
|
||||
|
||||
impl RustcDefaultCalls {
|
||||
pub fn list_metadata(sess: &Session,
|
||||
cstore: &dyn CrateStore,
|
||||
cstore: &CStore,
|
||||
matches: &getopts::Matches,
|
||||
input: &Input)
|
||||
-> Compilation {
|
||||
@ -1002,7 +1001,7 @@ impl RustcDefaultCalls {
|
||||
let mut v = Vec::new();
|
||||
locator::list_file_metadata(&sess.target.target,
|
||||
path,
|
||||
cstore.metadata_loader(),
|
||||
&*cstore.metadata_loader,
|
||||
&mut v)
|
||||
.unwrap();
|
||||
println!("{}", String::from_utf8(v).unwrap());
|
||||
|
@ -20,11 +20,11 @@ use {abort_on_err, driver};
|
||||
use rustc::ty::{self, TyCtxt, Resolutions, AllArenas};
|
||||
use rustc::cfg;
|
||||
use rustc::cfg::graphviz::LabelledCFG;
|
||||
use rustc::middle::cstore::CrateStoreDyn;
|
||||
use rustc::session::Session;
|
||||
use rustc::session::config::{Input, OutputFilenames};
|
||||
use rustc_borrowck as borrowck;
|
||||
use rustc_borrowck::graphviz as borrowck_dot;
|
||||
use rustc_metadata::cstore::CStore;
|
||||
|
||||
use rustc_mir::util::{write_mir_pretty, write_mir_graphviz};
|
||||
|
||||
@ -199,7 +199,7 @@ impl PpSourceMode {
|
||||
}
|
||||
fn call_with_pp_support_hir<'tcx, A, F>(&self,
|
||||
sess: &'tcx Session,
|
||||
cstore: &'tcx CrateStoreDyn,
|
||||
cstore: &'tcx CStore,
|
||||
hir_map: &hir_map::Map<'tcx>,
|
||||
analysis: &ty::CrateAnalysis,
|
||||
resolutions: &Resolutions,
|
||||
@ -918,7 +918,7 @@ pub fn print_after_parsing(sess: &Session,
|
||||
}
|
||||
|
||||
pub fn print_after_hir_lowering<'tcx, 'a: 'tcx>(sess: &'a Session,
|
||||
cstore: &'tcx CrateStoreDyn,
|
||||
cstore: &'tcx CStore,
|
||||
hir_map: &hir_map::Map<'tcx>,
|
||||
analysis: &ty::CrateAnalysis,
|
||||
resolutions: &Resolutions,
|
||||
@ -1074,7 +1074,7 @@ pub fn print_after_hir_lowering<'tcx, 'a: 'tcx>(sess: &'a Session,
|
||||
// with a different callback than the standard driver, so that isn't easy.
|
||||
// Instead, we call that function ourselves.
|
||||
fn print_with_analysis<'tcx, 'a: 'tcx>(sess: &'a Session,
|
||||
cstore: &'a CrateStoreDyn,
|
||||
cstore: &'a CStore,
|
||||
hir_map: &hir_map::Map<'tcx>,
|
||||
analysis: &ty::CrateAnalysis,
|
||||
resolutions: &Resolutions,
|
||||
|
@ -20,3 +20,4 @@ serialize = { path = "../libserialize" }
|
||||
syntax = { path = "../libsyntax" }
|
||||
syntax_ext = { path = "../libsyntax_ext" }
|
||||
syntax_pos = { path = "../libsyntax_pos" }
|
||||
rustc_metadata_utils = { path = "../librustc_metadata_utils" }
|
||||
|
@ -24,12 +24,13 @@ use rustc::session::{Session, CrateDisambiguator};
|
||||
use rustc::session::config::{Sanitizer, self};
|
||||
use rustc_target::spec::{PanicStrategy, TargetTriple};
|
||||
use rustc::session::search_paths::PathKind;
|
||||
use rustc::middle;
|
||||
use rustc::middle::cstore::{validate_crate_name, ExternCrate, ExternCrateSource};
|
||||
use rustc::middle::cstore::{ExternCrate, ExternCrateSource};
|
||||
use rustc::util::common::record_time;
|
||||
use rustc::util::nodemap::FxHashSet;
|
||||
use rustc::hir::map::Definitions;
|
||||
|
||||
use rustc_metadata_utils::validate_crate_name;
|
||||
|
||||
use std::ops::Deref;
|
||||
use std::path::PathBuf;
|
||||
use std::{cmp, fs};
|
||||
@ -1056,8 +1057,8 @@ impl<'a> CrateLoader<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
|
||||
fn postprocess(&mut self, krate: &ast::Crate) {
|
||||
impl<'a> CrateLoader<'a> {
|
||||
pub fn postprocess(&mut self, krate: &ast::Crate) {
|
||||
// inject the sanitizer runtime before the allocator runtime because all
|
||||
// sanitizers force the use of the `alloc_system` allocator
|
||||
self.inject_sanitizer_runtime();
|
||||
@ -1070,7 +1071,9 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
fn process_extern_crate(&mut self, item: &ast::Item, definitions: &Definitions) -> CrateNum {
|
||||
pub fn process_extern_crate(
|
||||
&mut self, item: &ast::Item, definitions: &Definitions,
|
||||
) -> CrateNum {
|
||||
match item.node {
|
||||
ast::ItemKind::ExternCrate(orig_name) => {
|
||||
debug!("resolving extern crate stmt. ident: {} orig_name: {:?}",
|
||||
@ -1113,7 +1116,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
fn process_path_extern(
|
||||
pub fn process_path_extern(
|
||||
&mut self,
|
||||
name: Symbol,
|
||||
span: Span,
|
||||
@ -1137,7 +1140,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
|
||||
cnum
|
||||
}
|
||||
|
||||
fn process_use_extern(
|
||||
pub fn process_use_extern(
|
||||
&mut self,
|
||||
name: Symbol,
|
||||
span: Span,
|
||||
|
@ -93,6 +93,11 @@ pub struct CStore {
|
||||
pub metadata_loader: Box<dyn MetadataLoader + Sync>,
|
||||
}
|
||||
|
||||
pub enum LoadedMacro {
|
||||
MacroDef(ast::Item),
|
||||
ProcMacro(Lrc<SyntaxExtension>),
|
||||
}
|
||||
|
||||
impl CStore {
|
||||
pub fn new(metadata_loader: Box<dyn MetadataLoader + Sync>) -> CStore {
|
||||
CStore {
|
||||
|
@ -8,7 +8,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use cstore;
|
||||
use cstore::{self, LoadedMacro};
|
||||
use encoder;
|
||||
use link_args;
|
||||
use native_libs;
|
||||
@ -17,8 +17,8 @@ use schema;
|
||||
|
||||
use rustc::ty::query::QueryConfig;
|
||||
use rustc::middle::cstore::{CrateStore, DepKind,
|
||||
MetadataLoader, LinkMeta,
|
||||
LoadedMacro, EncodedMetadata, NativeLibraryKind};
|
||||
LinkMeta,
|
||||
EncodedMetadata, NativeLibraryKind};
|
||||
use rustc::middle::exported_symbols::ExportedSymbol;
|
||||
use rustc::middle::stability::DeprecationEntry;
|
||||
use rustc::hir::def;
|
||||
@ -411,36 +411,8 @@ pub fn provide<'tcx>(providers: &mut Providers<'tcx>) {
|
||||
};
|
||||
}
|
||||
|
||||
impl CrateStore for cstore::CStore {
|
||||
fn crate_data_as_rc_any(&self, krate: CrateNum) -> Lrc<dyn Any> {
|
||||
self.get_crate_data(krate)
|
||||
}
|
||||
|
||||
fn metadata_loader(&self) -> &dyn MetadataLoader {
|
||||
&*self.metadata_loader
|
||||
}
|
||||
|
||||
fn visibility_untracked(&self, def: DefId) -> ty::Visibility {
|
||||
self.get_crate_data(def.krate).get_visibility(def.index)
|
||||
}
|
||||
|
||||
fn item_generics_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::Generics {
|
||||
self.get_crate_data(def.krate).get_generics(def.index, sess)
|
||||
}
|
||||
|
||||
fn associated_item_cloned_untracked(&self, def: DefId) -> ty::AssociatedItem
|
||||
{
|
||||
self.get_crate_data(def.krate).get_associated_item(def.index)
|
||||
}
|
||||
|
||||
fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind
|
||||
{
|
||||
let data = self.get_crate_data(cnum);
|
||||
let r = *data.dep_kind.lock();
|
||||
r
|
||||
}
|
||||
|
||||
fn export_macros_untracked(&self, cnum: CrateNum) {
|
||||
impl cstore::CStore {
|
||||
pub fn export_macros_untracked(&self, cnum: CrateNum) {
|
||||
let data = self.get_crate_data(cnum);
|
||||
let mut dep_kind = data.dep_kind.lock();
|
||||
if *dep_kind == DepKind::UnexportedMacrosOnly {
|
||||
@ -448,69 +420,28 @@ impl CrateStore for cstore::CStore {
|
||||
}
|
||||
}
|
||||
|
||||
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol
|
||||
{
|
||||
self.get_crate_data(cnum).name
|
||||
pub fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind {
|
||||
let data = self.get_crate_data(cnum);
|
||||
let r = *data.dep_kind.lock();
|
||||
r
|
||||
}
|
||||
|
||||
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator
|
||||
{
|
||||
self.get_crate_data(cnum).root.disambiguator
|
||||
}
|
||||
|
||||
fn crate_hash_untracked(&self, cnum: CrateNum) -> hir::svh::Svh
|
||||
{
|
||||
self.get_crate_data(cnum).root.hash
|
||||
}
|
||||
|
||||
fn crate_edition_untracked(&self, cnum: CrateNum) -> Edition
|
||||
{
|
||||
pub fn crate_edition_untracked(&self, cnum: CrateNum) -> Edition {
|
||||
self.get_crate_data(cnum).root.edition
|
||||
}
|
||||
|
||||
/// Returns the `DefKey` for a given `DefId`. This indicates the
|
||||
/// parent `DefId` as well as some idea of what kind of data the
|
||||
/// `DefId` refers to.
|
||||
fn def_key(&self, def: DefId) -> DefKey {
|
||||
// Note: loading the def-key (or def-path) for a def-id is not
|
||||
// a *read* of its metadata. This is because the def-id is
|
||||
// really just an interned shorthand for a def-path, which is the
|
||||
// canonical name for an item.
|
||||
//
|
||||
// self.dep_graph.read(DepNode::MetaData(def));
|
||||
self.get_crate_data(def.krate).def_key(def.index)
|
||||
}
|
||||
|
||||
fn def_path(&self, def: DefId) -> DefPath {
|
||||
// See `Note` above in `def_key()` for why this read is
|
||||
// commented out:
|
||||
//
|
||||
// self.dep_graph.read(DepNode::MetaData(def));
|
||||
self.get_crate_data(def.krate).def_path(def.index)
|
||||
}
|
||||
|
||||
fn def_path_hash(&self, def: DefId) -> DefPathHash {
|
||||
self.get_crate_data(def.krate).def_path_hash(def.index)
|
||||
}
|
||||
|
||||
fn def_path_table(&self, cnum: CrateNum) -> Lrc<DefPathTable> {
|
||||
self.get_crate_data(cnum).def_path_table.clone()
|
||||
}
|
||||
|
||||
fn struct_field_names_untracked(&self, def: DefId) -> Vec<ast::Name>
|
||||
{
|
||||
pub fn struct_field_names_untracked(&self, def: DefId) -> Vec<ast::Name> {
|
||||
self.get_crate_data(def.krate).get_struct_field_names(def.index)
|
||||
}
|
||||
|
||||
fn item_children_untracked(&self, def_id: DefId, sess: &Session) -> Vec<def::Export>
|
||||
{
|
||||
pub fn item_children_untracked(&self, def_id: DefId, sess: &Session) -> Vec<def::Export> {
|
||||
let mut result = vec![];
|
||||
self.get_crate_data(def_id.krate)
|
||||
.each_child_of_item(def_id.index, |child| result.push(child), sess);
|
||||
result
|
||||
}
|
||||
|
||||
fn load_macro_untracked(&self, id: DefId, sess: &Session) -> LoadedMacro {
|
||||
pub fn load_macro_untracked(&self, id: DefId, sess: &Session) -> LoadedMacro {
|
||||
let data = self.get_crate_data(id.krate);
|
||||
if let Some(ref proc_macros) = data.proc_macros {
|
||||
return LoadedMacro::ProcMacro(proc_macros[id.index.to_proc_macro_index()].1.clone());
|
||||
@ -559,6 +490,64 @@ impl CrateStore for cstore::CStore {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn associated_item_cloned_untracked(&self, def: DefId) -> ty::AssociatedItem {
|
||||
self.get_crate_data(def.krate).get_associated_item(def.index)
|
||||
}
|
||||
}
|
||||
|
||||
impl CrateStore for cstore::CStore {
|
||||
fn crate_data_as_rc_any(&self, krate: CrateNum) -> Lrc<dyn Any> {
|
||||
self.get_crate_data(krate)
|
||||
}
|
||||
|
||||
fn item_generics_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::Generics {
|
||||
self.get_crate_data(def.krate).get_generics(def.index, sess)
|
||||
}
|
||||
|
||||
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol
|
||||
{
|
||||
self.get_crate_data(cnum).name
|
||||
}
|
||||
|
||||
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator
|
||||
{
|
||||
self.get_crate_data(cnum).root.disambiguator
|
||||
}
|
||||
|
||||
fn crate_hash_untracked(&self, cnum: CrateNum) -> hir::svh::Svh
|
||||
{
|
||||
self.get_crate_data(cnum).root.hash
|
||||
}
|
||||
|
||||
/// Returns the `DefKey` for a given `DefId`. This indicates the
|
||||
/// parent `DefId` as well as some idea of what kind of data the
|
||||
/// `DefId` refers to.
|
||||
fn def_key(&self, def: DefId) -> DefKey {
|
||||
// Note: loading the def-key (or def-path) for a def-id is not
|
||||
// a *read* of its metadata. This is because the def-id is
|
||||
// really just an interned shorthand for a def-path, which is the
|
||||
// canonical name for an item.
|
||||
//
|
||||
// self.dep_graph.read(DepNode::MetaData(def));
|
||||
self.get_crate_data(def.krate).def_key(def.index)
|
||||
}
|
||||
|
||||
fn def_path(&self, def: DefId) -> DefPath {
|
||||
// See `Note` above in `def_key()` for why this read is
|
||||
// commented out:
|
||||
//
|
||||
// self.dep_graph.read(DepNode::MetaData(def));
|
||||
self.get_crate_data(def.krate).def_path(def.index)
|
||||
}
|
||||
|
||||
fn def_path_hash(&self, def: DefId) -> DefPathHash {
|
||||
self.get_crate_data(def.krate).def_path_hash(def.index)
|
||||
}
|
||||
|
||||
fn def_path_table(&self, cnum: CrateNum) -> Lrc<DefPathTable> {
|
||||
self.get_crate_data(cnum).def_path_table.clone()
|
||||
}
|
||||
|
||||
fn crates_untracked(&self) -> Vec<CrateNum>
|
||||
{
|
||||
let mut result = vec![];
|
||||
|
@ -37,6 +37,7 @@ extern crate serialize as rustc_serialize; // used by deriving
|
||||
extern crate rustc_errors as errors;
|
||||
extern crate syntax_ext;
|
||||
extern crate proc_macro;
|
||||
extern crate rustc_metadata_utils;
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc;
|
||||
|
14
src/librustc_metadata_utils/Cargo.toml
Normal file
14
src/librustc_metadata_utils/Cargo.toml
Normal file
@ -0,0 +1,14 @@
|
||||
[package]
|
||||
authors = ["The Rust Project Developers"]
|
||||
name = "rustc_metadata_utils"
|
||||
version = "0.0.0"
|
||||
|
||||
[lib]
|
||||
name = "rustc_metadata_utils"
|
||||
path = "lib.rs"
|
||||
crate-type = ["dylib"]
|
||||
|
||||
[dependencies]
|
||||
rustc = { path = "../librustc" }
|
||||
syntax = { path = "../libsyntax" }
|
||||
syntax_pos = { path = "../libsyntax_pos" }
|
42
src/librustc_metadata_utils/lib.rs
Normal file
42
src/librustc_metadata_utils/lib.rs
Normal file
@ -0,0 +1,42 @@
|
||||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc;
|
||||
extern crate syntax_pos;
|
||||
|
||||
use rustc::session::Session;
|
||||
use syntax_pos::Span;
|
||||
|
||||
pub fn validate_crate_name(sess: Option<&Session>, s: &str, sp: Option<Span>) {
|
||||
let mut err_count = 0;
|
||||
{
|
||||
let mut say = |s: &str| {
|
||||
match (sp, sess) {
|
||||
(_, None) => bug!("{}", s),
|
||||
(Some(sp), Some(sess)) => sess.span_err(sp, s),
|
||||
(None, Some(sess)) => sess.err(s),
|
||||
}
|
||||
err_count += 1;
|
||||
};
|
||||
if s.is_empty() {
|
||||
say("crate name must not be empty");
|
||||
}
|
||||
for c in s.chars() {
|
||||
if c.is_alphanumeric() { continue }
|
||||
if c == '_' { continue }
|
||||
say(&format!("invalid character `{}` in crate name: `{}`", c, s));
|
||||
}
|
||||
}
|
||||
|
||||
if err_count > 0 {
|
||||
sess.unwrap().abort_if_errors();
|
||||
}
|
||||
}
|
@ -17,3 +17,4 @@ arena = { path = "../libarena" }
|
||||
rustc_errors = { path = "../librustc_errors" }
|
||||
syntax_pos = { path = "../libsyntax_pos" }
|
||||
rustc_data_structures = { path = "../librustc_data_structures" }
|
||||
rustc_metadata = { path = "../librustc_metadata" }
|
||||
|
@ -21,10 +21,11 @@ use {PerNS, Resolver, ResolverArenas};
|
||||
use Namespace::{self, TypeNS, ValueNS, MacroNS};
|
||||
use {resolve_error, resolve_struct_error, ResolutionError};
|
||||
|
||||
use rustc::middle::cstore::LoadedMacro;
|
||||
use rustc::hir::def::*;
|
||||
use rustc::hir::def_id::{BUILTIN_MACROS_CRATE, CRATE_DEF_INDEX, LOCAL_CRATE, DefId};
|
||||
use rustc::ty;
|
||||
use rustc::middle::cstore::CrateStore;
|
||||
use rustc_metadata::cstore::LoadedMacro;
|
||||
|
||||
use std::cell::Cell;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
@ -86,7 +87,7 @@ struct LegacyMacroImports {
|
||||
imports: Vec<(Name, Span)>,
|
||||
}
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
impl<'a, 'cl> Resolver<'a, 'cl> {
|
||||
/// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
|
||||
/// otherwise, reports an error.
|
||||
pub fn define<T>(&mut self, parent: Module<'a>, ident: Ident, ns: Namespace, def: T)
|
||||
@ -776,13 +777,13 @@ impl<'a> Resolver<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct BuildReducedGraphVisitor<'a, 'b: 'a> {
|
||||
pub resolver: &'a mut Resolver<'b>,
|
||||
pub struct BuildReducedGraphVisitor<'a, 'b: 'a, 'c: 'b> {
|
||||
pub resolver: &'a mut Resolver<'b, 'c>,
|
||||
pub legacy_scope: LegacyScope<'b>,
|
||||
pub expansion: Mark,
|
||||
}
|
||||
|
||||
impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
impl<'a, 'b, 'cl> BuildReducedGraphVisitor<'a, 'b, 'cl> {
|
||||
fn visit_invoc(&mut self, id: ast::NodeId) -> &'b InvocationData<'b> {
|
||||
let mark = id.placeholder_to_mark();
|
||||
self.resolver.current_module.unresolved_invocations.borrow_mut().insert(mark);
|
||||
@ -806,7 +807,7 @@ macro_rules! method {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Visitor<'a> for BuildReducedGraphVisitor<'a, 'b> {
|
||||
impl<'a, 'b, 'cl> Visitor<'a> for BuildReducedGraphVisitor<'a, 'b, 'cl> {
|
||||
method!(visit_impl_item: ast::ImplItem, ast::ImplItemKind::Macro, walk_impl_item);
|
||||
method!(visit_expr: ast::Expr, ast::ExprKind::Mac, walk_expr);
|
||||
method!(visit_pat: ast::Pat, ast::PatKind::Mac, walk_pat);
|
||||
|
@ -31,8 +31,8 @@ use syntax::visit::{self, Visitor};
|
||||
use syntax_pos::{Span, MultiSpan, DUMMY_SP};
|
||||
|
||||
|
||||
struct UnusedImportCheckVisitor<'a, 'b: 'a> {
|
||||
resolver: &'a mut Resolver<'b>,
|
||||
struct UnusedImportCheckVisitor<'a, 'b: 'a, 'd: 'b> {
|
||||
resolver: &'a mut Resolver<'b, 'd>,
|
||||
/// All the (so far) unused imports, grouped path list
|
||||
unused_imports: NodeMap<NodeMap<Span>>,
|
||||
base_id: ast::NodeId,
|
||||
@ -40,21 +40,21 @@ struct UnusedImportCheckVisitor<'a, 'b: 'a> {
|
||||
}
|
||||
|
||||
// Deref and DerefMut impls allow treating UnusedImportCheckVisitor as Resolver.
|
||||
impl<'a, 'b> Deref for UnusedImportCheckVisitor<'a, 'b> {
|
||||
type Target = Resolver<'b>;
|
||||
impl<'a, 'b, 'd> Deref for UnusedImportCheckVisitor<'a, 'b, 'd> {
|
||||
type Target = Resolver<'b, 'd>;
|
||||
|
||||
fn deref<'c>(&'c self) -> &'c Resolver<'b> {
|
||||
fn deref<'c>(&'c self) -> &'c Resolver<'b, 'd> {
|
||||
&*self.resolver
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> DerefMut for UnusedImportCheckVisitor<'a, 'b> {
|
||||
fn deref_mut<'c>(&'c mut self) -> &'c mut Resolver<'b> {
|
||||
impl<'a, 'b, 'd> DerefMut for UnusedImportCheckVisitor<'a, 'b, 'd> {
|
||||
fn deref_mut<'c>(&'c mut self) -> &'c mut Resolver<'b, 'd> {
|
||||
&mut *self.resolver
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> UnusedImportCheckVisitor<'a, 'b> {
|
||||
impl<'a, 'b, 'd> UnusedImportCheckVisitor<'a, 'b, 'd> {
|
||||
// We have information about whether `use` (import) directives are actually
|
||||
// used now. If an import is not used at all, we signal a lint error.
|
||||
fn check_import(&mut self, item_id: ast::NodeId, id: ast::NodeId, span: Span) {
|
||||
@ -77,7 +77,7 @@ impl<'a, 'b> UnusedImportCheckVisitor<'a, 'b> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Visitor<'a> for UnusedImportCheckVisitor<'a, 'b> {
|
||||
impl<'a, 'b, 'cl> Visitor<'a> for UnusedImportCheckVisitor<'a, 'b, 'cl> {
|
||||
fn visit_item(&mut self, item: &'a ast::Item) {
|
||||
self.item_span = item.span;
|
||||
|
||||
|
@ -26,6 +26,7 @@ extern crate arena;
|
||||
#[macro_use]
|
||||
extern crate rustc;
|
||||
extern crate rustc_data_structures;
|
||||
extern crate rustc_metadata;
|
||||
|
||||
pub use rustc::hir::def::{Namespace, PerNS};
|
||||
|
||||
@ -34,7 +35,7 @@ use self::RibKind::*;
|
||||
|
||||
use rustc::hir::map::{Definitions, DefCollector};
|
||||
use rustc::hir::{self, PrimTy, TyBool, TyChar, TyFloat, TyInt, TyUint, TyStr};
|
||||
use rustc::middle::cstore::{CrateStore, CrateLoader};
|
||||
use rustc::middle::cstore::CrateStore;
|
||||
use rustc::session::Session;
|
||||
use rustc::lint;
|
||||
use rustc::hir::def::*;
|
||||
@ -44,6 +45,9 @@ use rustc::ty;
|
||||
use rustc::hir::{Freevar, FreevarMap, TraitCandidate, TraitMap, GlobMap};
|
||||
use rustc::util::nodemap::{NodeMap, NodeSet, FxHashMap, FxHashSet, DefIdMap};
|
||||
|
||||
use rustc_metadata::creader::CrateLoader;
|
||||
use rustc_metadata::cstore::CStore;
|
||||
|
||||
use syntax::codemap::CodeMap;
|
||||
use syntax::ext::hygiene::{Mark, Transparency, SyntaxContext};
|
||||
use syntax::ast::{self, Name, NodeId, Ident, FloatTy, IntTy, UintTy};
|
||||
@ -687,7 +691,7 @@ impl<'tcx> Visitor<'tcx> for UsePlacementFinder {
|
||||
}
|
||||
|
||||
/// This thing walks the whole crate in DFS manner, visiting each item, resolving names as it goes.
|
||||
impl<'a, 'tcx> Visitor<'tcx> for Resolver<'a> {
|
||||
impl<'a, 'tcx, 'cl> Visitor<'tcx> for Resolver<'a, 'cl> {
|
||||
fn visit_item(&mut self, item: &'tcx Item) {
|
||||
self.resolve_item(item);
|
||||
}
|
||||
@ -1176,7 +1180,7 @@ impl<'a> NameBinding<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_macro(&self, resolver: &mut Resolver<'a>) -> Lrc<SyntaxExtension> {
|
||||
fn get_macro<'b: 'a>(&self, resolver: &mut Resolver<'a, 'b>) -> Lrc<SyntaxExtension> {
|
||||
resolver.get_macro(self.def_ignoring_ambiguity())
|
||||
}
|
||||
|
||||
@ -1291,9 +1295,9 @@ impl PrimitiveTypeTable {
|
||||
/// The main resolver class.
|
||||
///
|
||||
/// This is the visitor that walks the whole crate.
|
||||
pub struct Resolver<'a> {
|
||||
pub struct Resolver<'a, 'b: 'a> {
|
||||
session: &'a Session,
|
||||
cstore: &'a dyn CrateStore,
|
||||
cstore: &'a CStore,
|
||||
|
||||
pub definitions: Definitions,
|
||||
|
||||
@ -1389,7 +1393,7 @@ pub struct Resolver<'a> {
|
||||
/// true if `#![feature(use_extern_macros)]`
|
||||
use_extern_macros: bool,
|
||||
|
||||
crate_loader: &'a mut dyn CrateLoader,
|
||||
crate_loader: &'a mut CrateLoader<'b>,
|
||||
macro_names: FxHashSet<Ident>,
|
||||
macro_prelude: FxHashMap<Name, &'a NameBinding<'a>>,
|
||||
pub all_macros: FxHashMap<Name, Def>,
|
||||
@ -1473,7 +1477,7 @@ impl<'a> ResolverArenas<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b: 'a> ty::DefIdTree for &'a Resolver<'b> {
|
||||
impl<'a, 'b: 'a, 'cl: 'b> ty::DefIdTree for &'a Resolver<'b, 'cl> {
|
||||
fn parent(self, id: DefId) -> Option<DefId> {
|
||||
match id.krate {
|
||||
LOCAL_CRATE => self.definitions.def_key(id.index).parent,
|
||||
@ -1484,7 +1488,7 @@ impl<'a, 'b: 'a> ty::DefIdTree for &'a Resolver<'b> {
|
||||
|
||||
/// This interface is used through the AST→HIR step, to embed full paths into the HIR. After that
|
||||
/// the resolver is no longer needed as all the relevant information is inline.
|
||||
impl<'a> hir::lowering::Resolver for Resolver<'a> {
|
||||
impl<'a, 'cl> hir::lowering::Resolver for Resolver<'a, 'cl> {
|
||||
fn resolve_hir_path(&mut self, path: &mut hir::Path, is_value: bool) {
|
||||
self.resolve_hir_path_cb(path, is_value,
|
||||
|resolver, span, error| resolve_error(resolver, span, error))
|
||||
@ -1537,7 +1541,7 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
|
||||
/// Rustdoc uses this to resolve things in a recoverable way. ResolutionError<'a>
|
||||
/// isn't something that can be returned because it can't be made to live that long,
|
||||
/// and also it's a private type. Fortunately rustdoc doesn't need to know the error,
|
||||
@ -1603,15 +1607,15 @@ impl<'a> Resolver<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
|
||||
pub fn new(session: &'a Session,
|
||||
cstore: &'a dyn CrateStore,
|
||||
cstore: &'a CStore,
|
||||
krate: &Crate,
|
||||
crate_name: &str,
|
||||
make_glob_map: MakeGlobMap,
|
||||
crate_loader: &'a mut dyn CrateLoader,
|
||||
crate_loader: &'a mut CrateLoader<'crateloader>,
|
||||
arenas: &'a ResolverArenas<'a>)
|
||||
-> Resolver<'a> {
|
||||
-> Resolver<'a, 'crateloader> {
|
||||
let root_def_id = DefId::local(CRATE_DEF_INDEX);
|
||||
let root_module_kind = ModuleKind::Def(Def::Mod(root_def_id), keywords::Invalid.name());
|
||||
let graph_root = arenas.alloc_module(ModuleData {
|
||||
|
@ -18,6 +18,7 @@ use rustc::hir::def_id::{DefId, BUILTIN_MACROS_CRATE, CRATE_DEF_INDEX, DefIndex,
|
||||
use rustc::hir::def::{Def, Export};
|
||||
use rustc::hir::map::{self, DefCollector};
|
||||
use rustc::{ty, lint};
|
||||
use rustc::middle::cstore::CrateStore;
|
||||
use syntax::ast::{self, Name, Ident};
|
||||
use syntax::attr::{self, HasAttrs};
|
||||
use syntax::errors::DiagnosticBuilder;
|
||||
@ -117,7 +118,7 @@ impl<'a> MacroBinding<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> base::Resolver for Resolver<'a> {
|
||||
impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
|
||||
fn next_node_id(&mut self) -> ast::NodeId {
|
||||
self.session.next_node_id()
|
||||
}
|
||||
@ -135,9 +136,11 @@ impl<'a> base::Resolver for Resolver<'a> {
|
||||
}
|
||||
|
||||
fn eliminate_crate_var(&mut self, item: P<ast::Item>) -> P<ast::Item> {
|
||||
struct EliminateCrateVar<'b, 'a: 'b>(&'b mut Resolver<'a>, Span);
|
||||
struct EliminateCrateVar<'b, 'a: 'b, 'crateloader: 'a>(
|
||||
&'b mut Resolver<'a, 'crateloader>, Span
|
||||
);
|
||||
|
||||
impl<'a, 'b> Folder for EliminateCrateVar<'a, 'b> {
|
||||
impl<'a, 'b, 'crateloader> Folder for EliminateCrateVar<'a, 'b, 'crateloader> {
|
||||
fn fold_path(&mut self, path: ast::Path) -> ast::Path {
|
||||
match self.fold_qpath(None, path) {
|
||||
(None, path) => path,
|
||||
@ -387,7 +390,7 @@ impl<'a> base::Resolver for Resolver<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
impl<'a, 'cl> Resolver<'a, 'cl> {
|
||||
fn report_proc_macro_stub(&self, span: Span) {
|
||||
self.session.span_err(span,
|
||||
"can't use a procedural macro from the same crate that defines it");
|
||||
|
@ -123,7 +123,7 @@ impl<'a> NameResolution<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
|
||||
fn resolution(&self, module: Module<'a>, ident: Ident, ns: Namespace)
|
||||
-> &'a RefCell<NameResolution<'a>> {
|
||||
*module.resolutions.borrow_mut().entry((ident.modern(), ns))
|
||||
@ -402,7 +402,7 @@ impl<'a> Resolver<'a> {
|
||||
// If the resolution becomes a success, define it in the module's glob importers.
|
||||
fn update_resolution<T, F>(&mut self, module: Module<'a>, ident: Ident, ns: Namespace, f: F)
|
||||
-> T
|
||||
where F: FnOnce(&mut Resolver<'a>, &mut NameResolution<'a>) -> T
|
||||
where F: FnOnce(&mut Resolver<'a, 'crateloader>, &mut NameResolution<'a>) -> T
|
||||
{
|
||||
// Ensure that `resolution` isn't borrowed when defining in the module's glob importers,
|
||||
// during which the resolution might end up getting re-defined via a glob cycle.
|
||||
@ -453,30 +453,30 @@ impl<'a> Resolver<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ImportResolver<'a, 'b: 'a> {
|
||||
pub resolver: &'a mut Resolver<'b>,
|
||||
pub struct ImportResolver<'a, 'b: 'a, 'c: 'a + 'b> {
|
||||
pub resolver: &'a mut Resolver<'b, 'c>,
|
||||
}
|
||||
|
||||
impl<'a, 'b: 'a> ::std::ops::Deref for ImportResolver<'a, 'b> {
|
||||
type Target = Resolver<'b>;
|
||||
fn deref(&self) -> &Resolver<'b> {
|
||||
impl<'a, 'b: 'a, 'c: 'a + 'b> ::std::ops::Deref for ImportResolver<'a, 'b, 'c> {
|
||||
type Target = Resolver<'b, 'c>;
|
||||
fn deref(&self) -> &Resolver<'b, 'c> {
|
||||
self.resolver
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b: 'a> ::std::ops::DerefMut for ImportResolver<'a, 'b> {
|
||||
fn deref_mut(&mut self) -> &mut Resolver<'b> {
|
||||
impl<'a, 'b: 'a, 'c: 'a + 'b> ::std::ops::DerefMut for ImportResolver<'a, 'b, 'c> {
|
||||
fn deref_mut(&mut self) -> &mut Resolver<'b, 'c> {
|
||||
self.resolver
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b: 'a> ty::DefIdTree for &'a ImportResolver<'a, 'b> {
|
||||
impl<'a, 'b: 'a, 'c: 'a + 'b> ty::DefIdTree for &'a ImportResolver<'a, 'b, 'c> {
|
||||
fn parent(self, id: DefId) -> Option<DefId> {
|
||||
self.resolver.parent(id)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b:'a> ImportResolver<'a, 'b> {
|
||||
impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
|
||||
// Import resolution
|
||||
//
|
||||
// This is a fixed-point algorithm. We resolve imports until our efforts
|
||||
|
@ -13,6 +13,7 @@ use rustc::traits::{self, auto_trait as auto};
|
||||
use rustc::ty::{self, ToPredicate, TypeFoldable};
|
||||
use rustc::ty::subst::Subst;
|
||||
use rustc::infer::InferOk;
|
||||
use rustc::middle::cstore::CrateStore;
|
||||
use std::fmt::Debug;
|
||||
use syntax_pos::DUMMY_SP;
|
||||
|
||||
@ -20,13 +21,13 @@ use core::DocAccessLevels;
|
||||
|
||||
use super::*;
|
||||
|
||||
pub struct AutoTraitFinder<'a, 'tcx: 'a, 'rcx: 'a> {
|
||||
pub cx: &'a core::DocContext<'a, 'tcx, 'rcx>,
|
||||
pub struct AutoTraitFinder<'a, 'tcx: 'a, 'rcx: 'a, 'cstore: 'rcx> {
|
||||
pub cx: &'a core::DocContext<'a, 'tcx, 'rcx, 'cstore>,
|
||||
pub f: auto::AutoTraitFinder<'a, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, 'rcx> AutoTraitFinder<'a, 'tcx, 'rcx> {
|
||||
pub fn new(cx: &'a core::DocContext<'a, 'tcx, 'rcx>) -> Self {
|
||||
impl<'a, 'tcx, 'rcx, 'cstore> AutoTraitFinder<'a, 'tcx, 'rcx, 'cstore> {
|
||||
pub fn new(cx: &'a core::DocContext<'a, 'tcx, 'rcx, 'cstore>) -> Self {
|
||||
let f = auto::AutoTraitFinder::new(&cx.tcx);
|
||||
|
||||
AutoTraitFinder { cx, f }
|
||||
|
@ -19,7 +19,7 @@ use syntax_pos::Span;
|
||||
use rustc::hir;
|
||||
use rustc::hir::def::{Def, CtorKind};
|
||||
use rustc::hir::def_id::DefId;
|
||||
use rustc::middle::cstore::LoadedMacro;
|
||||
use rustc_metadata::cstore::LoadedMacro;
|
||||
use rustc::ty;
|
||||
use rustc::util::nodemap::FxHashSet;
|
||||
|
||||
|
@ -145,7 +145,7 @@ pub struct Crate {
|
||||
pub masked_crates: FxHashSet<CrateNum>,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, 'rcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx, 'rcx> {
|
||||
impl<'a, 'tcx, 'rcx, 'cstore> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> {
|
||||
fn clean(&self, cx: &DocContext) -> Crate {
|
||||
use ::visit_lib::LibEmbargoVisitor;
|
||||
|
||||
|
@ -13,7 +13,6 @@ use rustc_driver::{self, driver, target_features, abort_on_err};
|
||||
use rustc::session::{self, config};
|
||||
use rustc::hir::def_id::{DefId, CrateNum, LOCAL_CRATE};
|
||||
use rustc::hir::def::Def;
|
||||
use rustc::middle::cstore::CrateStore;
|
||||
use rustc::middle::privacy::AccessLevels;
|
||||
use rustc::ty::{self, TyCtxt, AllArenas};
|
||||
use rustc::hir::map as hir_map;
|
||||
@ -49,13 +48,13 @@ pub use rustc::session::search_paths::SearchPaths;
|
||||
|
||||
pub type ExternalPaths = FxHashMap<DefId, (Vec<String>, clean::TypeKind)>;
|
||||
|
||||
pub struct DocContext<'a, 'tcx: 'a, 'rcx: 'a> {
|
||||
pub struct DocContext<'a, 'tcx: 'a, 'rcx: 'a, 'cstore: 'rcx> {
|
||||
pub tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
pub resolver: &'a RefCell<resolve::Resolver<'rcx>>,
|
||||
pub resolver: &'a RefCell<resolve::Resolver<'rcx, 'cstore>>,
|
||||
/// The stack of module NodeIds up till this point
|
||||
pub mod_ids: RefCell<Vec<NodeId>>,
|
||||
pub crate_name: Option<String>,
|
||||
pub cstore: Rc<dyn CrateStore>,
|
||||
pub cstore: Rc<CStore>,
|
||||
pub populated_all_crate_impls: Cell<bool>,
|
||||
// Note that external items for which `doc(hidden)` applies to are shown as
|
||||
// non-reachable while local items aren't. This is because we're reusing
|
||||
@ -87,7 +86,7 @@ pub struct DocContext<'a, 'tcx: 'a, 'rcx: 'a> {
|
||||
pub all_traits: Vec<DefId>,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, 'rcx> DocContext<'a, 'tcx, 'rcx> {
|
||||
impl<'a, 'tcx, 'rcx, 'cstore> DocContext<'a, 'tcx, 'rcx, 'cstore> {
|
||||
pub fn sess(&self) -> &session::Session {
|
||||
&self.tcx.sess
|
||||
}
|
||||
|
@ -38,10 +38,10 @@ use doctree::*;
|
||||
// also, is there some reason that this doesn't use the 'visit'
|
||||
// framework from syntax?
|
||||
|
||||
pub struct RustdocVisitor<'a, 'tcx: 'a, 'rcx: 'a> {
|
||||
pub struct RustdocVisitor<'a, 'tcx: 'a, 'rcx: 'a, 'cstore: 'rcx> {
|
||||
pub module: Module,
|
||||
pub attrs: hir::HirVec<ast::Attribute>,
|
||||
pub cx: &'a core::DocContext<'a, 'tcx, 'rcx>,
|
||||
pub cx: &'a core::DocContext<'a, 'tcx, 'rcx, 'cstore>,
|
||||
view_item_stack: FxHashSet<ast::NodeId>,
|
||||
inlining: bool,
|
||||
/// Is the current module and all of its parents public?
|
||||
@ -49,8 +49,10 @@ pub struct RustdocVisitor<'a, 'tcx: 'a, 'rcx: 'a> {
|
||||
exact_paths: Option<FxHashMap<DefId, Vec<String>>>,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> {
|
||||
pub fn new(cx: &'a core::DocContext<'a, 'tcx, 'rcx>) -> RustdocVisitor<'a, 'tcx, 'rcx> {
|
||||
impl<'a, 'tcx, 'rcx, 'cstore> RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> {
|
||||
pub fn new(
|
||||
cx: &'a core::DocContext<'a, 'tcx, 'rcx, 'cstore>
|
||||
) -> RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> {
|
||||
// If the root is re-exported, terminate all recursion.
|
||||
let mut stack = FxHashSet();
|
||||
stack.insert(ast::CRATE_NODE_ID);
|
||||
|
@ -22,8 +22,8 @@ use clean::{AttributesExt, NestedAttributesExt};
|
||||
|
||||
/// Similar to `librustc_privacy::EmbargoVisitor`, but also takes
|
||||
/// specific rustdoc annotations into account (i.e. `doc(hidden)`)
|
||||
pub struct LibEmbargoVisitor<'a, 'tcx: 'a, 'rcx: 'a> {
|
||||
cx: &'a ::core::DocContext<'a, 'tcx, 'rcx>,
|
||||
pub struct LibEmbargoVisitor<'a, 'tcx: 'a, 'rcx: 'a, 'cstore: 'rcx> {
|
||||
cx: &'a ::core::DocContext<'a, 'tcx, 'rcx, 'cstore>,
|
||||
// Accessibility levels for reachable nodes
|
||||
access_levels: RefMut<'a, AccessLevels<DefId>>,
|
||||
// Previous accessibility level, None means unreachable
|
||||
@ -32,8 +32,10 @@ pub struct LibEmbargoVisitor<'a, 'tcx: 'a, 'rcx: 'a> {
|
||||
visited_mods: FxHashSet<DefId>,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, 'rcx> LibEmbargoVisitor<'a, 'tcx, 'rcx> {
|
||||
pub fn new(cx: &'a ::core::DocContext<'a, 'tcx, 'rcx>) -> LibEmbargoVisitor<'a, 'tcx, 'rcx> {
|
||||
impl<'a, 'tcx, 'rcx, 'cstore> LibEmbargoVisitor<'a, 'tcx, 'rcx, 'cstore> {
|
||||
pub fn new(
|
||||
cx: &'a ::core::DocContext<'a, 'tcx, 'rcx, 'cstore>
|
||||
) -> LibEmbargoVisitor<'a, 'tcx, 'rcx, 'cstore> {
|
||||
LibEmbargoVisitor {
|
||||
cx,
|
||||
access_levels: cx.access_levels.borrow_mut(),
|
||||
|
@ -21,12 +21,13 @@ extern crate rustc_driver;
|
||||
extern crate rustc_codegen_utils;
|
||||
extern crate syntax;
|
||||
extern crate rustc_errors as errors;
|
||||
extern crate rustc_metadata;
|
||||
|
||||
use rustc::middle::cstore::CrateStore;
|
||||
use rustc::session::Session;
|
||||
use rustc::session::config::{self, Input};
|
||||
use rustc_driver::{driver, CompilerCalls, Compilation};
|
||||
use rustc_codegen_utils::codegen_backend::CodegenBackend;
|
||||
use rustc_metadata::cstore::CStore;
|
||||
use syntax::ast;
|
||||
|
||||
use std::path::PathBuf;
|
||||
@ -51,7 +52,7 @@ impl<'a> CompilerCalls<'a> for TestCalls<'a> {
|
||||
_: &CodegenBackend,
|
||||
_: &getopts::Matches,
|
||||
_: &Session,
|
||||
_: &CrateStore,
|
||||
_: &CStore,
|
||||
_: &Input,
|
||||
_: &Option<PathBuf>,
|
||||
_: &Option<PathBuf>)
|
||||
|
Loading…
Reference in New Issue
Block a user