Skip to content

Commit e42f737

Browse files
Improve indent rule to support more ts syntax (#2042)
Co-authored-by: Flo Edelmann <[email protected]>
1 parent 89fb2fe commit e42f737

14 files changed

+196
-23
lines changed

lib/utils/indent-common.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,11 +1171,18 @@ module.exports.defineVisitor = function create(
11711171
const firstToken = tokenStore.getFirstToken(node)
11721172
const rightToken = tokenStore.getLastToken(node)
11731173
const leftToken = /** @type {Token} */ (
1174-
tokenStore.getTokenAfter(node.callee, isOpeningParenToken)
1174+
tokenStore.getTokenAfter(
1175+
node.typeParameters || node.callee,
1176+
isOpeningParenToken
1177+
)
11751178
)
11761179

1180+
if (node.typeParameters) {
1181+
setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken)
1182+
}
1183+
11771184
for (const optionalToken of tokenStore.getTokensBetween(
1178-
tokenStore.getLastToken(node.callee),
1185+
tokenStore.getLastToken(node.typeParameters || node.callee),
11791186
leftToken,
11801187
isOptionalToken
11811188
)) {
@@ -1692,12 +1699,16 @@ module.exports.defineVisitor = function create(
16921699
const rightToken = tokenStore.getLastToken(node)
16931700
const leftToken = isClosingParenToken(rightToken)
16941701
? tokenStore.getFirstTokenBetween(
1695-
node.callee,
1702+
node.typeParameters || node.callee,
16961703
rightToken,
16971704
isOpeningParenToken
16981705
)
16991706
: null
17001707

1708+
if (node.typeParameters) {
1709+
setOffset(tokenStore.getFirstToken(node.typeParameters), 1, calleeToken)
1710+
}
1711+
17011712
setOffset(calleeToken, 1, newToken)
17021713
if (leftToken != null) {
17031714
setOffset(leftToken, 1, calleeToken)

lib/utils/indent-ts.js

Lines changed: 77 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const { isTypeNode } = require('./ts-ast-utils')
2929
* @typedef {import('@typescript-eslint/types').TSESTree.TSImportEqualsDeclaration} TSImportEqualsDeclaration
3030
* @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractMethodDefinition} TSAbstractMethodDefinition
3131
* @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractPropertyDefinition} TSAbstractPropertyDefinition
32+
* @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractAccessorProperty} TSAbstractAccessorProperty
3233
* @typedef {import('@typescript-eslint/types').TSESTree.TSEnumMember} TSEnumMember
3334
* @typedef {import('@typescript-eslint/types').TSESTree.TSPropertySignature} TSPropertySignature
3435
* @typedef {import('@typescript-eslint/types').TSESTree.TSIndexSignature} TSIndexSignature
@@ -50,6 +51,10 @@ const { isTypeNode } = require('./ts-ast-utils')
5051
* @typedef {import('@typescript-eslint/types').TSESTree.TSInferType} TSInferType
5152
* @typedef {import('@typescript-eslint/types').TSESTree.TSOptionalType} TSOptionalType
5253
* @typedef {import('@typescript-eslint/types').TSESTree.TSNonNullExpression} TSNonNullExpression
54+
* @typedef {import('@typescript-eslint/types').TSESTree.TSAsExpression} TSAsExpression
55+
* @typedef {import('@typescript-eslint/types').TSESTree.TSSatisfiesExpression} TSSatisfiesExpression
56+
* @typedef {import('@typescript-eslint/types').TSESTree.TSTypeReference} TSTypeReference
57+
* @typedef {import('@typescript-eslint/types').TSESTree.TSInstantiationExpression} TSInstantiationExpression
5358
* @typedef {import('@typescript-eslint/types').TSESTree.JSXChild} JSXChild
5459
* @typedef {import('@typescript-eslint/types').TSESTree.TypeNode} TypeNode
5560
*
@@ -206,15 +211,16 @@ function defineVisitor({
206211
* | TSImportEqualsDeclaration
207212
* | TSAbstractMethodDefinition
208213
* | TSAbstractPropertyDefinition
209-
* | TSAbstractClassProperty
214+
* | TSAbstractAccessorProperty
210215
* | TSEnumMember
211-
* | ClassProperty
212216
* | TSPropertySignature
213217
* | TSIndexSignature
214-
* | TSMethodSignature} node
218+
* | TSMethodSignature
219+
* | ClassProperty
220+
* | TSAbstractClassProperty} node
215221
*/
216222
['TSTypeAliasDeclaration, TSCallSignatureDeclaration, TSConstructSignatureDeclaration, TSImportEqualsDeclaration,' +
217-
'TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember,' +
223+
'TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSAbstractAccessorProperty, TSEnumMember,' +
218224
'TSPropertySignature, TSIndexSignature, TSMethodSignature,' +
219225
// Deprecated in @typescript-eslint/parser v5
220226
'ClassProperty, TSAbstractClassProperty'](node) {
@@ -279,40 +285,57 @@ function defineVisitor({
279285
}
280286
},
281287
/**
282-
* Process as expression
288+
* Process as expression or satisfies expression
283289
*
284290
* e.g.
285291
* ```
286292
* var foo = bar as boolean
287293
* // ^^^^^^^^^^^^^^
288294
* ```
295+
*
296+
* e.g.
297+
* ```
298+
* var foo = bar satisfies Bar
299+
* // ^^^^^^^^^^^^^^^^^
300+
* ```
301+
*
302+
* @param {TSAsExpression | TSSatisfiesExpression} node
289303
*/
290-
TSAsExpression(node) {
304+
'TSAsExpression, TSSatisfiesExpression'(node) {
291305
const expressionTokens = getFirstAndLastTokens(node.expression)
292-
const asToken = tokenStore.getTokenAfter(expressionTokens.lastToken)
306+
const asOrSatisfiesToken = tokenStore.getTokenAfter(
307+
expressionTokens.lastToken
308+
)
293309
setOffset(
294-
[asToken, getFirstAndLastTokens(node.typeAnnotation).firstToken],
310+
[
311+
asOrSatisfiesToken,
312+
getFirstAndLastTokens(node.typeAnnotation).firstToken
313+
],
295314
1,
296315
expressionTokens.firstToken
297316
)
298317
},
299318
/**
300-
* Process type reference
319+
* Process type reference and instantiation expression
301320
*
302321
* e.g.
303322
* ```
304323
* const foo: Type<P>
305324
* // ^^^^^^^
306325
* ```
326+
*
327+
* e.g.
328+
* ```
329+
* const ErrorMap = Map<string, Error>;
330+
* // ^^^^^^^^^^^^^^^^^^
331+
* ```
332+
*
333+
* @param {TSTypeReference | TSInstantiationExpression} node
307334
*/
308-
TSTypeReference(node) {
335+
'TSTypeReference, TSInstantiationExpression'(node) {
309336
if (node.typeParameters) {
310-
const typeNameTokens = getFirstAndLastTokens(node.typeName)
311-
setOffset(
312-
tokenStore.getFirstToken(node.typeParameters),
313-
1,
314-
typeNameTokens.firstToken
315-
)
337+
const firstToken = tokenStore.getFirstToken(node)
338+
setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken)
316339
}
317340
},
318341
/**
@@ -1053,10 +1076,10 @@ function defineVisitor({
10531076
* // ^^^^^^^
10541077
* ```
10551078
*
1056-
* @param {TSAbstractMethodDefinition | TSAbstractPropertyDefinition | TSEnumMember | TSAbstractClassProperty | ClassProperty} node
1079+
* @param {TSAbstractMethodDefinition | TSAbstractPropertyDefinition | TSAbstractAccessorProperty | TSEnumMember | TSAbstractClassProperty | ClassProperty} node
10571080
*
10581081
*/
1059-
['TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember,' +
1082+
['TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSAbstractAccessorProperty, TSEnumMember,' +
10601083
// Deprecated in @typescript-eslint/parser v5
10611084
'ClassProperty, TSAbstractClassProperty'](node) {
10621085
const { keyNode, valueNode } =
@@ -1302,6 +1325,42 @@ function defineVisitor({
13021325
setOffset(atToken, 0, tokenStore.getFirstToken(decorators[0]))
13031326
}
13041327
},
1328+
AccessorProperty(node) {
1329+
const keyNode = node.key
1330+
const valueNode = node.value
1331+
const firstToken = tokenStore.getFirstToken(node)
1332+
const keyTokens = getFirstAndLastTokens(keyNode)
1333+
const prefixTokens = tokenStore.getTokensBetween(
1334+
firstToken,
1335+
keyTokens.firstToken
1336+
)
1337+
if (node.computed) {
1338+
prefixTokens.pop() // pop opening bracket character (`[`)
1339+
}
1340+
setOffset(prefixTokens, 0, firstToken)
1341+
let lastKeyToken
1342+
if (node.computed) {
1343+
const leftBracketToken = tokenStore.getTokenBefore(keyTokens.firstToken)
1344+
const rightBracketToken = (lastKeyToken = tokenStore.getTokenAfter(
1345+
keyTokens.lastToken
1346+
))
1347+
setOffset(leftBracketToken, 0, firstToken)
1348+
processNodeList([keyNode], leftBracketToken, rightBracketToken, 1)
1349+
} else {
1350+
setOffset(keyTokens.firstToken, 0, firstToken)
1351+
lastKeyToken = keyTokens.lastToken
1352+
}
1353+
1354+
if (valueNode != null) {
1355+
const initToken = tokenStore.getFirstToken(valueNode)
1356+
setOffset(
1357+
[...tokenStore.getTokensBetween(lastKeyToken, initToken), initToken],
1358+
1,
1359+
lastKeyToken
1360+
)
1361+
}
1362+
processSemicolons(node)
1363+
},
13051364
ImportAttribute(node) {
13061365
const firstToken = tokenStore.getFirstToken(node)
13071366
const keyTokens = getFirstAndLastTokens(node.key)

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"@types/node": "^13.13.5",
7272
"@types/semver": "^7.3.9",
7373
"@types/xml-name-validator": "^4.0.0",
74-
"@typescript-eslint/parser": "^5.23.0",
74+
"@typescript-eslint/parser": "^5.45.0",
7575
"assert": "^2.0.0",
7676
"env-cmd": "^10.1.0",
7777
"esbuild": "^0.15.15",
@@ -90,7 +90,7 @@
9090
"mocha": "^10.0.0",
9191
"nyc": "^15.1.0",
9292
"prettier": "^2.6.2",
93-
"typescript": "^4.6.4",
93+
"typescript": "^4.9.3",
9494
"vitepress": "^1.0.0-alpha.29"
9595
}
9696
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.1-alpha.15"}}-->
2+
<script lang="ts">
3+
abstract class Foo {
4+
abstract accessor
5+
foo:
6+
number
7+
// parser v5 does not parse value.
8+
// =
9+
// 1
10+
;
11+
}
12+
</script>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.1-alpha.15"}}-->
2+
<script lang="ts">
3+
class Foo {
4+
accessor
5+
foo
6+
;
7+
}
8+
</script>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.1-alpha.15"}}-->
2+
<script lang="ts">
3+
class Foo {
4+
accessor
5+
foo
6+
=
7+
2
8+
;
9+
}
10+
</script>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.1-alpha.15"}}-->
2+
<script lang="ts">
3+
class Foo {
4+
declare accessor
5+
foo:
6+
number
7+
;
8+
}
9+
</script>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.1-alpha.15"}}-->
2+
<script lang="ts">
3+
class Foo {
4+
override accessor
5+
foo
6+
=
7+
2
8+
;
9+
}
10+
</script>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.1-alpha.15"}}-->
2+
<script lang="ts">
3+
class Foo {
4+
accessor
5+
[
6+
1
7+
]
8+
=
9+
2
10+
;
11+
}
12+
</script>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}}-->
2+
<script lang="ts">
3+
foo
4+
<
5+
T
6+
,
7+
U
8+
>
9+
(
10+
arg
11+
)
12+
</script>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.0"}}-->
2+
<script lang="ts">
3+
const ErrorMap = Map
4+
<
5+
string,
6+
Error
7+
>;
8+
</script>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}}-->
2+
<script lang="ts">
3+
const foo = new
4+
Foo
5+
<
6+
T
7+
,
8+
U
9+
>
10+
(
11+
arg
12+
)
13+
</script>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!--{"parserOptions": {"parser":"@typescript-eslint/parser"}, "requirements": { "@typescript-eslint/parser": ">=5.44.0" } }-->
2+
<script lang="ts">
3+
var a =
4+
{} satisfies
5+
Foo
6+
var b =
7+
{} satisfies Bar
8+
</script>

typings/eslint-plugin-vue/util-types/ast/es-ast.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ export interface NewExpression extends HasParentNode {
525525
type: 'NewExpression'
526526
callee: Expression
527527
arguments: (Expression | SpreadElement)[]
528+
typeParameters?: TSTypeParameterInstantiation
528529
}
529530
interface BaseMemberExpression extends HasParentNode {
530531
type: 'MemberExpression'

0 commit comments

Comments
 (0)