@@ -584,13 +584,9 @@ impl<'a> Visitor for Resolver<'a> {
584
584
self . resolve_type ( ty) ;
585
585
}
586
586
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) ;
594
590
visit:: walk_poly_trait_ref ( self , tref, m) ;
595
591
}
596
592
fn visit_variant ( & mut self ,
@@ -1205,8 +1201,7 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> {
1205
1201
let namespace = if is_value { ValueNS } else { TypeNS } ;
1206
1202
match self . resolve_crate_relative_path ( path. span , & path. segments , namespace) {
1207
1203
Ok ( binding) => path. def = binding. def ( ) ,
1208
- Err ( true ) => { }
1209
- Err ( false ) => {
1204
+ None => {
1210
1205
let path_name = & format ! ( "{}" , path) ;
1211
1206
let error =
1212
1207
ResolutionError :: UnresolvedName {
@@ -1844,12 +1839,11 @@ impl<'a> Resolver<'a> {
1844
1839
match self . resolve_crate_relative_path ( prefix. span ,
1845
1840
& prefix. segments ,
1846
1841
TypeNS ) {
1847
- Ok ( binding) => {
1842
+ Some ( binding) => {
1848
1843
let def = binding. def ( ) ;
1849
1844
self . record_def ( item. id , PathResolution :: new ( def) ) ;
1850
1845
}
1851
- Err ( true ) => self . record_def ( item. id , err_path_resolution ( ) ) ,
1852
- Err ( false ) => {
1846
+ None => {
1853
1847
resolve_error ( self ,
1854
1848
prefix. span ,
1855
1849
ResolutionError :: FailedToResolve (
@@ -1935,14 +1929,14 @@ impl<'a> Resolver<'a> {
1935
1929
trait_path : & Path ,
1936
1930
path_depth : usize ,
1937
1931
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 ) {
1940
1934
match path_res. base_def {
1941
1935
Def :: Trait ( _) => {
1942
1936
debug ! ( "(resolving trait) found trait def: {:?}" , path_res) ;
1943
- return Ok ( path_res) ;
1937
+ return path_res;
1944
1938
}
1945
- Def :: Err => return Err ( true ) ,
1939
+ Def :: Err => return err_path_resolution ( ) ,
1946
1940
_ => { }
1947
1941
}
1948
1942
@@ -1963,10 +1957,7 @@ impl<'a> Resolver<'a> {
1963
1957
err. note ( & format ! ( "type aliases cannot be used for traits" ) ) ;
1964
1958
}
1965
1959
err. emit ( ) ;
1966
- Err ( true )
1967
- } ) . map_err ( |error_reported| {
1968
- if error_reported { return }
1969
-
1960
+ } else {
1970
1961
// find possible candidates
1971
1962
let trait_name = trait_path. segments . last ( ) . unwrap ( ) . identifier . name ;
1972
1963
let candidates =
@@ -1988,7 +1979,8 @@ impl<'a> Resolver<'a> {
1988
1979
) ;
1989
1980
1990
1981
resolve_error ( self , trait_path. span , error) ;
1991
- } )
1982
+ }
1983
+ err_path_resolution ( )
1992
1984
}
1993
1985
1994
1986
fn with_current_self_type < T , F > ( & mut self , self_type : & Ty , f : F ) -> T
@@ -2011,16 +2003,13 @@ impl<'a> Resolver<'a> {
2011
2003
let mut new_val = None ;
2012
2004
let mut new_id = None ;
2013
2005
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 {
2020
2011
new_val = Some ( ( path_res. base_def . def_id ( ) , trait_ref. clone ( ) ) ) ;
2021
2012
new_id = Some ( path_res. base_def . def_id ( ) ) ;
2022
- } else {
2023
- self . record_def ( trait_ref. ref_id , err_path_resolution ( ) ) ;
2024
2013
}
2025
2014
visit:: walk_trait_ref ( self , trait_ref) ;
2026
2015
}
@@ -2276,9 +2265,8 @@ impl<'a> Resolver<'a> {
2276
2265
self . record_def ( ty. id , err_path_resolution ( ) ) ;
2277
2266
2278
2267
// 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 ) {
2282
2270
let kind = if maybe_qself. is_some ( ) {
2283
2271
"associated type"
2284
2272
} else {
@@ -2420,7 +2408,7 @@ impl<'a> Resolver<'a> {
2420
2408
resolution
2421
2409
}
2422
2410
} 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 ( ) {
2424
2412
resolve_error (
2425
2413
self ,
2426
2414
path. span ,
@@ -2553,26 +2541,28 @@ impl<'a> Resolver<'a> {
2553
2541
}
2554
2542
max_assoc_types = path. segments . len ( ) - qself. position ;
2555
2543
// 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 ) ;
2557
2545
}
2558
2546
None => {
2559
2547
max_assoc_types = path. segments . len ( ) ;
2560
2548
}
2561
2549
}
2562
2550
2563
2551
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)
2565
2553
} ) ;
2554
+ if resolution. map ( |res| res. base_def ) == Some ( Def :: Err ) { resolution = None ; }
2566
2555
for depth in 1 ..max_assoc_types {
2567
2556
if resolution. is_some ( ) {
2568
2557
break ;
2569
2558
}
2570
2559
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 ) ;
2572
2561
if let Some ( Def :: Mod ( ..) ) = partial_resolution. map ( |r| r. base_def ) {
2573
2562
// Modules cannot have associated items
2574
2563
} else {
2575
2564
resolution = partial_resolution;
2565
+ if resolution. map ( |res| res. base_def ) == Some ( Def :: Err ) { resolution = None ; }
2576
2566
}
2577
2567
} ) ;
2578
2568
}
@@ -2582,7 +2572,7 @@ impl<'a> Resolver<'a> {
2582
2572
/// Skips `path_depth` trailing segments, which is also reflected in the
2583
2573
/// returned value. See `hir::def::PathResolution` for more info.
2584
2574
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 > {
2586
2576
debug ! ( "resolve_path(id={:?} path={:?}, path_depth={:?})" , id, path, path_depth) ;
2587
2577
2588
2578
let span = path. span ;
@@ -2623,15 +2613,15 @@ impl<'a> Resolver<'a> {
2623
2613
//
2624
2614
// Such behavior is required for backward compatibility.
2625
2615
// 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) ) ) ;
2628
2618
}
2629
2619
2630
2620
let unqualified_def = resolve_identifier_with_fallback ( self , None ) ;
2631
2621
let qualified_binding = self . resolve_module_relative_path ( span, segments, namespace) ;
2632
2622
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" => {
2635
2625
self . session
2636
2626
. add_lint ( lint:: builtin:: UNUSED_QUALIFICATIONS ,
2637
2627
id,
@@ -2659,7 +2649,7 @@ impl<'a> Resolver<'a> {
2659
2649
}
2660
2650
2661
2651
// 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 {
2663
2653
let ribs = match local_def. ribs {
2664
2654
Some ( ( ns, i) ) => & self . ribs [ ns] [ i + 1 ..] ,
2665
2655
None => & [ ] as & [ _ ] ,
@@ -2705,14 +2695,14 @@ impl<'a> Resolver<'a> {
2705
2695
resolve_error ( self ,
2706
2696
span,
2707
2697
ResolutionError :: CannotCaptureDynamicEnvironmentInFnItem ) ;
2708
- return None ;
2698
+ return Def :: Err ;
2709
2699
}
2710
2700
ConstantItemRibKind => {
2711
2701
// Still doesn't deal with upvars
2712
2702
resolve_error ( self ,
2713
2703
span,
2714
2704
ResolutionError :: AttemptToUseNonConstantValueInConstant ) ;
2715
- return None ;
2705
+ return Def :: Err ;
2716
2706
}
2717
2707
}
2718
2708
}
@@ -2731,28 +2721,27 @@ impl<'a> Resolver<'a> {
2731
2721
resolve_error ( self ,
2732
2722
span,
2733
2723
ResolutionError :: TypeParametersFromOuterFunction ) ;
2734
- return None ;
2724
+ return Def :: Err ;
2735
2725
}
2736
2726
ConstantItemRibKind => {
2737
2727
// see #9186
2738
2728
resolve_error ( self , span, ResolutionError :: OuterTypeParameterContext ) ;
2739
- return None ;
2729
+ return Def :: Err ;
2740
2730
}
2741
2731
}
2742
2732
}
2743
2733
}
2744
2734
_ => { }
2745
2735
}
2746
- return Some ( def) ;
2736
+ return def;
2747
2737
}
2748
2738
2749
2739
// resolve a "module-relative" path, e.g. a::b::c
2750
2740
fn resolve_module_relative_path ( & mut self ,
2751
2741
span : Span ,
2752
2742
segments : & [ ast:: PathSegment ] ,
2753
2743
namespace : Namespace )
2754
- -> Result < & ' a NameBinding < ' a > ,
2755
- bool /* true if an error was reported */ > {
2744
+ -> Option < & ' a NameBinding < ' a > > {
2756
2745
let module_path =
2757
2746
segments. split_last ( ) . unwrap ( ) . 1 . iter ( ) . map ( |ps| ps. identifier ) . collect :: < Vec < _ > > ( ) ;
2758
2747
@@ -2761,22 +2750,20 @@ impl<'a> Resolver<'a> {
2761
2750
if let Some ( ( span, msg) ) = err {
2762
2751
resolve_error ( self , span, ResolutionError :: FailedToResolve ( & msg) ) ;
2763
2752
}
2764
- return Err ( true ) ;
2753
+ return Some ( self . dummy_binding ) ;
2765
2754
}
2766
- Indeterminate => return Err ( false ) ,
2755
+ Indeterminate => return None ,
2767
2756
Success ( module) => module,
2768
2757
} ;
2769
2758
2770
2759
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 ( )
2773
2761
}
2774
2762
2775
2763
/// Invariant: This must be called only during main resolution, not during
2776
2764
/// import resolution.
2777
2765
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 > >
2780
2767
where T : Named ,
2781
2768
{
2782
2769
let module_path = segments. split_last ( ) . unwrap ( ) . 1 . iter ( ) . map ( T :: ident) . collect :: < Vec < _ > > ( ) ;
@@ -2787,17 +2774,16 @@ impl<'a> Resolver<'a> {
2787
2774
if let Some ( ( span, msg) ) = err {
2788
2775
resolve_error ( self , span, ResolutionError :: FailedToResolve ( & msg) ) ;
2789
2776
}
2790
- return Err ( true ) ;
2777
+ return Some ( self . dummy_binding ) ;
2791
2778
}
2792
2779
2793
- Indeterminate => return Err ( false ) ,
2780
+ Indeterminate => return None ,
2794
2781
2795
2782
Success ( module) => module,
2796
2783
} ;
2797
2784
2798
2785
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 ( )
2801
2787
}
2802
2788
2803
2789
fn with_no_errors < T , F > ( & mut self , f : F ) -> T
@@ -2963,7 +2949,7 @@ impl<'a> Resolver<'a> {
2963
2949
2964
2950
self . record_def ( expr. id , err_path_resolution ( ) ) ;
2965
2951
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 ) {
2967
2953
let error_variant =
2968
2954
ResolutionError :: StructVariantUsedAsFunction ( & path_name) ;
2969
2955
let mut err = resolve_struct_error ( self , expr. span , error_variant) ;
@@ -2979,9 +2965,8 @@ impl<'a> Resolver<'a> {
2979
2965
err. emit ( ) ;
2980
2966
} else {
2981
2967
// 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 ) {
2985
2970
let mut method_scope = false ;
2986
2971
let mut is_static = false ;
2987
2972
self . ribs [ ValueNS ] . iter ( ) . rev ( ) . all ( |rib| {
0 commit comments