@@ -2066,52 +2066,64 @@ impl<'a> Resolver<'a> {
20662066 } ;
20672067 }
20682068
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) ) ,
21102119 }
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,
21132126 } ;
2114-
21152127 match binding {
21162128 Ok ( binding) => {
21172129 if i == 1 {
@@ -2201,7 +2213,33 @@ impl<'a> Resolver<'a> {
22012213 } else if i == 0 {
22022214 ( format ! ( "use of undeclared type or module `{}`" , ident) , None )
22032215 } 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 )
22052243 } ;
22062244 return PathResult :: Failed {
22072245 span : ident. span ,
0 commit comments