11import type { AST } from "svelte-eslint-parser"
22import type * as ESTree from "estree"
3+ import type { TSESTree } from "@typescript-eslint/types"
34import type { ASTNode } from "../../types"
45import type { IndentContext } from "./commons"
56import { getFirstAndLastTokens } from "./commons"
@@ -35,10 +36,7 @@ type NodeListener = {
3536 * @param context The rule context.
3637 * @returns AST event handlers.
3738 */
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 {
4240 const { sourceCode, options, setOffsetBaseLine, setOffset } = context
4341
4442 /**
@@ -80,13 +78,12 @@ export function defineVisitor(context: IndentContext): NodeListener & {
8078 }
8179 } ,
8280 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 } ,
8985 )
86+ setOffsetNodes ( context , node . elements , firstToken , rightToken , 1 )
9087 } ,
9188 ArrayPattern ( node : ESTree . ArrayPattern ) {
9289 visitor . ArrayExpression ( node )
@@ -250,7 +247,7 @@ export function defineVisitor(context: IndentContext): NodeListener & {
250247 setOffset ( sourceCode . getFirstToken ( node . id ) , 1 , classToken )
251248 }
252249 if ( node . superClass != null ) {
253- const extendsToken = sourceCode . getTokenAfter ( node . id || classToken ) !
250+ const extendsToken = sourceCode . getTokenBefore ( node . superClass ) !
254251 const superClassToken = sourceCode . getTokenAfter ( extendsToken )
255252 setOffset ( extendsToken , 1 , classToken )
256253 setOffset ( superClassToken , 1 , extendsToken )
@@ -461,43 +458,49 @@ export function defineVisitor(context: IndentContext): NodeListener & {
461458 ) {
462459 const firstToken = sourceCode . getFirstToken ( node )
463460 let leftParenToken , bodyBaseToken
464- if ( isOpeningParenToken ( firstToken ) ) {
461+ if ( firstToken . type === "Punctuator" ) {
465462 // method
466463 leftParenToken = firstToken
467464 bodyBaseToken = sourceCode . getFirstToken ( getParent ( node ) ! )
468465 } 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 )
485481 }
486482
483+ leftParenToken = nextToken !
484+ bodyBaseToken = firstToken
485+ }
486+
487+ if (
488+ ! isOpeningParenToken ( leftParenToken ) &&
489+ ( node as TSESTree . FunctionExpression ) . typeParameters
490+ ) {
487491 leftParenToken = sourceCode . getTokenAfter (
488- idToken || starToken || functionToken ,
492+ ( node as TSESTree . FunctionExpression ) . typeParameters ! ,
489493 ) !
490- bodyBaseToken = firstToken
491494 }
492495
493496 const rightParenToken = sourceCode . getTokenAfter (
494497 node . params [ node . params . length - 1 ] || leftParenToken ,
495498 { filter : isClosingParenToken , includeComments : false } ,
496499 ) !
497- const bodyToken = sourceCode . getFirstToken ( node . body )
498-
499500 setOffset ( leftParenToken , 1 , bodyBaseToken )
500501 setOffsetNodes ( context , node . params , leftParenToken , rightParenToken , 1 )
502+
503+ const bodyToken = sourceCode . getFirstToken ( node . body )
501504 setOffset ( bodyToken , 0 , bodyBaseToken )
502505 } ,
503506 FunctionExpression ( node : ESTree . FunctionExpression ) {
@@ -709,22 +712,13 @@ export function defineVisitor(context: IndentContext): NodeListener & {
709712 lastKeyToken = keyTokens . lastToken
710713 }
711714
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+ )
728722 }
729723 } ,
730724 Property ( node : ESTree . Property ) {
@@ -753,13 +747,12 @@ export function defineVisitor(context: IndentContext): NodeListener & {
753747 }
754748 } ,
755749 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 } ,
762754 )
755+ setOffsetNodes ( context , node . properties , firstToken , rightToken , 1 )
763756 } ,
764757 ObjectPattern ( node : ESTree . ObjectPattern ) {
765758 visitor . ObjectExpression ( node )
@@ -929,9 +922,6 @@ export function defineVisitor(context: IndentContext): NodeListener & {
929922 DebuggerStatement ( ) {
930923 // noop
931924 } ,
932- EmptyStatement ( ) {
933- // noop
934- } ,
935925 Identifier ( ) {
936926 // noop
937927 } ,
@@ -962,17 +952,20 @@ export function defineVisitor(context: IndentContext): NodeListener & {
962952 ChainExpression ( ) {
963953 // noop
964954 } ,
955+ EmptyStatement ( ) {
956+ // noop
957+ } ,
965958 }
966959
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 ) {
970963 const firstToken = sourceCode . getFirstToken ( node )
971964 const lastToken = sourceCode . getLastToken ( node )
972965 if ( isSemicolonToken ( lastToken ) && firstToken !== lastToken ) {
973966 const next = sourceCode . getTokenAfter ( lastToken )
974967 if ( ! next || lastToken . loc . start . line < next . loc . start . line ) {
975- // Lone semicolons
968+ // End of line semicolons
976969 setOffset ( lastToken , 0 , firstToken )
977970 }
978971 }
@@ -998,6 +991,12 @@ export function defineVisitor(context: IndentContext): NodeListener & {
998991 }
999992 } ,
1000993 }
994+ const v : NodeListener = visitor
995+
996+ return {
997+ ...v ,
998+ ...commonVisitor ,
999+ }
10011000}
10021001
10031002/** Get the parent node from the given node */
0 commit comments