@@ -12,7 +12,7 @@ use rustc_attr::StabilityLevel;
1212use rustc_data_structures:: fx:: FxHashSet ;
1313use rustc_data_structures:: intern:: Interned ;
1414use rustc_data_structures:: sync:: Lrc ;
15- use rustc_errors:: struct_span_err;
15+ use rustc_errors:: { struct_span_err, Applicability } ;
1616use rustc_expand:: base:: { Annotatable , DeriveResolutions , Indeterminate , ResolverExpand } ;
1717use rustc_expand:: base:: { SyntaxExtension , SyntaxExtensionKind } ;
1818use rustc_expand:: compile_declarative_macro;
@@ -694,7 +694,19 @@ impl<'a> Resolver<'a> {
694694 check_consistency ( self , & path, path_span, kind, initial_res, res)
695695 }
696696 path_res @ PathResult :: NonModule ( ..) | path_res @ PathResult :: Failed { .. } => {
697+ let mut suggestion = None ;
697698 let ( span, label) = if let PathResult :: Failed { span, label, .. } = path_res {
699+ // try to suggest if it's not a macro, maybe a function
700+ if let PathResult :: NonModule ( partial_res) = self . maybe_resolve_path ( & path, Some ( ValueNS ) , & parent_scope)
701+ && partial_res. unresolved_segments ( ) == 0 {
702+ let sm = self . session . source_map ( ) ;
703+ let exclamation_span = sm. next_point ( span) ;
704+ suggestion = Some ( (
705+ vec ! [ ( exclamation_span, "" . to_string( ) ) ] ,
706+ format ! ( "{} is not a macro, but a {}, try to remove `!`" , Segment :: names_to_string( & path) , partial_res. base_res( ) . descr( ) ) ,
707+ Applicability :: MaybeIncorrect
708+ ) ) ;
709+ }
698710 ( span, label)
699711 } else {
700712 (
@@ -708,7 +720,7 @@ impl<'a> Resolver<'a> {
708720 } ;
709721 self . report_error (
710722 span,
711- ResolutionError :: FailedToResolve { label, suggestion : None } ,
723+ ResolutionError :: FailedToResolve { label, suggestion } ,
712724 ) ;
713725 }
714726 PathResult :: Module ( ..) | PathResult :: Indeterminate => unreachable ! ( ) ,
0 commit comments