@@ -50,6 +50,7 @@ const KNOWN_NODES = new Set([
50
50
'IfStatement' ,
51
51
'ImportDeclaration' ,
52
52
'ImportDefaultSpecifier' ,
53
+ 'ImportExpression' ,
53
54
'ImportNamespaceSpecifier' ,
54
55
'ImportSpecifier' ,
55
56
'LabeledStatement' ,
@@ -61,6 +62,8 @@ const KNOWN_NODES = new Set([
61
62
'NewExpression' ,
62
63
'ObjectExpression' ,
63
64
'ObjectPattern' ,
65
+ 'OptionalCallExpression' ,
66
+ 'OptionalMemberExpression' ,
64
67
'Program' ,
65
68
'Property' ,
66
69
'RestElement' ,
@@ -99,6 +102,7 @@ const KNOWN_NODES = new Set([
99
102
'VStartTag' ,
100
103
'VText'
101
104
] )
105
+
102
106
const LT_CHAR = / [ \r \n \u2028 \u2029 ] /
103
107
const LINES = / [ ^ \r \n \u2028 \u2029 ] + (?: $ | \r \n | [ \r \n \u2028 \u2029 ] ) / g
104
108
const BLOCK_COMMENT_PREFIX = / ^ \s * \* /
@@ -290,6 +294,14 @@ function isSemicolon(token) {
290
294
function isComma ( token ) {
291
295
return token != null && token . type === 'Punctuator' && token . value === ','
292
296
}
297
+ /**
298
+ * Check whether the given token is a wildcard.
299
+ * @param {Token } token The token to check.
300
+ * @returns {boolean } `true` if the token is a wildcard.
301
+ */
302
+ function isWildcard ( token ) {
303
+ return token != null && token . type === 'Punctuator' && token . value === '*'
304
+ }
293
305
294
306
/**
295
307
* Check whether the given token is a whitespace.
@@ -704,7 +716,11 @@ module.exports.defineVisitor = function create(
704
716
}
705
717
return true
706
718
}
707
- if ( t === 'CallExpression' || t === 'NewExpression' ) {
719
+ if (
720
+ t === 'CallExpression' ||
721
+ t === 'NewExpression' ||
722
+ t === 'OptionalCallExpression'
723
+ ) {
708
724
const openParen = tokenStore . getTokenAfter (
709
725
parent . callee ,
710
726
isNotRightParen
@@ -1290,7 +1306,7 @@ module.exports.defineVisitor = function create(
1290
1306
}
1291
1307
} ,
1292
1308
1293
- CallExpression ( node ) {
1309
+ ' CallExpression, OptionalCallExpression' ( node ) {
1294
1310
const firstToken = tokenStore . getFirstToken ( node )
1295
1311
const rightToken = tokenStore . getLastToken ( node )
1296
1312
const leftToken = tokenStore . getTokenAfter ( node . callee , isLeftParen )
@@ -1299,6 +1315,15 @@ module.exports.defineVisitor = function create(
1299
1315
processNodeList ( node . arguments , leftToken , rightToken , 1 )
1300
1316
} ,
1301
1317
1318
+ ImportExpression ( node ) {
1319
+ const firstToken = tokenStore . getFirstToken ( node )
1320
+ const rightToken = tokenStore . getLastToken ( node )
1321
+ const leftToken = tokenStore . getTokenAfter ( firstToken , isLeftParen )
1322
+
1323
+ setOffset ( leftToken , 1 , firstToken )
1324
+ processNodeList ( [ node . source ] , leftToken , rightToken , 1 )
1325
+ } ,
1326
+
1302
1327
CatchClause ( node ) {
1303
1328
const firstToken = tokenStore . getFirstToken ( node )
1304
1329
const bodyToken = tokenStore . getFirstToken ( node . body )
@@ -1379,7 +1404,20 @@ module.exports.defineVisitor = function create(
1379
1404
if ( isSemicolon ( last ( tokens ) ) ) {
1380
1405
tokens . pop ( )
1381
1406
}
1382
- setOffset ( tokens , 1 , firstToken )
1407
+ if ( ! node . exported ) {
1408
+ setOffset ( tokens , 1 , firstToken )
1409
+ } else {
1410
+ // export * as foo from "mod"
1411
+ const starToken = tokens . find ( isWildcard )
1412
+ const asToken = tokenStore . getTokenAfter ( starToken )
1413
+ const exportedToken = tokenStore . getTokenAfter ( asToken )
1414
+ const afterTokens = tokens . slice ( tokens . indexOf ( exportedToken ) + 1 )
1415
+
1416
+ setOffset ( starToken , 1 , firstToken )
1417
+ setOffset ( asToken , 1 , starToken )
1418
+ setOffset ( exportedToken , 1 , starToken )
1419
+ setOffset ( afterTokens , 1 , firstToken )
1420
+ }
1383
1421
} ,
1384
1422
1385
1423
ExportDefaultDeclaration ( node ) {
@@ -1397,20 +1435,25 @@ module.exports.defineVisitor = function create(
1397
1435
const declarationToken = tokenStore . getFirstToken ( node , 1 )
1398
1436
setOffset ( declarationToken , 1 , exportToken )
1399
1437
} else {
1400
- // export {foo, bar}; or export {foo, bar} from "mod";
1401
- const leftParenToken = tokenStore . getFirstToken ( node , 1 )
1402
- const rightParenToken = tokenStore . getLastToken ( node , isRightBrace )
1403
- setOffset ( leftParenToken , 0 , exportToken )
1404
- processNodeList ( node . specifiers , leftParenToken , rightParenToken , 1 )
1405
-
1406
- const maybeFromToken = tokenStore . getTokenAfter ( rightParenToken )
1407
- if (
1408
- maybeFromToken != null &&
1409
- sourceCode . getText ( maybeFromToken ) === 'from'
1410
- ) {
1411
- const fromToken = maybeFromToken
1412
- const nameToken = tokenStore . getTokenAfter ( fromToken )
1413
- setOffset ( [ fromToken , nameToken ] , 1 , exportToken )
1438
+ const firstSpecifier = node . specifiers [ 0 ]
1439
+ if ( ! firstSpecifier || firstSpecifier . type === 'ExportSpecifier' ) {
1440
+ // export {foo, bar}; or export {foo, bar} from "mod";
1441
+ const leftParenToken = tokenStore . getFirstToken ( node , 1 )
1442
+ const rightParenToken = tokenStore . getLastToken ( node , isRightBrace )
1443
+ setOffset ( leftParenToken , 0 , exportToken )
1444
+ processNodeList ( node . specifiers , leftParenToken , rightParenToken , 1 )
1445
+
1446
+ const maybeFromToken = tokenStore . getTokenAfter ( rightParenToken )
1447
+ if (
1448
+ maybeFromToken != null &&
1449
+ sourceCode . getText ( maybeFromToken ) === 'from'
1450
+ ) {
1451
+ const fromToken = maybeFromToken
1452
+ const nameToken = tokenStore . getTokenAfter ( fromToken )
1453
+ setOffset ( [ fromToken , nameToken ] , 1 , exportToken )
1454
+ }
1455
+ } else {
1456
+ // maybe babel-eslint
1414
1457
}
1415
1458
}
1416
1459
} ,
@@ -1423,7 +1466,9 @@ module.exports.defineVisitor = function create(
1423
1466
1424
1467
'ForInStatement, ForOfStatement' ( node ) {
1425
1468
const forToken = tokenStore . getFirstToken ( node )
1426
- const leftParenToken = tokenStore . getTokenAfter ( forToken )
1469
+ const awaitToken =
1470
+ ( node . await && tokenStore . getTokenAfter ( forToken ) ) || null
1471
+ const leftParenToken = tokenStore . getTokenAfter ( awaitToken || forToken )
1427
1472
const leftToken = tokenStore . getTokenAfter ( leftParenToken )
1428
1473
const inToken = tokenStore . getTokenAfter ( leftToken , isNotRightParen )
1429
1474
const rightToken = tokenStore . getTokenAfter ( inToken )
@@ -1432,6 +1477,9 @@ module.exports.defineVisitor = function create(
1432
1477
isNotLeftParen
1433
1478
)
1434
1479
1480
+ if ( awaitToken != null ) {
1481
+ setOffset ( awaitToken , 0 , forToken )
1482
+ }
1435
1483
setOffset ( leftParenToken , 1 , forToken )
1436
1484
setOffset ( leftToken , 1 , leftParenToken )
1437
1485
setOffset ( inToken , 1 , leftToken )
@@ -1623,7 +1671,7 @@ module.exports.defineVisitor = function create(
1623
1671
}
1624
1672
} ,
1625
1673
1626
- ImportNamespaceSpecifier ( node ) {
1674
+ ' ImportNamespaceSpecifier, ExportNamespaceSpecifier' ( node ) {
1627
1675
const tokens = tokenStore . getTokens ( node )
1628
1676
const firstToken = tokens . shift ( )
1629
1677
setOffset ( tokens , 1 , firstToken )
@@ -1637,7 +1685,7 @@ module.exports.defineVisitor = function create(
1637
1685
setOffset ( [ colonToken , bodyToken ] , 1 , labelToken )
1638
1686
} ,
1639
1687
1640
- 'MemberExpression, MetaProperty' ( node ) {
1688
+ 'MemberExpression, MetaProperty, OptionalMemberExpression ' ( node ) {
1641
1689
const objectToken = tokenStore . getFirstToken ( node )
1642
1690
if ( node . computed ) {
1643
1691
const leftBracketToken = tokenStore . getTokenBefore (
0 commit comments