@@ -2066,52 +2066,64 @@ impl<'a> Resolver<'a> {
2066
2066
} ;
2067
2067
}
2068
2068
2069
- let binding = if let Some ( module) = module {
2070
- self . resolve_ident_in_module (
2071
- module,
2072
- ident,
2073
- ns,
2074
- parent_scope,
2075
- record_used,
2076
- path_span,
2077
- )
2078
- } else if ribs. is_none ( ) || opt_ns. is_none ( ) || opt_ns == Some ( MacroNS ) {
2079
- let scopes = ScopeSet :: All ( ns, opt_ns. is_none ( ) ) ;
2080
- self . early_resolve_ident_in_lexical_scope (
2081
- ident,
2082
- scopes,
2083
- parent_scope,
2084
- record_used,
2085
- record_used,
2086
- path_span,
2087
- )
2088
- } else {
2089
- let record_used_id =
2090
- if record_used { crate_lint. node_id ( ) . or ( Some ( CRATE_NODE_ID ) ) } else { None } ;
2091
- match self . resolve_ident_in_lexical_scope (
2092
- ident,
2093
- ns,
2094
- parent_scope,
2095
- record_used_id,
2096
- path_span,
2097
- & ribs. unwrap ( ) [ ns] ,
2098
- ) {
2099
- // we found a locally-imported or available item/module
2100
- Some ( LexicalScopeBinding :: Item ( binding) ) => Ok ( binding) ,
2101
- // we found a local variable or type param
2102
- Some ( LexicalScopeBinding :: Res ( res) )
2103
- if opt_ns == Some ( TypeNS ) || opt_ns == Some ( ValueNS ) =>
2104
- {
2105
- record_segment_res ( self , res) ;
2106
- return PathResult :: NonModule ( PartialRes :: with_unresolved_segments (
2107
- res,
2108
- path. len ( ) - 1 ,
2109
- ) ) ;
2069
+ enum FindBindingResult < ' a > {
2070
+ Binding ( Result < & ' a NameBinding < ' a > , Determinacy > ) ,
2071
+ PathResult ( PathResult < ' a > ) ,
2072
+ }
2073
+ let find_binding_in_ns = |this : & mut Self , ns| {
2074
+ let binding = if let Some ( module) = module {
2075
+ this. resolve_ident_in_module (
2076
+ module,
2077
+ ident,
2078
+ ns,
2079
+ parent_scope,
2080
+ record_used,
2081
+ path_span,
2082
+ )
2083
+ } else if ribs. is_none ( ) || opt_ns. is_none ( ) || opt_ns == Some ( MacroNS ) {
2084
+ let scopes = ScopeSet :: All ( ns, opt_ns. is_none ( ) ) ;
2085
+ this. early_resolve_ident_in_lexical_scope (
2086
+ ident,
2087
+ scopes,
2088
+ parent_scope,
2089
+ record_used,
2090
+ record_used,
2091
+ path_span,
2092
+ )
2093
+ } else {
2094
+ let record_used_id = if record_used {
2095
+ crate_lint. node_id ( ) . or ( Some ( CRATE_NODE_ID ) )
2096
+ } else {
2097
+ None
2098
+ } ;
2099
+ match this. resolve_ident_in_lexical_scope (
2100
+ ident,
2101
+ ns,
2102
+ parent_scope,
2103
+ record_used_id,
2104
+ path_span,
2105
+ & ribs. unwrap ( ) [ ns] ,
2106
+ ) {
2107
+ // we found a locally-imported or available item/module
2108
+ Some ( LexicalScopeBinding :: Item ( binding) ) => Ok ( binding) ,
2109
+ // we found a local variable or type param
2110
+ Some ( LexicalScopeBinding :: Res ( res) )
2111
+ if opt_ns == Some ( TypeNS ) || opt_ns == Some ( ValueNS ) =>
2112
+ {
2113
+ record_segment_res ( this, res) ;
2114
+ return FindBindingResult :: PathResult ( PathResult :: NonModule (
2115
+ PartialRes :: with_unresolved_segments ( res, path. len ( ) - 1 ) ,
2116
+ ) ) ;
2117
+ }
2118
+ _ => Err ( Determinacy :: determined ( record_used) ) ,
2110
2119
}
2111
- _ => Err ( Determinacy :: determined ( record_used) ) ,
2112
- }
2120
+ } ;
2121
+ FindBindingResult :: Binding ( binding)
2122
+ } ;
2123
+ let binding = match find_binding_in_ns ( self , ns) {
2124
+ FindBindingResult :: PathResult ( x) => return x,
2125
+ FindBindingResult :: Binding ( binding) => binding,
2113
2126
} ;
2114
-
2115
2127
match binding {
2116
2128
Ok ( binding) => {
2117
2129
if i == 1 {
@@ -2201,7 +2213,33 @@ impl<'a> Resolver<'a> {
2201
2213
} else if i == 0 {
2202
2214
( format ! ( "use of undeclared type or module `{}`" , ident) , None )
2203
2215
} else {
2204
- ( format ! ( "could not find `{}` in `{}`" , ident, path[ i - 1 ] . ident) , None )
2216
+ let mut msg =
2217
+ format ! ( "could not find `{}` in `{}`" , ident, path[ i - 1 ] . ident) ;
2218
+ if ns == TypeNS || ns == ValueNS {
2219
+ let ns_to_try = if ns == TypeNS { ValueNS } else { TypeNS } ;
2220
+ if let FindBindingResult :: Binding ( Ok ( binding) ) =
2221
+ find_binding_in_ns ( self , ns_to_try)
2222
+ {
2223
+ let mut found = |what| {
2224
+ msg = format ! (
2225
+ "expected {}, found {} `{}` in `{}`" ,
2226
+ ns. descr( ) ,
2227
+ what,
2228
+ ident,
2229
+ path[ i - 1 ] . ident
2230
+ )
2231
+ } ;
2232
+ if binding. module ( ) . is_some ( ) {
2233
+ found ( "module" )
2234
+ } else {
2235
+ match binding. res ( ) {
2236
+ def:: Res :: < NodeId > :: Def ( kind, id) => found ( kind. descr ( id) ) ,
2237
+ _ => found ( ns_to_try. descr ( ) ) ,
2238
+ }
2239
+ }
2240
+ } ;
2241
+ }
2242
+ ( msg, None )
2205
2243
} ;
2206
2244
return PathResult :: Failed {
2207
2245
span : ident. span ,
0 commit comments