1
1
import type { AST } from "svelte-eslint-parser"
2
2
import type * as ESTree from "estree"
3
+ import type { TSESTree } from "@typescript-eslint/types"
3
4
import type { ASTNode } from "../../types"
4
5
import type { IndentContext } from "./commons"
5
6
import { getFirstAndLastTokens } from "./commons"
@@ -35,10 +36,7 @@ type NodeListener = {
35
36
* @param context The rule context.
36
37
* @returns AST event handlers.
37
38
*/
38
- export function defineVisitor ( context : IndentContext ) : NodeListener & {
39
- ":expression" : ( node : ESTree . Expression ) => void
40
- ":statement" : ( node : ESTree . Statement ) => void
41
- } {
39
+ export function defineVisitor ( context : IndentContext ) : NodeListener {
42
40
const { sourceCode, options, setOffsetBaseLine, setOffset } = context
43
41
44
42
/**
@@ -80,13 +78,12 @@ export function defineVisitor(context: IndentContext): NodeListener & {
80
78
}
81
79
} ,
82
80
ArrayExpression ( node : ESTree . ArrayExpression | ESTree . ArrayPattern ) {
83
- setOffsetNodes (
84
- context ,
85
- node . elements ,
86
- sourceCode . getFirstToken ( node ) ,
87
- sourceCode . getLastToken ( node ) ,
88
- 1 ,
81
+ const firstToken = sourceCode . getFirstToken ( node )
82
+ const rightToken = sourceCode . getTokenAfter (
83
+ node . elements [ node . elements . length - 1 ] || firstToken ,
84
+ { filter : isClosingBracketToken , includeComments : false } ,
89
85
)
86
+ setOffsetNodes ( context , node . elements , firstToken , rightToken , 1 )
90
87
} ,
91
88
ArrayPattern ( node : ESTree . ArrayPattern ) {
92
89
visitor . ArrayExpression ( node )
@@ -250,7 +247,7 @@ export function defineVisitor(context: IndentContext): NodeListener & {
250
247
setOffset ( sourceCode . getFirstToken ( node . id ) , 1 , classToken )
251
248
}
252
249
if ( node . superClass != null ) {
253
- const extendsToken = sourceCode . getTokenAfter ( node . id || classToken ) !
250
+ const extendsToken = sourceCode . getTokenBefore ( node . superClass ) !
254
251
const superClassToken = sourceCode . getTokenAfter ( extendsToken )
255
252
setOffset ( extendsToken , 1 , classToken )
256
253
setOffset ( superClassToken , 1 , extendsToken )
@@ -461,43 +458,49 @@ export function defineVisitor(context: IndentContext): NodeListener & {
461
458
) {
462
459
const firstToken = sourceCode . getFirstToken ( node )
463
460
let leftParenToken , bodyBaseToken
464
- if ( isOpeningParenToken ( firstToken ) ) {
461
+ if ( firstToken . type === "Punctuator" ) {
465
462
// method
466
463
leftParenToken = firstToken
467
464
bodyBaseToken = sourceCode . getFirstToken ( getParent ( node ) ! )
468
465
} else {
469
- const functionToken = node . async
470
- ? sourceCode . getTokenAfter ( firstToken ) !
471
- : firstToken
472
- const starToken = node . generator
473
- ? sourceCode . getTokenAfter ( functionToken )
474
- : null
475
- const idToken = node . id && sourceCode . getFirstToken ( node . id )
476
-
477
- if ( node . async ) {
478
- setOffset ( functionToken , 0 , firstToken )
479
- }
480
- if ( node . generator ) {
481
- setOffset ( starToken , 1 , firstToken )
482
- }
483
- if ( node . id != null ) {
484
- setOffset ( idToken , 1 , firstToken )
466
+ let nextToken = sourceCode . getTokenAfter ( firstToken )
467
+ let nextTokenOffset = 0
468
+ while (
469
+ nextToken &&
470
+ ! isOpeningParenToken ( nextToken ) &&
471
+ nextToken . value !== "<"
472
+ ) {
473
+ if (
474
+ nextToken . value === "*" ||
475
+ ( node . id && nextToken . range [ 0 ] === node . id . range ! [ 0 ] )
476
+ ) {
477
+ nextTokenOffset = 1
478
+ }
479
+ setOffset ( nextToken , nextTokenOffset , firstToken )
480
+ nextToken = sourceCode . getTokenAfter ( nextToken )
485
481
}
486
482
483
+ leftParenToken = nextToken !
484
+ bodyBaseToken = firstToken
485
+ }
486
+
487
+ if (
488
+ ! isOpeningParenToken ( leftParenToken ) &&
489
+ ( node as TSESTree . FunctionExpression ) . typeParameters
490
+ ) {
487
491
leftParenToken = sourceCode . getTokenAfter (
488
- idToken || starToken || functionToken ,
492
+ ( node as TSESTree . FunctionExpression ) . typeParameters ! ,
489
493
) !
490
- bodyBaseToken = firstToken
491
494
}
492
495
493
496
const rightParenToken = sourceCode . getTokenAfter (
494
497
node . params [ node . params . length - 1 ] || leftParenToken ,
495
498
{ filter : isClosingParenToken , includeComments : false } ,
496
499
) !
497
- const bodyToken = sourceCode . getFirstToken ( node . body )
498
-
499
500
setOffset ( leftParenToken , 1 , bodyBaseToken )
500
501
setOffsetNodes ( context , node . params , leftParenToken , rightParenToken , 1 )
502
+
503
+ const bodyToken = sourceCode . getFirstToken ( node . body )
501
504
setOffset ( bodyToken , 0 , bodyBaseToken )
502
505
} ,
503
506
FunctionExpression ( node : ESTree . FunctionExpression ) {
@@ -709,22 +712,13 @@ export function defineVisitor(context: IndentContext): NodeListener & {
709
712
lastKeyToken = keyTokens . lastToken
710
713
}
711
714
712
- if (
713
- node . type === "MethodDefinition" ||
714
- ( node . type === "Property" && node . method === true )
715
- ) {
716
- const leftParenToken = sourceCode . getTokenAfter ( lastKeyToken )
717
- setOffset ( leftParenToken , 1 , lastKeyToken )
718
- } else if ( node . type === "Property" && ! node . shorthand ) {
719
- const colonToken = sourceCode . getTokenAfter ( lastKeyToken ) !
720
- const valueToken = sourceCode . getTokenAfter ( colonToken )
721
-
722
- setOffset ( [ colonToken , valueToken ] , 1 , lastKeyToken )
723
- } else if ( node . type === "PropertyDefinition" && node . value != null ) {
724
- const eqToken = sourceCode . getTokenAfter ( lastKeyToken ) !
725
- const initToken = sourceCode . getTokenAfter ( eqToken )
726
-
727
- setOffset ( [ eqToken , initToken ] , 1 , lastKeyToken )
715
+ if ( node . value ) {
716
+ const initToken = sourceCode . getFirstToken ( node . value )
717
+ setOffset (
718
+ [ ...sourceCode . getTokensBetween ( lastKeyToken , initToken ) , initToken ] ,
719
+ 1 ,
720
+ lastKeyToken ,
721
+ )
728
722
}
729
723
} ,
730
724
Property ( node : ESTree . Property ) {
@@ -753,13 +747,12 @@ export function defineVisitor(context: IndentContext): NodeListener & {
753
747
}
754
748
} ,
755
749
ObjectExpression ( node : ESTree . ObjectExpression | ESTree . ObjectPattern ) {
756
- setOffsetNodes (
757
- context ,
758
- node . properties ,
759
- sourceCode . getFirstToken ( node ) ,
760
- sourceCode . getLastToken ( node ) ,
761
- 1 ,
750
+ const firstToken = sourceCode . getFirstToken ( node )
751
+ const rightToken = sourceCode . getTokenAfter (
752
+ node . properties [ node . properties . length - 1 ] || firstToken ,
753
+ { filter : isClosingBraceToken , includeComments : false } ,
762
754
)
755
+ setOffsetNodes ( context , node . properties , firstToken , rightToken , 1 )
763
756
} ,
764
757
ObjectPattern ( node : ESTree . ObjectPattern ) {
765
758
visitor . ObjectExpression ( node )
@@ -929,9 +922,6 @@ export function defineVisitor(context: IndentContext): NodeListener & {
929
922
DebuggerStatement ( ) {
930
923
// noop
931
924
} ,
932
- EmptyStatement ( ) {
933
- // noop
934
- } ,
935
925
Identifier ( ) {
936
926
// noop
937
927
} ,
@@ -962,17 +952,20 @@ export function defineVisitor(context: IndentContext): NodeListener & {
962
952
ChainExpression ( ) {
963
953
// noop
964
954
} ,
955
+ EmptyStatement ( ) {
956
+ // noop
957
+ } ,
965
958
}
966
959
967
- return {
968
- ... visitor ,
969
- ":statement" ( node : ESTree . Statement ) {
960
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ignore
961
+ const commonVisitor : any = {
962
+ ":statement, PropertyDefinition " ( node : ESTree . Statement ) {
970
963
const firstToken = sourceCode . getFirstToken ( node )
971
964
const lastToken = sourceCode . getLastToken ( node )
972
965
if ( isSemicolonToken ( lastToken ) && firstToken !== lastToken ) {
973
966
const next = sourceCode . getTokenAfter ( lastToken )
974
967
if ( ! next || lastToken . loc . start . line < next . loc . start . line ) {
975
- // Lone semicolons
968
+ // End of line semicolons
976
969
setOffset ( lastToken , 0 , firstToken )
977
970
}
978
971
}
@@ -998,6 +991,12 @@ export function defineVisitor(context: IndentContext): NodeListener & {
998
991
}
999
992
} ,
1000
993
}
994
+ const v : NodeListener = visitor
995
+
996
+ return {
997
+ ...v ,
998
+ ...commonVisitor ,
999
+ }
1001
1000
}
1002
1001
1003
1002
/** Get the parent node from the given node */
0 commit comments