Skip to content

Commit 5259950

Browse files
fix(indent): correct handling of return type annotations (#853)
1 parent 140db85 commit 5259950

File tree

2 files changed

+79
-13
lines changed

2 files changed

+79
-13
lines changed

packages/eslint-plugin/rules/indent/indent._ts_.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,64 @@ const map2 = Object.keys(map)
845845
`,
846846
options: [2, { VariableDeclarator: { using: 'first' } }],
847847
},
848+
{
849+
code: $`
850+
async function foo(bar: number): Promise<
851+
number
852+
> {
853+
return 2;
854+
}
855+
`,
856+
options: [2],
857+
},
858+
{
859+
code: $`
860+
async function foo(
861+
bar: number,
862+
): Promise<
863+
number
864+
> {
865+
return 2;
866+
}
867+
`,
868+
options: [2],
869+
},
870+
{
871+
code: $`
872+
function foo(bar: number): (
873+
number
874+
) {
875+
return 2;
876+
}
877+
`,
878+
options: [2],
879+
},
880+
{
881+
code: $`
882+
function foo(
883+
bar: number,
884+
): (
885+
number
886+
) {
887+
return 2;
888+
}
889+
`,
890+
options: [2],
891+
},
892+
{
893+
code: $`
894+
const a = (
895+
param: 2 | 3,
896+
): Promise<
897+
(
898+
2 | 3
899+
)
900+
> => {
901+
return Promise.resolve(param)
902+
}
903+
`,
904+
options: [2],
905+
},
848906
],
849907
invalid: [
850908
...individualNodeTests.invalid!,

packages/eslint-plugin/rules/indent/indent.ts

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,7 +1372,10 @@ export default createRule<RuleOptions, MessageIds>({
13721372

13731373
if (isOpeningParenToken(maybeOpeningParen)) {
13741374
const openingParen = maybeOpeningParen
1375-
const closingParen = sourceCode.getTokenBefore(node.body, isClosingParenToken)!
1375+
const closingParen = sourceCode.getTokenBefore(
1376+
node.returnType ?? node.body,
1377+
{ filter: isClosingParenToken },
1378+
)!
13761379

13771380
parameterParens.add(openingParen)
13781381
parameterParens.add(closingParen)
@@ -1497,20 +1500,25 @@ export default createRule<RuleOptions, MessageIds>({
14971500
},
14981501

14991502
'FunctionDeclaration, FunctionExpression': function (node: Tree.FunctionDeclaration | Tree.FunctionExpression) {
1500-
const closingParen = sourceCode.getTokenBefore(node.body)!
1501-
const openingParen = sourceCode.getTokenBefore(
1503+
const paramsClosingParen = sourceCode.getTokenBefore(
1504+
node.returnType ?? node.body,
1505+
{ filter: isClosingParenToken },
1506+
)
1507+
if (!paramsClosingParen)
1508+
throw new Error('Expected to find a closing parenthesis for function parameters.')
1509+
1510+
const paramsOpeningParen = sourceCode.getTokenBefore(
15021511
node.params.length
1503-
? node.params[0].decorators?.length
1504-
? node.params[0].decorators[0]
1505-
: node.params[0] : closingParen,
1506-
{
1507-
filter: isOpeningParenToken,
1508-
},
1509-
)!
1512+
? (node.params[0].decorators?.[0] ?? node.params[0])
1513+
: paramsClosingParen,
1514+
{ filter: isOpeningParenToken },
1515+
)
1516+
if (!paramsOpeningParen)
1517+
throw new Error('Expected to find an opening parenthesis for function parameters.')
15101518

1511-
parameterParens.add(openingParen)
1512-
parameterParens.add(closingParen)
1513-
addElementListIndent(node.params, openingParen, closingParen, options[node.type].parameters)
1519+
parameterParens.add(paramsOpeningParen)
1520+
parameterParens.add(paramsClosingParen)
1521+
addElementListIndent(node.params, paramsOpeningParen, paramsClosingParen, options[node.type].parameters)
15141522
},
15151523

15161524
IfStatement(node) {

0 commit comments

Comments
 (0)