Skip to content

Commit 6d392c4

Browse files
authored
feat: improve svelte/indent rule to support more ts syntax (#310)
1 parent a9c4912 commit 6d392c4

34 files changed

+591
-20
lines changed

.changeset/kind-boats-clean.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-svelte": minor
3+
---
4+
5+
feat: improve `svelte/indent` rule to support more ts syntax

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@
110110
"@types/postcss-safe-parser": "^5.0.1",
111111
"@types/prismjs": "^1.26.0",
112112
"@types/stylus": "^0.48.38",
113-
"@typescript-eslint/eslint-plugin": "^5.4.0",
114-
"@typescript-eslint/parser": "^5.4.1-0",
113+
"@typescript-eslint/eslint-plugin": "^5.45.0",
114+
"@typescript-eslint/parser": "^5.45.0",
115115
"@typescript-eslint/parser-v4": "npm:@typescript-eslint/parser@4",
116116
"@typescript/vfs": "^1.4.0",
117117
"assert": "^2.0.0",
@@ -164,7 +164,7 @@
164164
"svelte-adapter-ghpages": "0.0.2",
165165
"svelte-i18n": "^3.4.0",
166166
"type-coverage": "^2.22.0",
167-
"typescript": "^4.5.2",
167+
"typescript": "^4.9.3",
168168
"vite": "^3.1.0-0",
169169
"vite-plugin-svelte-md": "^0.1.5",
170170
"yaml": "^2.1.1",

src/rules/indent-helpers/es.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -187,14 +187,25 @@ export function defineVisitor(context: IndentContext): NodeListener {
187187
},
188188
CallExpression(node: TSESTree.CallExpression) {
189189
const firstToken = sourceCode.getFirstToken(node)
190-
const leftParenToken = sourceCode.getTokenAfter(node.callee, {
191-
filter: isOpeningParenToken,
192-
includeComments: false,
193-
})!
190+
const leftParenToken = sourceCode.getTokenAfter(
191+
node.typeParameters || node.callee,
192+
{
193+
filter: isOpeningParenToken,
194+
includeComments: false,
195+
},
196+
)!
194197
const rightParenToken = sourceCode.getLastToken(node)
195198

199+
if (node.typeParameters) {
200+
offsets.setOffsetToken(
201+
sourceCode.getFirstToken(node.typeParameters),
202+
1,
203+
firstToken,
204+
)
205+
}
206+
196207
for (const optionalToken of sourceCode.getTokensBetween(
197-
sourceCode.getLastToken(node.callee),
208+
sourceCode.getLastToken(node.typeParameters || node.callee),
198209
leftParenToken,
199210
{ filter: isOptionalToken, includeComments: false },
200211
)) {
@@ -817,12 +828,17 @@ export function defineVisitor(context: IndentContext): NodeListener {
817828
const calleeTokens = getFirstAndLastTokens(sourceCode, node.callee)
818829
offsets.setOffsetToken(calleeTokens.firstToken, 1, newToken)
819830

820-
if (
821-
node.arguments.length ||
822-
calleeTokens.lastToken.range[1] < node.range[1]
823-
) {
831+
if (node.typeParameters) {
832+
offsets.setOffsetToken(
833+
sourceCode.getFirstToken(node.typeParameters),
834+
1,
835+
calleeTokens.firstToken,
836+
)
837+
}
838+
const leftParenBefore = node.typeParameters || calleeTokens.lastToken
839+
if (node.arguments.length || leftParenBefore.range[1] < node.range[1]) {
824840
const rightParenToken = sourceCode.getLastToken(node)
825-
const leftParenToken = sourceCode.getTokenAfter(calleeTokens.lastToken)!
841+
const leftParenToken = sourceCode.getTokenAfter(leftParenBefore)!
826842

827843
offsets.setOffsetToken(leftParenToken, 1, calleeTokens.firstToken)
828844
offsets.setOffsetElementList(

src/rules/indent-helpers/ts.ts

Lines changed: 73 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,33 +41,53 @@ export function defineVisitor(context: IndentContext): NodeListener {
4141
offsets.setOffsetToken(before, 1, baseToken)
4242
}
4343
},
44-
TSAsExpression(node: TSESTree.TSAsExpression) {
44+
TSAsExpression(
45+
node: TSESTree.TSAsExpression | TSESTree.TSSatisfiesExpression,
46+
) {
4547
// foo as T
48+
// or
49+
// foo satisfies T
4650
const expressionTokens = getFirstAndLastTokens(
4751
sourceCode,
4852
node.expression,
4953
)
50-
const asToken = sourceCode.getTokenAfter(expressionTokens.lastToken)!
54+
const asOrSatisfiesToken = sourceCode.getTokenAfter(
55+
expressionTokens.lastToken,
56+
)!
5157
offsets.setOffsetToken(
5258
[
53-
asToken,
59+
asOrSatisfiesToken,
5460
getFirstAndLastTokens(sourceCode, node.typeAnnotation).firstToken,
5561
],
5662
1,
5763
expressionTokens.firstToken,
5864
)
5965
},
60-
TSTypeReference(node: TSESTree.TSTypeReference) {
66+
TSSatisfiesExpression(node: TSESTree.TSSatisfiesExpression) {
67+
// foo satisfies T
68+
visitor.TSAsExpression(node)
69+
},
70+
TSTypeReference(
71+
node: TSESTree.TSTypeReference | TSESTree.TSInstantiationExpression,
72+
) {
6173
// T<U>
74+
// or
75+
// const ErrorMap = Map<string, Error>
76+
// ^^^^^^^^^^^^^^^^^^
6277
if (node.typeParameters) {
63-
const typeNameTokens = getFirstAndLastTokens(sourceCode, node.typeName)
78+
const firstToken = sourceCode.getFirstToken(node)
6479
offsets.setOffsetToken(
6580
sourceCode.getFirstToken(node.typeParameters),
6681
1,
67-
typeNameTokens.firstToken,
82+
firstToken,
6883
)
6984
}
7085
},
86+
TSInstantiationExpression(node: TSESTree.TSInstantiationExpression) {
87+
// const ErrorMap = Map<string, Error>
88+
// ^^^^^^^^^^^^^^^^^^
89+
visitor.TSTypeReference(node)
90+
},
7191
TSTypeParameterInstantiation(
7292
node:
7393
| TSESTree.TSTypeParameterInstantiation
@@ -701,6 +721,7 @@ export function defineVisitor(context: IndentContext): NodeListener {
701721
node:
702722
| TSESTree.TSAbstractMethodDefinition
703723
| TSESTree.TSAbstractPropertyDefinition
724+
| TSESTree.TSAbstractAccessorProperty
704725
| TSESTree.TSEnumMember,
705726
) {
706727
const { keyNode, valueNode } =
@@ -754,6 +775,9 @@ export function defineVisitor(context: IndentContext): NodeListener {
754775
TSEnumMember(node: TSESTree.TSEnumMember) {
755776
visitor.TSAbstractMethodDefinition(node)
756777
},
778+
TSAbstractAccessorProperty(node: TSESTree.TSAbstractAccessorProperty) {
779+
visitor.TSAbstractMethodDefinition(node)
780+
},
757781
TSOptionalType(
758782
node: TSESTree.TSOptionalType | TSESTree.TSNonNullExpression,
759783
) {
@@ -960,6 +984,48 @@ export function defineVisitor(context: IndentContext): NodeListener {
960984
)
961985
}
962986
},
987+
AccessorProperty(node: TSESTree.AccessorProperty) {
988+
const keyNode = node.key
989+
const valueNode = node.value
990+
const firstToken = sourceCode.getFirstToken(node)
991+
const keyTokens = getFirstAndLastTokens(sourceCode, keyNode)
992+
const prefixTokens = sourceCode.getTokensBetween(
993+
firstToken,
994+
keyTokens.firstToken,
995+
)
996+
if (node.computed) {
997+
prefixTokens.pop() // pop [
998+
}
999+
offsets.setOffsetToken(prefixTokens, 0, firstToken)
1000+
let lastKeyToken
1001+
if (node.computed) {
1002+
const leftBracketToken = sourceCode.getTokenBefore(
1003+
keyTokens.firstToken,
1004+
)!
1005+
const rightBracketToken = (lastKeyToken = sourceCode.getTokenAfter(
1006+
keyTokens.lastToken,
1007+
)!)
1008+
offsets.setOffsetToken(leftBracketToken, 0, firstToken)
1009+
offsets.setOffsetElementList(
1010+
[keyNode],
1011+
leftBracketToken,
1012+
rightBracketToken,
1013+
1,
1014+
)
1015+
} else {
1016+
offsets.setOffsetToken(keyTokens.firstToken, 0, firstToken)
1017+
lastKeyToken = keyTokens.lastToken
1018+
}
1019+
1020+
if (valueNode != null) {
1021+
const initToken = sourceCode.getFirstToken(valueNode)
1022+
offsets.setOffsetToken(
1023+
[...sourceCode.getTokensBetween(lastKeyToken, initToken), initToken],
1024+
1,
1025+
lastKeyToken,
1026+
)
1027+
}
1028+
},
9631029
StaticBlock(node: TSESTree.StaticBlock) {
9641030
const firstToken = sourceCode.getFirstToken(node)
9651031
let next = sourceCode.getTokenAfter(firstToken)
@@ -1084,7 +1150,7 @@ export function defineVisitor(context: IndentContext): NodeListener {
10841150
const commonsVisitor: any = {
10851151
// Process semicolons.
10861152
["TSTypeAliasDeclaration, TSCallSignatureDeclaration, TSConstructSignatureDeclaration, TSImportEqualsDeclaration," +
1087-
"TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember," +
1153+
"TSAbstractMethodDefinition, TSAbstractPropertyDefinition, AccessorProperty, TSAbstractAccessorProperty, TSEnumMember," +
10881154
"TSPropertySignature, TSIndexSignature, TSMethodSignature," +
10891155
"TSAbstractClassProperty, ClassProperty"](node: TSESTree.Node) {
10901156
const firstToken = sourceCode.getFirstToken(node)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- message: Expected indentation of 2 spaces but found 0 spaces.
2+
line: 3
3+
column: 1
4+
suggestions: null
5+
- message: Expected indentation of 4 spaces but found 0 spaces.
6+
line: 4
7+
column: 1
8+
suggestions: null
9+
- message: Expected indentation of 4 spaces but found 0 spaces.
10+
line: 5
11+
column: 1
12+
suggestions: null
13+
- message: Expected indentation of 6 spaces but found 0 spaces.
14+
line: 6
15+
column: 1
16+
suggestions: null
17+
- message: Expected indentation of 4 spaces but found 0 spaces.
18+
line: 7
19+
column: 1
20+
suggestions: null
21+
- message: Expected indentation of 4 spaces but found 0 spaces.
22+
line: 10
23+
column: 1
24+
suggestions: null
25+
- message: Expected indentation of 2 spaces but found 0 spaces.
26+
line: 11
27+
column: 1
28+
suggestions: null
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!-- prettier-ignore -->
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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!-- prettier-ignore -->
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: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
- message: Expected indentation of 2 spaces but found 0 spaces.
2+
line: 3
3+
column: 1
4+
suggestions: null
5+
- message: Expected indentation of 4 spaces but found 0 spaces.
6+
line: 4
7+
column: 1
8+
suggestions: null
9+
- message: Expected indentation of 4 spaces but found 0 spaces.
10+
line: 5
11+
column: 1
12+
suggestions: null
13+
- message: Expected indentation of 4 spaces but found 0 spaces.
14+
line: 6
15+
column: 1
16+
suggestions: null
17+
- message: Expected indentation of 2 spaces but found 0 spaces.
18+
line: 7
19+
column: 1
20+
suggestions: null
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!-- prettier-ignore -->
2+
<script lang="ts">
3+
class Foo {
4+
accessor
5+
foo
6+
;
7+
}
8+
</script>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!-- prettier-ignore -->
2+
<script lang="ts">
3+
class Foo {
4+
accessor
5+
foo
6+
;
7+
}
8+
</script>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- message: Expected indentation of 2 spaces but found 0 spaces.
2+
line: 3
3+
column: 1
4+
suggestions: null
5+
- message: Expected indentation of 4 spaces but found 0 spaces.
6+
line: 4
7+
column: 1
8+
suggestions: null
9+
- message: Expected indentation of 4 spaces but found 0 spaces.
10+
line: 5
11+
column: 1
12+
suggestions: null
13+
- message: Expected indentation of 6 spaces but found 0 spaces.
14+
line: 6
15+
column: 1
16+
suggestions: null
17+
- message: Expected indentation of 6 spaces but found 0 spaces.
18+
line: 7
19+
column: 1
20+
suggestions: null
21+
- message: Expected indentation of 4 spaces but found 0 spaces.
22+
line: 8
23+
column: 1
24+
suggestions: null
25+
- message: Expected indentation of 2 spaces but found 0 spaces.
26+
line: 9
27+
column: 1
28+
suggestions: null
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!-- prettier-ignore -->
2+
<script lang="ts">
3+
class Foo {
4+
accessor
5+
foo
6+
=
7+
2
8+
;
9+
}
10+
</script>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!-- prettier-ignore -->
2+
<script lang="ts">
3+
class Foo {
4+
accessor
5+
foo
6+
=
7+
2
8+
;
9+
}
10+
</script>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
- message: Expected indentation of 2 spaces but found 0 spaces.
2+
line: 3
3+
column: 1
4+
suggestions: null
5+
- message: Expected indentation of 4 spaces but found 0 spaces.
6+
line: 4
7+
column: 1
8+
suggestions: null
9+
- message: Expected indentation of 4 spaces but found 0 spaces.
10+
line: 5
11+
column: 1
12+
suggestions: null
13+
- message: Expected indentation of 6 spaces but found 0 spaces.
14+
line: 6
15+
column: 1
16+
suggestions: null
17+
- message: Expected indentation of 4 spaces but found 0 spaces.
18+
line: 7
19+
column: 1
20+
suggestions: null
21+
- message: Expected indentation of 2 spaces but found 0 spaces.
22+
line: 8
23+
column: 1
24+
suggestions: null
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<!-- prettier-ignore -->
2+
<script lang="ts">
3+
class Foo {
4+
declare accessor
5+
foo:
6+
number
7+
;
8+
}
9+
</script>

0 commit comments

Comments
 (0)