@@ -3147,11 +3147,11 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
3147
3147
// parser issue where a struct literal is being used on an expression
3148
3148
// where a brace being opened means a block is being started. Look
3149
3149
// ahead for the next text to see if `span` is followed by a `{`.
3150
- let cm = this. session . source_map ( ) ;
3150
+ let sm = this. session . source_map ( ) ;
3151
3151
let mut sp = span;
3152
3152
loop {
3153
- sp = cm . next_point ( sp) ;
3154
- match cm . span_to_snippet ( sp) {
3153
+ sp = sm . next_point ( sp) ;
3154
+ match sm . span_to_snippet ( sp) {
3155
3155
Ok ( ref snippet) => {
3156
3156
if snippet. chars ( ) . any ( |c| { !c. is_whitespace ( ) } ) {
3157
3157
break ;
@@ -3160,20 +3160,51 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
3160
3160
_ => break ,
3161
3161
}
3162
3162
}
3163
- let followed_by_brace = match cm . span_to_snippet ( sp) {
3163
+ let followed_by_brace = match sm . span_to_snippet ( sp) {
3164
3164
Ok ( ref snippet) if snippet == "{" => true ,
3165
3165
_ => false ,
3166
3166
} ;
3167
- if let ( PathSource :: Expr ( None ) , true ) = ( source, followed_by_brace) {
3168
- err. span_label (
3169
- span,
3170
- format ! ( "did you mean `({} {{ /* fields */ }})`?" , path_str) ,
3171
- ) ;
3172
- } else {
3173
- err. span_label (
3174
- span,
3175
- format ! ( "did you mean `{} {{ /* fields */ }}`?" , path_str) ,
3176
- ) ;
3167
+ match source {
3168
+ PathSource :: Expr ( Some ( parent) ) => {
3169
+ match parent. node {
3170
+ ExprKind :: MethodCall ( ref path_assignment, _) => {
3171
+ err. span_suggestion_with_applicability (
3172
+ sm. start_point ( parent. span )
3173
+ . to ( path_assignment. ident . span ) ,
3174
+ "use `::` to access an associated function" ,
3175
+ format ! ( "{}::{}" ,
3176
+ path_str,
3177
+ path_assignment. ident) ,
3178
+ Applicability :: MaybeIncorrect
3179
+ ) ;
3180
+ return ( err, candidates) ;
3181
+ } ,
3182
+ _ => {
3183
+ err. span_label (
3184
+ span,
3185
+ format ! ( "did you mean `{} {{ /* fields */ }}`?" ,
3186
+ path_str) ,
3187
+ ) ;
3188
+ return ( err, candidates) ;
3189
+ } ,
3190
+ }
3191
+ } ,
3192
+ PathSource :: Expr ( None ) if followed_by_brace == true => {
3193
+ err. span_label (
3194
+ span,
3195
+ format ! ( "did you mean `({} {{ /* fields */ }})`?" ,
3196
+ path_str) ,
3197
+ ) ;
3198
+ return ( err, candidates) ;
3199
+ } ,
3200
+ _ => {
3201
+ err. span_label (
3202
+ span,
3203
+ format ! ( "did you mean `{} {{ /* fields */ }}`?" ,
3204
+ path_str) ,
3205
+ ) ;
3206
+ return ( err, candidates) ;
3207
+ } ,
3177
3208
}
3178
3209
}
3179
3210
return ( err, candidates) ;
0 commit comments