@@ -15,8 +15,8 @@ use crate::{Directory, DirectoryOwnership};
15
15
use crate :: lexer:: UnmatchedBrace ;
16
16
17
17
use syntax:: ast:: {
18
- self , DUMMY_NODE_ID , AttrStyle , Attribute , CrateSugar , Extern , Ident ,
19
- IsAsync , MacDelimiter , Mutability , StrStyle , Visibility , VisibilityKind , Unsafety ,
18
+ self , DUMMY_NODE_ID , AttrStyle , Attribute , CrateSugar , Extern , Ident , StrLit ,
19
+ IsAsync , MacDelimiter , Mutability , Visibility , VisibilityKind , Unsafety ,
20
20
} ;
21
21
22
22
use syntax:: print:: pprust;
@@ -1214,34 +1214,32 @@ impl<'a> Parser<'a> {
1214
1214
/// Parses `extern string_literal?`.
1215
1215
fn parse_extern ( & mut self ) -> PResult < ' a , Extern > {
1216
1216
Ok ( if self . eat_keyword ( kw:: Extern ) {
1217
- Extern :: from_abi ( self . parse_opt_abi ( ) )
1217
+ Extern :: from_abi ( self . parse_abi ( ) )
1218
1218
} else {
1219
1219
Extern :: None
1220
1220
} )
1221
1221
}
1222
1222
1223
1223
/// Parses a string literal as an ABI spec.
1224
- fn parse_opt_abi ( & mut self ) -> Option < StrLit > {
1225
- if let Some ( ast:: Lit { token : token:: Lit { symbol, suffix, .. } , span, kind } )
1226
- = self . parse_opt_lit ( ) {
1227
- match kind {
1228
- ast:: LitKind :: Str ( symbol_unescaped, style) => return Some ( StrLit {
1229
- style, symbol, suffix, span, symbol_unescaped,
1230
- } ) ,
1231
- ast:: LitKind :: Err ( _) => { }
1224
+ fn parse_abi ( & mut self ) -> Option < StrLit > {
1225
+ match self . parse_str_lit ( ) {
1226
+ Ok ( str_lit) => Some ( str_lit) ,
1227
+ Err ( Some ( lit) ) => match lit. kind {
1228
+ ast:: LitKind :: Err ( _) => None ,
1232
1229
_ => {
1233
- self . struct_span_err ( span, "non-string ABI literal" )
1230
+ self . struct_span_err ( lit . span , "non-string ABI literal" )
1234
1231
. span_suggestion (
1235
- span,
1232
+ lit . span ,
1236
1233
"specify the ABI with a string literal" ,
1237
1234
"\" C\" " . to_string ( ) ,
1238
1235
Applicability :: MaybeIncorrect ,
1239
1236
)
1240
1237
. emit ( ) ;
1238
+ None
1241
1239
}
1242
1240
}
1241
+ Err ( None ) => None ,
1243
1242
}
1244
- None
1245
1243
}
1246
1244
1247
1245
/// We are parsing `async fn`. If we are on Rust 2015, emit an error.
@@ -1333,34 +1331,6 @@ impl<'a> Parser<'a> {
1333
1331
self . look_ahead ( 1 , |t| * t == token:: OpenDelim ( token:: Brace ) ||
1334
1332
* t == token:: BinOp ( token:: Star ) )
1335
1333
}
1336
-
1337
- fn parse_optional_str ( & mut self ) -> Option < ( Symbol , ast:: StrStyle , Option < ast:: Name > ) > {
1338
- let ret = match self . token . kind {
1339
- token:: Literal ( token:: Lit { kind : token:: Str , symbol, suffix } ) =>
1340
- ( symbol, ast:: StrStyle :: Cooked , suffix) ,
1341
- token:: Literal ( token:: Lit { kind : token:: StrRaw ( n) , symbol, suffix } ) =>
1342
- ( symbol, ast:: StrStyle :: Raw ( n) , suffix) ,
1343
- _ => return None
1344
- } ;
1345
- self . bump ( ) ;
1346
- Some ( ret)
1347
- }
1348
-
1349
- pub fn parse_str ( & mut self ) -> PResult < ' a , ( Symbol , StrStyle ) > {
1350
- match self . parse_optional_str ( ) {
1351
- Some ( ( s, style, suf) ) => {
1352
- let sp = self . prev_span ;
1353
- self . expect_no_suffix ( sp, "a string literal" , suf) ;
1354
- Ok ( ( s, style) )
1355
- }
1356
- _ => {
1357
- let msg = "expected string literal" ;
1358
- let mut err = self . fatal ( msg) ;
1359
- err. span_label ( self . token . span , msg) ;
1360
- Err ( err)
1361
- }
1362
- }
1363
- }
1364
1334
}
1365
1335
1366
1336
crate fn make_unclosed_delims_error (
0 commit comments