Skip to content

Commit 692ce08

Browse files
9romiseota-meshi
andauthored
feat: add support for typescript AST to isParenthesized (#258)
Co-authored-by: Yosuke Ota <[email protected]>
1 parent 38c229b commit 692ce08

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

src/is-parenthesized.mjs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { isClosingParenToken, isOpeningParenToken } from "./token-predicate.mjs"
22
/** @typedef {import("estree").Node} Node */
3+
/** @typedef {import("@typescript-eslint/types").TSESTree.NewExpression} TSNewExpression */
4+
/** @typedef {import("@typescript-eslint/types").TSESTree.CallExpression} TSCallExpression */
35
/** @typedef {import("eslint").SourceCode} SourceCode */
46
/** @typedef {import("eslint").AST.Token} Token */
57
/** @typedef {import("eslint").Rule.Node} RuleNode */
@@ -11,6 +13,7 @@ import { isClosingParenToken, isOpeningParenToken } from "./token-predicate.mjs"
1113
* @param {SourceCode} sourceCode The source code object to get tokens.
1214
* @returns {Token|null} The left parenthesis of the parent node syntax
1315
*/
16+
// eslint-disable-next-line complexity
1417
function getParentSyntaxParen(node, sourceCode) {
1518
const parent = /** @type {RuleNode} */ (node).parent
1619

@@ -19,7 +22,13 @@ function getParentSyntaxParen(node, sourceCode) {
1922
case "NewExpression":
2023
if (parent.arguments.length === 1 && parent.arguments[0] === node) {
2124
return sourceCode.getTokenAfter(
22-
parent.callee,
25+
/** @type {RuleNode} */ (
26+
/** @type {unknown} */ (
27+
/** @type {TSNewExpression | TSCallExpression} */ (
28+
parent
29+
).typeParameters
30+
)
31+
) || parent.callee,
2332
isOpeningParenToken,
2433
)
2534
}

test/is-parenthesized.mjs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import tsParser from "@typescript-eslint/parser"
12
import assert from "assert"
23
import { getProperty } from "dot-prop"
34
import { isParenthesized } from "../src/index.mjs"
45
import { newCompatLinter } from "./test-lib/eslint-compat.mjs"
56

67
describe("The 'isParenthesized' function", () => {
7-
for (const { code, expected } of [
8+
for (const { code, expected, parser } of [
89
{
910
code: "777",
1011
expected: {
@@ -215,6 +216,73 @@ describe("The 'isParenthesized' function", () => {
215216
"body[0].parent": false,
216217
},
217218
},
219+
// TypeScript support
220+
{
221+
code: "f<import('foo')>(a)",
222+
expected: {
223+
"body[0]": false,
224+
"body[0].expression": false,
225+
"body[0].expression.arguments[0]": false,
226+
},
227+
parser: tsParser,
228+
},
229+
{
230+
code: "f<import('foo')>((a))",
231+
expected: {
232+
"body[0]": false,
233+
"body[0].expression": false,
234+
"body[0].expression.arguments[0]": true,
235+
},
236+
parser: tsParser,
237+
},
238+
{
239+
code: "f<import('foo')>(a,b)",
240+
expected: {
241+
"body[0]": false,
242+
"body[0].expression": false,
243+
"body[0].expression.arguments[0]": false,
244+
"body[0].expression.arguments[1]": false,
245+
},
246+
parser: tsParser,
247+
},
248+
{
249+
code: "f<import('foo')>((a),b)",
250+
expected: {
251+
"body[0]": false,
252+
"body[0].expression": false,
253+
"body[0].expression.arguments[0]": true,
254+
"body[0].expression.arguments[1]": false,
255+
},
256+
parser: tsParser,
257+
},
258+
{
259+
code: "f<import('foo')>(a,(b))",
260+
expected: {
261+
"body[0]": false,
262+
"body[0].expression": false,
263+
"body[0].expression.arguments[0]": false,
264+
"body[0].expression.arguments[1]": true,
265+
},
266+
parser: tsParser,
267+
},
268+
{
269+
code: "new f<import('foo')>(a)",
270+
expected: {
271+
"body[0]": false,
272+
"body[0].expression": false,
273+
"body[0].expression.arguments[0]": false,
274+
},
275+
parser: tsParser,
276+
},
277+
{
278+
code: "new f<import('foo')>((a))",
279+
expected: {
280+
"body[0]": false,
281+
"body[0].expression": false,
282+
"body[0].expression.arguments[0]": true,
283+
},
284+
parser: tsParser,
285+
},
218286
]) {
219287
describe(`on the code \`${code}\``, () => {
220288
for (const key of Object.keys(expected)) {
@@ -226,6 +294,7 @@ describe("The 'isParenthesized' function", () => {
226294
languageOptions: {
227295
ecmaVersion: 2020,
228296
sourceType: "script",
297+
parser,
229298
},
230299
rules: { "test/test": "error" },
231300
plugins: {

0 commit comments

Comments
 (0)