Add an arena for import directives
This commit is contained in:
parent
064f17c6a3
commit
6b94bc345c
@ -707,9 +707,10 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module_.unresolved_imports
|
let directive =
|
||||||
.borrow_mut()
|
ImportDirective::new(module_path, subclass, span, id, is_public, shadowable);
|
||||||
.push(ImportDirective::new(module_path, subclass, span, id, is_public, shadowable));
|
let directive = self.resolver.arenas.alloc_import_directive(directive);
|
||||||
|
module_.unresolved_imports.borrow_mut().push(directive);
|
||||||
self.unresolved_imports += 1;
|
self.unresolved_imports += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -812,7 +812,7 @@ pub struct ModuleS<'a> {
|
|||||||
extern_crate_id: Option<NodeId>,
|
extern_crate_id: Option<NodeId>,
|
||||||
|
|
||||||
resolutions: RefCell<HashMap<(Name, Namespace), NameResolution<'a>>>,
|
resolutions: RefCell<HashMap<(Name, Namespace), NameResolution<'a>>>,
|
||||||
unresolved_imports: RefCell<Vec<ImportDirective>>,
|
unresolved_imports: RefCell<Vec<&'a ImportDirective>>,
|
||||||
|
|
||||||
// The module children of this node, including normal modules and anonymous modules.
|
// The module children of this node, including normal modules and anonymous modules.
|
||||||
// Anonymous children are pseudo-modules that are implicitly created around items
|
// Anonymous children are pseudo-modules that are implicitly created around items
|
||||||
@ -1167,6 +1167,13 @@ pub struct Resolver<'a, 'tcx: 'a> {
|
|||||||
pub struct ResolverArenas<'a> {
|
pub struct ResolverArenas<'a> {
|
||||||
modules: arena::TypedArena<ModuleS<'a>>,
|
modules: arena::TypedArena<ModuleS<'a>>,
|
||||||
name_bindings: arena::TypedArena<NameBinding<'a>>,
|
name_bindings: arena::TypedArena<NameBinding<'a>>,
|
||||||
|
import_directives: arena::TypedArena<ImportDirective>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> ResolverArenas<'a> {
|
||||||
|
fn alloc_import_directive(&'a self, import_directive: ImportDirective) -> &'a ImportDirective {
|
||||||
|
self.import_directives.alloc(import_directive)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
@ -1234,6 +1241,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
ResolverArenas {
|
ResolverArenas {
|
||||||
modules: arena::TypedArena::new(),
|
modules: arena::TypedArena::new(),
|
||||||
name_bindings: arena::TypedArena::new(),
|
name_bindings: arena::TypedArena::new(),
|
||||||
|
import_directives: arena::TypedArena::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,7 +172,7 @@ impl<'a> NameResolution<'a> {
|
|||||||
struct ImportResolvingError<'a> {
|
struct ImportResolvingError<'a> {
|
||||||
/// Module where the error happened
|
/// Module where the error happened
|
||||||
source_module: Module<'a>,
|
source_module: Module<'a>,
|
||||||
import_directive: ImportDirective,
|
import_directive: &'a ImportDirective,
|
||||||
span: Span,
|
span: Span,
|
||||||
help: String,
|
help: String,
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let path = import_path_to_string(&e.import_directive.module_path,
|
let path = import_path_to_string(&e.import_directive.module_path,
|
||||||
e.import_directive.subclass);
|
&e.import_directive.subclass);
|
||||||
|
|
||||||
resolve_error(self.resolver,
|
resolve_error(self.resolver,
|
||||||
e.span,
|
e.span,
|
||||||
@ -608,7 +608,7 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn import_path_to_string(names: &[Name], subclass: ImportDirectiveSubclass) -> String {
|
fn import_path_to_string(names: &[Name], subclass: &ImportDirectiveSubclass) -> String {
|
||||||
if names.is_empty() {
|
if names.is_empty() {
|
||||||
import_directive_subclass_to_string(subclass)
|
import_directive_subclass_to_string(subclass)
|
||||||
} else {
|
} else {
|
||||||
@ -619,8 +619,8 @@ fn import_path_to_string(names: &[Name], subclass: ImportDirectiveSubclass) -> S
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn import_directive_subclass_to_string(subclass: ImportDirectiveSubclass) -> String {
|
fn import_directive_subclass_to_string(subclass: &ImportDirectiveSubclass) -> String {
|
||||||
match subclass {
|
match *subclass {
|
||||||
SingleImport { source, .. } => source.to_string(),
|
SingleImport { source, .. } => source.to_string(),
|
||||||
GlobImport => "*".to_string(),
|
GlobImport => "*".to_string(),
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user