Skip to content

Commit cb9f14e

Browse files
committed
Use Def::Err to signal that an error has already been reported where possible.
1 parent 39c267a commit cb9f14e

File tree

1 file changed

+48
-63
lines changed

1 file changed

+48
-63
lines changed

src/librustc_resolve/lib.rs

+48-63
Original file line numberDiff line numberDiff line change
@@ -584,13 +584,9 @@ impl<'a> Visitor for Resolver<'a> {
584584
self.resolve_type(ty);
585585
}
586586
fn visit_poly_trait_ref(&mut self, tref: &ast::PolyTraitRef, m: &ast::TraitBoundModifier) {
587-
match self.resolve_trait_reference(tref.trait_ref.ref_id, &tref.trait_ref.path, 0, None) {
588-
Ok(def) => self.record_def(tref.trait_ref.ref_id, def),
589-
Err(_) => {
590-
// error already reported
591-
self.record_def(tref.trait_ref.ref_id, err_path_resolution())
592-
}
593-
}
587+
let def =
588+
self.resolve_trait_reference(tref.trait_ref.ref_id, &tref.trait_ref.path, 0, None);
589+
self.record_def(tref.trait_ref.ref_id, def);
594590
visit::walk_poly_trait_ref(self, tref, m);
595591
}
596592
fn visit_variant(&mut self,
@@ -1205,8 +1201,7 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> {
12051201
let namespace = if is_value { ValueNS } else { TypeNS };
12061202
match self.resolve_crate_relative_path(path.span, &path.segments, namespace) {
12071203
Ok(binding) => path.def = binding.def(),
1208-
Err(true) => {}
1209-
Err(false) => {
1204+
None => {
12101205
let path_name = &format!("{}", path);
12111206
let error =
12121207
ResolutionError::UnresolvedName {
@@ -1844,12 +1839,11 @@ impl<'a> Resolver<'a> {
18441839
match self.resolve_crate_relative_path(prefix.span,
18451840
&prefix.segments,
18461841
TypeNS) {
1847-
Ok(binding) => {
1842+
Some(binding) => {
18481843
let def = binding.def();
18491844
self.record_def(item.id, PathResolution::new(def));
18501845
}
1851-
Err(true) => self.record_def(item.id, err_path_resolution()),
1852-
Err(false) => {
1846+
None => {
18531847
resolve_error(self,
18541848
prefix.span,
18551849
ResolutionError::FailedToResolve(
@@ -1935,14 +1929,14 @@ impl<'a> Resolver<'a> {
19351929
trait_path: &Path,
19361930
path_depth: usize,
19371931
generics: Option<&Generics>)
1938-
-> Result<PathResolution, ()> {
1939-
self.resolve_path(id, trait_path, path_depth, TypeNS).and_then(|path_res| {
1932+
-> PathResolution {
1933+
if let Some(path_res) = self.resolve_path(id, trait_path, path_depth, TypeNS) {
19401934
match path_res.base_def {
19411935
Def::Trait(_) => {
19421936
debug!("(resolving trait) found trait def: {:?}", path_res);
1943-
return Ok(path_res);
1937+
return path_res;
19441938
}
1945-
Def::Err => return Err(true),
1939+
Def::Err => return err_path_resolution(),
19461940
_ => {}
19471941
}
19481942

@@ -1963,10 +1957,7 @@ impl<'a> Resolver<'a> {
19631957
err.note(&format!("type aliases cannot be used for traits"));
19641958
}
19651959
err.emit();
1966-
Err(true)
1967-
}).map_err(|error_reported| {
1968-
if error_reported { return }
1969-
1960+
} else {
19701961
// find possible candidates
19711962
let trait_name = trait_path.segments.last().unwrap().identifier.name;
19721963
let candidates =
@@ -1988,7 +1979,8 @@ impl<'a> Resolver<'a> {
19881979
);
19891980

19901981
resolve_error(self, trait_path.span, error);
1991-
})
1982+
}
1983+
err_path_resolution()
19921984
}
19931985

19941986
fn with_current_self_type<T, F>(&mut self, self_type: &Ty, f: F) -> T
@@ -2011,16 +2003,13 @@ impl<'a> Resolver<'a> {
20112003
let mut new_val = None;
20122004
let mut new_id = None;
20132005
if let Some(trait_ref) = opt_trait_ref {
2014-
if let Ok(path_res) = self.resolve_trait_reference(trait_ref.ref_id,
2015-
&trait_ref.path,
2016-
0,
2017-
generics) {
2018-
assert!(path_res.depth == 0);
2019-
self.record_def(trait_ref.ref_id, path_res);
2006+
let path_res =
2007+
self.resolve_trait_reference(trait_ref.ref_id, &trait_ref.path, 0, generics);
2008+
assert!(path_res.depth == 0);
2009+
self.record_def(trait_ref.ref_id, path_res);
2010+
if path_res.base_def != Def::Err {
20202011
new_val = Some((path_res.base_def.def_id(), trait_ref.clone()));
20212012
new_id = Some(path_res.base_def.def_id());
2022-
} else {
2023-
self.record_def(trait_ref.ref_id, err_path_resolution());
20242013
}
20252014
visit::walk_trait_ref(self, trait_ref);
20262015
}
@@ -2276,9 +2265,8 @@ impl<'a> Resolver<'a> {
22762265
self.record_def(ty.id, err_path_resolution());
22772266

22782267
// Keep reporting some errors even if they're ignored above.
2279-
if let Err(true) = self.resolve_path(ty.id, path, 0, TypeNS) {
2280-
// `resolve_path` already reported the error
2281-
} else {
2268+
let result = self.resolve_path(ty.id, path, 0, TypeNS);
2269+
if result.map(|resolution| resolution.base_def) != Some(Def::Err) {
22822270
let kind = if maybe_qself.is_some() {
22832271
"associated type"
22842272
} else {
@@ -2420,7 +2408,7 @@ impl<'a> Resolver<'a> {
24202408
resolution
24212409
}
24222410
} else {
2423-
if let Err(false) = self.resolve_path(pat_id, path, 0, namespace) {
2411+
if self.resolve_path(pat_id, path, 0, namespace).is_none() {
24242412
resolve_error(
24252413
self,
24262414
path.span,
@@ -2553,26 +2541,28 @@ impl<'a> Resolver<'a> {
25532541
}
25542542
max_assoc_types = path.segments.len() - qself.position;
25552543
// Make sure the trait is valid.
2556-
let _ = self.resolve_trait_reference(id, path, max_assoc_types, None);
2544+
self.resolve_trait_reference(id, path, max_assoc_types, None);
25572545
}
25582546
None => {
25592547
max_assoc_types = path.segments.len();
25602548
}
25612549
}
25622550

25632551
let mut resolution = self.with_no_errors(|this| {
2564-
this.resolve_path(id, path, 0, namespace).ok()
2552+
this.resolve_path(id, path, 0, namespace)
25652553
});
2554+
if resolution.map(|res| res.base_def) == Some(Def::Err) { resolution = None; }
25662555
for depth in 1..max_assoc_types {
25672556
if resolution.is_some() {
25682557
break;
25692558
}
25702559
self.with_no_errors(|this| {
2571-
let partial_resolution = this.resolve_path(id, path, depth, TypeNS).ok();
2560+
let partial_resolution = this.resolve_path(id, path, depth, TypeNS);
25722561
if let Some(Def::Mod(..)) = partial_resolution.map(|r| r.base_def) {
25732562
// Modules cannot have associated items
25742563
} else {
25752564
resolution = partial_resolution;
2565+
if resolution.map(|res| res.base_def) == Some(Def::Err) { resolution = None; }
25762566
}
25772567
});
25782568
}
@@ -2582,7 +2572,7 @@ impl<'a> Resolver<'a> {
25822572
/// Skips `path_depth` trailing segments, which is also reflected in the
25832573
/// returned value. See `hir::def::PathResolution` for more info.
25842574
fn resolve_path(&mut self, id: NodeId, path: &Path, path_depth: usize, namespace: Namespace)
2585-
-> Result<PathResolution, bool /* true if an error was reported */ > {
2575+
-> Option<PathResolution> {
25862576
debug!("resolve_path(id={:?} path={:?}, path_depth={:?})", id, path, path_depth);
25872577

25882578
let span = path.span;
@@ -2623,15 +2613,15 @@ impl<'a> Resolver<'a> {
26232613
//
26242614
// Such behavior is required for backward compatibility.
26252615
// The same fallback is used when `a` resolves to nothing.
2626-
let def = resolve_identifier_with_fallback(self, Some(span)).ok_or(false);
2627-
return def.and_then(|def| self.adjust_local_def(def, span).ok_or(true)).map(mk_res);
2616+
let def = resolve_identifier_with_fallback(self, Some(span));
2617+
return def.map(|def| mk_res(self.adjust_local_def(def, span)));
26282618
}
26292619

26302620
let unqualified_def = resolve_identifier_with_fallback(self, None);
26312621
let qualified_binding = self.resolve_module_relative_path(span, segments, namespace);
26322622
match (qualified_binding, unqualified_def) {
2633-
(Ok(binding), Some(ref ud)) if binding.def() == ud.def &&
2634-
segments[0].identifier.name != "$crate" => {
2623+
(Some(binding), Some(ref ud)) if binding.def() == ud.def &&
2624+
segments[0].identifier.name != "$crate" => {
26352625
self.session
26362626
.add_lint(lint::builtin::UNUSED_QUALIFICATIONS,
26372627
id,
@@ -2659,7 +2649,7 @@ impl<'a> Resolver<'a> {
26592649
}
26602650

26612651
// Resolve a local definition, potentially adjusting for closures.
2662-
fn adjust_local_def(&mut self, local_def: LocalDef, span: Span) -> Option<Def> {
2652+
fn adjust_local_def(&mut self, local_def: LocalDef, span: Span) -> Def {
26632653
let ribs = match local_def.ribs {
26642654
Some((ns, i)) => &self.ribs[ns][i + 1..],
26652655
None => &[] as &[_],
@@ -2705,14 +2695,14 @@ impl<'a> Resolver<'a> {
27052695
resolve_error(self,
27062696
span,
27072697
ResolutionError::CannotCaptureDynamicEnvironmentInFnItem);
2708-
return None;
2698+
return Def::Err;
27092699
}
27102700
ConstantItemRibKind => {
27112701
// Still doesn't deal with upvars
27122702
resolve_error(self,
27132703
span,
27142704
ResolutionError::AttemptToUseNonConstantValueInConstant);
2715-
return None;
2705+
return Def::Err;
27162706
}
27172707
}
27182708
}
@@ -2731,28 +2721,27 @@ impl<'a> Resolver<'a> {
27312721
resolve_error(self,
27322722
span,
27332723
ResolutionError::TypeParametersFromOuterFunction);
2734-
return None;
2724+
return Def::Err;
27352725
}
27362726
ConstantItemRibKind => {
27372727
// see #9186
27382728
resolve_error(self, span, ResolutionError::OuterTypeParameterContext);
2739-
return None;
2729+
return Def::Err;
27402730
}
27412731
}
27422732
}
27432733
}
27442734
_ => {}
27452735
}
2746-
return Some(def);
2736+
return def;
27472737
}
27482738

27492739
// resolve a "module-relative" path, e.g. a::b::c
27502740
fn resolve_module_relative_path(&mut self,
27512741
span: Span,
27522742
segments: &[ast::PathSegment],
27532743
namespace: Namespace)
2754-
-> Result<&'a NameBinding<'a>,
2755-
bool /* true if an error was reported */> {
2744+
-> Option<&'a NameBinding<'a>> {
27562745
let module_path =
27572746
segments.split_last().unwrap().1.iter().map(|ps| ps.identifier).collect::<Vec<_>>();
27582747

@@ -2761,22 +2750,20 @@ impl<'a> Resolver<'a> {
27612750
if let Some((span, msg)) = err {
27622751
resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
27632752
}
2764-
return Err(true);
2753+
return Some(self.dummy_binding);
27652754
}
2766-
Indeterminate => return Err(false),
2755+
Indeterminate => return None,
27672756
Success(module) => module,
27682757
};
27692758

27702759
let name = segments.last().unwrap().identifier.name;
2771-
let result = self.resolve_name_in_module(module, name, namespace, false, Some(span));
2772-
result.success().ok_or(false)
2760+
self.resolve_name_in_module(module, name, namespace, false, Some(span)).success()
27732761
}
27742762

27752763
/// Invariant: This must be called only during main resolution, not during
27762764
/// import resolution.
27772765
fn resolve_crate_relative_path<T>(&mut self, span: Span, segments: &[T], namespace: Namespace)
2778-
-> Result<&'a NameBinding<'a>,
2779-
bool /* true if an error was reported */>
2766+
-> Option<&'a NameBinding<'a>>
27802767
where T: Named,
27812768
{
27822769
let module_path = segments.split_last().unwrap().1.iter().map(T::ident).collect::<Vec<_>>();
@@ -2787,17 +2774,16 @@ impl<'a> Resolver<'a> {
27872774
if let Some((span, msg)) = err {
27882775
resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
27892776
}
2790-
return Err(true);
2777+
return Some(self.dummy_binding);
27912778
}
27922779

2793-
Indeterminate => return Err(false),
2780+
Indeterminate => return None,
27942781

27952782
Success(module) => module,
27962783
};
27972784

27982785
let name = segments.last().unwrap().ident().name;
2799-
let result = self.resolve_name_in_module(module, name, namespace, false, Some(span));
2800-
result.success().ok_or(false)
2786+
self.resolve_name_in_module(module, name, namespace, false, Some(span)).success()
28012787
}
28022788

28032789
fn with_no_errors<T, F>(&mut self, f: F) -> T
@@ -2963,7 +2949,7 @@ impl<'a> Resolver<'a> {
29632949

29642950
self.record_def(expr.id, err_path_resolution());
29652951

2966-
if let Ok(Def::Struct(..)) = type_res.map(|r| r.base_def) {
2952+
if let Some(Def::Struct(..)) = type_res.map(|r| r.base_def) {
29672953
let error_variant =
29682954
ResolutionError::StructVariantUsedAsFunction(&path_name);
29692955
let mut err = resolve_struct_error(self, expr.span, error_variant);
@@ -2979,9 +2965,8 @@ impl<'a> Resolver<'a> {
29792965
err.emit();
29802966
} else {
29812967
// Keep reporting some errors even if they're ignored above.
2982-
if let Err(true) = self.resolve_path(expr.id, path, 0, ValueNS) {
2983-
// `resolve_path` already reported the error
2984-
} else {
2968+
let result = self.resolve_path(expr.id, path, 0, ValueNS);
2969+
if result.map(|resolution| resolution.base_def) != Some(Def::Err) {
29852970
let mut method_scope = false;
29862971
let mut is_static = false;
29872972
self.ribs[ValueNS].iter().rev().all(|rib| {

0 commit comments

Comments
 (0)