提交 2e24c741 编写于 作者: J Jeffrey Seyfried

Expand NameBinding to better represent bindings from imports

上级 22e189ed
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
use resolve_imports::ImportResolution; use resolve_imports::ImportResolution;
use Module; use Module;
use Namespace::{self, TypeNS, ValueNS}; use Namespace::{self, TypeNS, ValueNS};
use {NameBinding, DefOrModule}; use {NameBinding, NameBindingKind};
use {names_to_string, module_to_string}; use {names_to_string, module_to_string};
use ParentLink::{ModuleParentLink, BlockParentLink}; use ParentLink::{ModuleParentLink, BlockParentLink};
use Resolver; use Resolver;
...@@ -82,8 +82,8 @@ fn to_name_binding(self) -> NameBinding<'a> { ...@@ -82,8 +82,8 @@ fn to_name_binding(self) -> NameBinding<'a> {
impl<'a> ToNameBinding<'a> for (Def, Span, DefModifiers) { impl<'a> ToNameBinding<'a> for (Def, Span, DefModifiers) {
fn to_name_binding(self) -> NameBinding<'a> { fn to_name_binding(self) -> NameBinding<'a> {
let def = DefOrModule::Def(self.0); let kind = NameBindingKind::Def(self.0);
NameBinding { modifiers: self.2, def_or_module: def, span: Some(self.1) } NameBinding { modifiers: self.2, kind: kind, span: Some(self.1) }
} }
} }
......
...@@ -951,21 +951,26 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { ...@@ -951,21 +951,26 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// We need to track them to prohibit reexports like `pub use PrivEnum::Variant`. // We need to track them to prohibit reexports like `pub use PrivEnum::Variant`.
const PRIVATE_VARIANT = 1 << 2, const PRIVATE_VARIANT = 1 << 2,
const PRELUDE = 1 << 3, const PRELUDE = 1 << 3,
const GLOB_IMPORTED = 1 << 4,
} }
} }
// Records a possibly-private value, type, or module definition. // Records a possibly-private value, type, or module definition.
#[derive(Clone, Debug)] #[derive(Debug)]
pub struct NameBinding<'a> { pub struct NameBinding<'a> {
modifiers: DefModifiers, // see note in ImportResolution about how to use this modifiers: DefModifiers,
def_or_module: DefOrModule<'a>, kind: NameBindingKind<'a>,
span: Option<Span>, span: Option<Span>,
} }
#[derive(Clone, Debug)] #[derive(Debug)]
enum DefOrModule<'a> { enum NameBindingKind<'a> {
Def(Def), Def(Def),
Module(Module<'a>), Module(Module<'a>),
Import {
binding: &'a NameBinding<'a>,
id: NodeId,
},
} }
impl<'a> NameBinding<'a> { impl<'a> NameBinding<'a> {
...@@ -976,20 +981,22 @@ fn create_from_module(module: Module<'a>, span: Option<Span>) -> Self { ...@@ -976,20 +981,22 @@ fn create_from_module(module: Module<'a>, span: Option<Span>) -> Self {
DefModifiers::empty() DefModifiers::empty()
} | DefModifiers::IMPORTABLE; } | DefModifiers::IMPORTABLE;
NameBinding { modifiers: modifiers, def_or_module: DefOrModule::Module(module), span: span } NameBinding { modifiers: modifiers, kind: NameBindingKind::Module(module), span: span }
} }
fn module(&self) -> Option<Module<'a>> { fn module(&self) -> Option<Module<'a>> {
match self.def_or_module { match self.kind {
DefOrModule::Module(ref module) => Some(module), NameBindingKind::Module(module) => Some(module),
DefOrModule::Def(_) => None, NameBindingKind::Def(_) => None,
NameBindingKind::Import { binding, .. } => binding.module(),
} }
} }
fn def(&self) -> Option<Def> { fn def(&self) -> Option<Def> {
match self.def_or_module { match self.kind {
DefOrModule::Def(def) => Some(def), NameBindingKind::Def(def) => Some(def),
DefOrModule::Module(ref module) => module.def, NameBindingKind::Module(module) => module.def,
NameBindingKind::Import { binding, .. } => binding.def(),
} }
} }
...@@ -1009,6 +1016,13 @@ fn def_and_lp(&self) -> (Def, LastPrivate) { ...@@ -1009,6 +1016,13 @@ fn def_and_lp(&self) -> (Def, LastPrivate) {
fn is_extern_crate(&self) -> bool { fn is_extern_crate(&self) -> bool {
self.module().map(|module| module.is_extern_crate).unwrap_or(false) self.module().map(|module| module.is_extern_crate).unwrap_or(false)
} }
fn is_import(&self) -> bool {
match self.kind {
NameBindingKind::Import { .. } => true,
_ => false,
}
}
} }
/// Interns the names of the primitive types. /// Interns the names of the primitive types.
......
...@@ -11,10 +11,9 @@ ...@@ -11,10 +11,9 @@
use self::ImportDirectiveSubclass::*; use self::ImportDirectiveSubclass::*;
use DefModifiers; use DefModifiers;
use DefOrModule;
use Module; use Module;
use Namespace::{self, TypeNS, ValueNS}; use Namespace::{self, TypeNS, ValueNS};
use NameBinding; use {NameBinding, NameBindingKind};
use ResolveResult; use ResolveResult;
use ResolveResult::*; use ResolveResult::*;
use Resolver; use Resolver;
...@@ -82,11 +81,22 @@ pub fn new(module_path: Vec<Name>, ...@@ -82,11 +81,22 @@ pub fn new(module_path: Vec<Name>,
// Given the binding to which this directive resolves in a particular namespace, // Given the binding to which this directive resolves in a particular namespace,
// this returns the binding for the name this directive defines in that namespace. // this returns the binding for the name this directive defines in that namespace.
fn import<'a>(&self, binding: &'a NameBinding<'a>) -> NameBinding<'a> { fn import<'a>(&self, binding: &'a NameBinding<'a>) -> NameBinding<'a> {
let mut binding = binding.clone(); let mut modifiers = match self.is_public {
true => DefModifiers::PUBLIC | DefModifiers::IMPORTABLE,
false => DefModifiers::empty(),
};
if let GlobImport = self.subclass {
modifiers = modifiers | DefModifiers::GLOB_IMPORTED;
}
if self.shadowable == Shadowable::Always { if self.shadowable == Shadowable::Always {
binding.modifiers = binding.modifiers | DefModifiers::PRELUDE; modifiers = modifiers | DefModifiers::PRELUDE;
}
NameBinding {
kind: NameBindingKind::Import { binding: binding, id: self.id },
span: Some(self.span),
modifiers: modifiers,
} }
binding
} }
} }
...@@ -216,7 +226,7 @@ fn import_resolving_error(&self, e: ImportResolvingError<'b>) { ...@@ -216,7 +226,7 @@ fn import_resolving_error(&self, e: ImportResolvingError<'b>) {
let dummy_binding = self.resolver.new_name_binding(NameBinding { let dummy_binding = self.resolver.new_name_binding(NameBinding {
modifiers: DefModifiers::IMPORTABLE, modifiers: DefModifiers::IMPORTABLE,
def_or_module: DefOrModule::Def(Def::Err), kind: NameBindingKind::Def(Def::Err),
span: None, span: None,
}); });
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册