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