@@ -18,6 +18,7 @@ const KNOWN_NODES = new Set(['ArrayExpression', 'ArrayPattern', 'ArrowFunctionEx
18
18
const LT_CHAR = / [ \r \n \u2028 \u2029 ] /
19
19
const LINES = / [ ^ \r \n \u2028 \u2029 ] + (?: $ | \r \n | [ \r \n \u2028 \u2029 ] ) / g
20
20
const BLOCK_COMMENT_PREFIX = / ^ \s * \* /
21
+ const TRIVIAL_PUNCTUATOR = / ^ [ ( ) { } [ \] , ; ] $ /
21
22
22
23
/**
23
24
* Normalize options.
@@ -244,6 +245,21 @@ function isClosingToken (token) {
244
245
)
245
246
}
246
247
248
+ /**
249
+ * Check whether a given token is trivial or not.
250
+ * @param {Token } token The token to check.
251
+ * @returns {boolean } `true` if the token is trivial.
252
+ */
253
+ function isTrivialToken ( token ) {
254
+ return token != null && (
255
+ ( token . type === 'Punctuator' && TRIVIAL_PUNCTUATOR . test ( token . value ) ) ||
256
+ token . type === 'HTMLTagOpen' ||
257
+ token . type === 'HTMLEndTagOpen' ||
258
+ token . type === 'HTMLTagClose' ||
259
+ token . type === 'HTMLSelfClosingTagClose'
260
+ )
261
+ }
262
+
247
263
/**
248
264
* Creates AST event handlers for html-indent.
249
265
*
@@ -262,6 +278,7 @@ module.exports.defineVisitor = function create (context, tokenStore, defaultOpti
262
278
* @param {Token|Token[] } token The token to set.
263
279
* @param {number } offset The offset of the tokens.
264
280
* @param {Token } baseToken The token of the base offset.
281
+ * @param {boolean } [trivial=false] The flag for trivial tokens.
265
282
* @returns {void }
266
283
*/
267
284
function setOffset ( token , offset , baseToken ) {
@@ -352,9 +369,7 @@ module.exports.defineVisitor = function create (context, tokenStore, defaultOpti
352
369
if ( lastToken != null ) {
353
370
t = lastToken
354
371
while ( ( t = tokenStore . getTokenAfter ( t ) ) != null && t . range [ 1 ] <= elementTokens . firstToken . range [ 0 ] ) {
355
- if ( lastToken . loc . end . line !== t . loc . start . line ) {
356
- alignTokens . push ( t )
357
- }
372
+ alignTokens . push ( t )
358
373
}
359
374
}
360
375
alignTokens . push ( elementTokens . firstToken )
@@ -550,13 +565,15 @@ module.exports.defineVisitor = function create (context, tokenStore, defaultOpti
550
565
* @returns {number } Correct indentation. If it failed to calculate then `Number.MAX_SAFE_INTEGER`.
551
566
*/
552
567
function getExpectedIndent ( tokens ) {
568
+ const trivial = isTrivialToken ( tokens [ 0 ] )
553
569
let expectedIndent = Number . MAX_SAFE_INTEGER
554
570
555
571
for ( let i = 0 ; i < tokens . length ; ++ i ) {
556
572
const token = tokens [ i ]
557
573
const offsetInfo = offsets . get ( token )
558
574
559
- if ( offsetInfo != null ) {
575
+ // If the first token is not trivial then ignore trivial following tokens.
576
+ if ( offsetInfo != null && ( trivial || ! isTrivialToken ( token ) ) ) {
560
577
if ( offsetInfo . expectedIndent != null ) {
561
578
expectedIndent = Math . min ( expectedIndent , offsetInfo . expectedIndent )
562
579
} else {
@@ -1429,24 +1446,23 @@ module.exports.defineVisitor = function create (context, tokenStore, defaultOpti
1429
1446
// Process semicolons.
1430
1447
':statement' ( node ) {
1431
1448
const info = offsets . get ( tokenStore . getFirstToken ( node ) )
1449
+ const lastToken = tokenStore . getLastToken ( node )
1432
1450
if ( info == null ) {
1433
1451
return
1434
1452
}
1453
+ if ( isSemicolon ( lastToken ) ) {
1454
+ offsets . set ( lastToken , info )
1455
+ }
1435
1456
1436
1457
// Set to the semicolon of the previous token for semicolon-free style.
1437
1458
// E.g.,
1438
1459
// foo
1439
1460
// ;[1,2,3].forEach(f)
1440
- const tokens = [
1441
- tokenStore . getTokenBefore ( node ) ,
1442
- tokenStore . getLastToken ( node )
1443
- ] . filter ( isSemicolon )
1444
-
1445
- // Set offsets if the semicolon is at beginning of line.
1446
- for ( const token of tokens ) {
1447
- const prevToken = tokenStore . getTokenBefore ( token )
1448
- if ( prevToken == null || token . loc . end . line !== prevToken . loc . start . line ) {
1449
- offsets . set ( token , info )
1461
+ const prevToken = tokenStore . getTokenBefore ( node )
1462
+ if ( isSemicolon ( prevToken ) ) {
1463
+ const prevPrevToken = tokenStore . getTokenBefore ( prevToken )
1464
+ if ( prevPrevToken == null || prevToken . loc . end . line !== prevPrevToken . loc . start . line ) {
1465
+ offsets . set ( prevToken , info )
1450
1466
}
1451
1467
}
1452
1468
} ,
0 commit comments