Skip to content

Commit 10ac957

Browse files
committed
resolve: Refactor away DeterminacyExt
1 parent 22a13ef commit 10ac957

File tree

3 files changed

+27
-40
lines changed

3 files changed

+27
-40
lines changed

src/librustc_resolve/lib.rs

+4-14
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,9 @@ fn is_known_tool(name: Name) -> bool {
9797
["clippy", "rustfmt"].contains(&&*name.as_str())
9898
}
9999

100-
enum DeterminacyExt {
101-
Determined,
102-
Undetermined,
103-
WeakUndetermined,
104-
}
105-
106-
impl DeterminacyExt {
107-
fn to_determinacy(self) -> Determinacy {
108-
match self {
109-
DeterminacyExt::Determined => Determined,
110-
DeterminacyExt::Undetermined | DeterminacyExt::WeakUndetermined => Undetermined,
111-
}
112-
}
100+
enum Weak {
101+
Yes,
102+
No,
113103
}
114104

115105
/// A free importable items suggested in case of resolution failure.
@@ -2164,7 +2154,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
21642154
}
21652155
let result = self.resolve_ident_in_module_unadjusted_ext(
21662156
module, ident, ns, parent_scope, false, record_used, path_span,
2167-
).map_err(DeterminacyExt::to_determinacy);
2157+
).map_err(|(determinacy, _)| determinacy);
21682158
self.current_module = orig_current_module;
21692159
result
21702160
}

src/librustc_resolve/macros.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
use {AmbiguityError, AmbiguityKind, AmbiguityErrorMisc};
12-
use {CrateLint, DeterminacyExt, Resolver, ResolutionError};
12+
use {CrateLint, Resolver, ResolutionError, Weak};
1313
use {Module, ModuleKind, NameBinding, NameBindingKind, PathResult, ToNameBinding};
1414
use {is_known_tool, names_to_string, resolve_error};
1515
use ModuleOrUniformRoot;
@@ -687,10 +687,11 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
687687
};
688688
Ok((binding, Flags::MODULE | misc_flags))
689689
}
690-
Err(DeterminacyExt::Undetermined) =>
690+
Err((Determinacy::Undetermined, Weak::No)) =>
691691
return Err(Determinacy::determined(force)),
692-
Err(DeterminacyExt::WeakUndetermined) => Err(Determinacy::Undetermined),
693-
Err(DeterminacyExt::Determined) => Err(Determinacy::Determined),
692+
Err((Determinacy::Undetermined, Weak::Yes)) =>
693+
Err(Determinacy::Undetermined),
694+
Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
694695
}
695696
}
696697
WhereToResolve::MacroUsePrelude => {

src/librustc_resolve/resolve_imports.rs

+18-22
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use self::ImportDirectiveSubclass::*;
1212

1313
use {AmbiguityError, AmbiguityKind, AmbiguityErrorMisc};
14-
use {CrateLint, DeterminacyExt, Module, ModuleOrUniformRoot, PerNS, UniformRootKind};
14+
use {CrateLint, Module, ModuleOrUniformRoot, PerNS, UniformRootKind, Weak};
1515
use Namespace::{self, TypeNS, MacroNS};
1616
use {NameBinding, NameBindingKind, ToNameBinding, PathResult, PrivacyError};
1717
use Resolver;
@@ -145,7 +145,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
145145
) -> Result<&'a NameBinding<'a>, Determinacy> {
146146
self.resolve_ident_in_module_unadjusted_ext(
147147
module, ident, ns, None, false, record_used, path_span
148-
).map_err(DeterminacyExt::to_determinacy)
148+
).map_err(|(determinacy, _)| determinacy)
149149
}
150150

151151
/// Attempts to resolve `ident` in namespaces `ns` of `module`.
@@ -159,7 +159,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
159159
restricted_shadowing: bool,
160160
record_used: bool,
161161
path_span: Span,
162-
) -> Result<&'a NameBinding<'a>, DeterminacyExt> {
162+
) -> Result<&'a NameBinding<'a>, (Determinacy, Weak)> {
163163
let module = match module {
164164
ModuleOrUniformRoot::Module(module) => module,
165165
ModuleOrUniformRoot::UniformRoot(uniform_root_kind) => {
@@ -171,9 +171,9 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
171171
Ok(binding)
172172
} else if !self.graph_root.unresolved_invocations.borrow().is_empty() {
173173
// Macro-expanded `extern crate` items can add names to extern prelude.
174-
Err(DeterminacyExt::Undetermined)
174+
Err((Undetermined, Weak::No))
175175
} else {
176-
Err(DeterminacyExt::Determined)
176+
Err((Determined, Weak::No))
177177
}
178178
}
179179
UniformRootKind::CurrentScope => {
@@ -198,10 +198,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
198198
let binding = self.early_resolve_ident_in_lexical_scope(
199199
ident, ns, None, true, parent_scope, record_used, record_used, path_span
200200
);
201-
return binding.map_err(|determinacy| match determinacy {
202-
Determined => DeterminacyExt::Determined,
203-
Undetermined => DeterminacyExt::Undetermined,
204-
});
201+
return binding.map_err(|determinacy| (determinacy, Weak::No));
205202
}
206203
}
207204
}
@@ -211,8 +208,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
211208

212209
let resolution = self.resolution(module, ident, ns)
213210
.try_borrow_mut()
214-
// This happens when there is a cycle of imports.
215-
.map_err(|_| DeterminacyExt::Determined)?;
211+
.map_err(|_| (Determined, Weak::No))?; // This happens when there is a cycle of imports.
216212

217213
if let Some(binding) = resolution.binding {
218214
if !restricted_shadowing && binding.expansion != Mark::root() {
@@ -226,13 +222,13 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
226222
// `extern crate` are always usable for backwards compatibility, see issue #37020,
227223
// remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`.
228224
let usable = this.is_accessible(binding.vis) || binding.is_extern_crate();
229-
if usable { Ok(binding) } else { Err(DeterminacyExt::Determined) }
225+
if usable { Ok(binding) } else { Err((Determined, Weak::No)) }
230226
};
231227

232228
if record_used {
233-
return resolution.binding.ok_or(DeterminacyExt::Determined).and_then(|binding| {
229+
return resolution.binding.ok_or((Determined, Weak::No)).and_then(|binding| {
234230
if self.last_import_segment && check_usable(self, binding).is_err() {
235-
Err(DeterminacyExt::Determined)
231+
Err((Determined, Weak::No))
236232
} else {
237233
self.record_use(ident, ns, binding, restricted_shadowing);
238234

@@ -279,7 +275,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
279275
continue;
280276
}
281277
let module = unwrap_or!(single_import.imported_module.get(),
282-
return Err(DeterminacyExt::Undetermined));
278+
return Err((Undetermined, Weak::No)));
283279
let ident = match single_import.subclass {
284280
SingleImport { source, .. } => source,
285281
_ => unreachable!(),
@@ -290,7 +286,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
290286
Ok(binding) if !self.is_accessible_from(
291287
binding.vis, single_import.parent_scope.module
292288
) => continue,
293-
Ok(_) | Err(Undetermined) => return Err(DeterminacyExt::Undetermined),
289+
Ok(_) | Err(Undetermined) => return Err((Undetermined, Weak::No)),
294290
}
295291
}
296292

@@ -311,7 +307,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
311307
if !unexpanded_macros || ns == MacroNS || restricted_shadowing {
312308
return check_usable(self, binding);
313309
} else {
314-
return Err(DeterminacyExt::Undetermined);
310+
return Err((Undetermined, Weak::No));
315311
}
316312
}
317313

@@ -321,12 +317,12 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
321317
// expansion. With restricted shadowing names from globs and macro expansions cannot
322318
// shadow names from outer scopes, so we can freely fallback from module search to search
323319
// in outer scopes. For `early_resolve_ident_in_lexical_scope` to continue search in outer
324-
// scopes we return `WeakUndetermined` instead of full `Undetermined`.
320+
// scopes we return `Undetermined` with `Weak::Yes`.
325321

326322
// Check if one of unexpanded macros can still define the name,
327323
// if it can then our "no resolution" result is not determined and can be invalidated.
328324
if unexpanded_macros {
329-
return Err(DeterminacyExt::WeakUndetermined);
325+
return Err((Undetermined, Weak::Yes));
330326
}
331327

332328
// Check if one of glob imports can still define the name,
@@ -338,7 +334,7 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
338334
let module = match glob_import.imported_module.get() {
339335
Some(ModuleOrUniformRoot::Module(module)) => module,
340336
Some(ModuleOrUniformRoot::UniformRoot(_)) => continue,
341-
None => return Err(DeterminacyExt::WeakUndetermined),
337+
None => return Err((Undetermined, Weak::Yes)),
342338
};
343339
let (orig_current_module, mut ident) = (self.current_module, ident.modern());
344340
match ident.span.glob_adjust(module.expansion, glob_import.span.ctxt().modern()) {
@@ -360,12 +356,12 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
360356
Ok(binding) if !self.is_accessible_from(
361357
binding.vis, glob_import.parent_scope.module
362358
) => continue,
363-
Ok(_) | Err(Undetermined) => return Err(DeterminacyExt::WeakUndetermined),
359+
Ok(_) | Err(Undetermined) => return Err((Undetermined, Weak::Yes)),
364360
}
365361
}
366362

367363
// No resolution and no one else can define the name - determinate error.
368-
Err(DeterminacyExt::Determined)
364+
Err((Determined, Weak::No))
369365
}
370366

371367
// Add an import directive to the current module.

0 commit comments

Comments
 (0)