From b59541d96b4ee1c73587ddd341e58e9875a626db Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Tue, 22 Nov 2022 01:13:08 +0900 Subject: [PATCH 01/11] Improve indent rules to support more ts syntax --- lib/utils/indent-common.js | 10 +++++++++- lib/utils/indent-ts.js | 13 +++++++++++++ .../script-indent/ts-call-expression-01.vue | 12 ++++++++++++ .../ts-instantiation-expression-01.vue | 8 ++++++++ .../fixtures/script-indent/ts-new-expression-01.vue | 13 +++++++++++++ typings/eslint-plugin-vue/util-types/ast/es-ast.ts | 1 + 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/script-indent/ts-call-expression-01.vue create mode 100644 tests/fixtures/script-indent/ts-instantiation-expression-01.vue create mode 100644 tests/fixtures/script-indent/ts-new-expression-01.vue diff --git a/lib/utils/indent-common.js b/lib/utils/indent-common.js index 79858b495..74b4fad6d 100644 --- a/lib/utils/indent-common.js +++ b/lib/utils/indent-common.js @@ -1174,8 +1174,12 @@ module.exports.defineVisitor = function create( tokenStore.getTokenAfter(node.callee, isOpeningParenToken) ) + if (node.typeParameters) { + setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken) + } + for (const optionalToken of tokenStore.getTokensBetween( - tokenStore.getLastToken(node.callee), + tokenStore.getLastToken(node.typeParameters || node.callee), leftToken, isOptionalToken )) { @@ -1698,6 +1702,10 @@ module.exports.defineVisitor = function create( ) : null + if (node.typeParameters) { + setOffset(tokenStore.getFirstToken(node.typeParameters), 1, calleeToken) + } + setOffset(calleeToken, 1, newToken) if (leftToken != null) { setOffset(leftToken, 1, calleeToken) diff --git a/lib/utils/indent-ts.js b/lib/utils/indent-ts.js index f2f5b69cf..adececf67 100644 --- a/lib/utils/indent-ts.js +++ b/lib/utils/indent-ts.js @@ -1266,6 +1266,19 @@ function defineVisitor({ setOffset(quasiTokens, 0, firstToken) setOffset(expressionToken, 1, firstToken) }, + /** + * Process instantiation expression + * + * e.g. + * ``` + * const ErrorMap = Map; + * // ^^^^^^^^^^^^^^^^^^ + * ``` + */ + TSInstantiationExpression(node) { + const firstToken = tokenStore.getFirstToken(node) + setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken) + }, // ---------------------------------------------------------------------- // NON-STANDARD NODES // ---------------------------------------------------------------------- diff --git a/tests/fixtures/script-indent/ts-call-expression-01.vue b/tests/fixtures/script-indent/ts-call-expression-01.vue new file mode 100644 index 000000000..20600bc1f --- /dev/null +++ b/tests/fixtures/script-indent/ts-call-expression-01.vue @@ -0,0 +1,12 @@ + + diff --git a/tests/fixtures/script-indent/ts-instantiation-expression-01.vue b/tests/fixtures/script-indent/ts-instantiation-expression-01.vue new file mode 100644 index 000000000..69444765a --- /dev/null +++ b/tests/fixtures/script-indent/ts-instantiation-expression-01.vue @@ -0,0 +1,8 @@ + + diff --git a/tests/fixtures/script-indent/ts-new-expression-01.vue b/tests/fixtures/script-indent/ts-new-expression-01.vue new file mode 100644 index 000000000..8559f7787 --- /dev/null +++ b/tests/fixtures/script-indent/ts-new-expression-01.vue @@ -0,0 +1,13 @@ + + diff --git a/typings/eslint-plugin-vue/util-types/ast/es-ast.ts b/typings/eslint-plugin-vue/util-types/ast/es-ast.ts index b3d5b6e2e..800943419 100644 --- a/typings/eslint-plugin-vue/util-types/ast/es-ast.ts +++ b/typings/eslint-plugin-vue/util-types/ast/es-ast.ts @@ -525,6 +525,7 @@ export interface NewExpression extends HasParentNode { type: 'NewExpression' callee: Expression arguments: (Expression | SpreadElement)[] + typeParameters?: TSTypeParameterInstantiation } interface BaseMemberExpression extends HasParentNode { type: 'MemberExpression' From fec4fab4cd0b178d661a361025dadc26e6eed3c9 Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Tue, 22 Nov 2022 01:16:14 +0900 Subject: [PATCH 02/11] update parser --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f2fb7287..3daff4255 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "@types/node": "^13.13.5", "@types/semver": "^7.3.9", "@types/xml-name-validator": "^4.0.0", - "@typescript-eslint/parser": "^5.23.0", + "@typescript-eslint/parser": "^5.43.0", "assert": "^2.0.0", "env-cmd": "^10.1.0", "esbuild": "^0.15.15", From 99e9adc5b9ce284388cba530ee8613f636d3cb0b Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Tue, 22 Nov 2022 01:17:58 +0900 Subject: [PATCH 03/11] fix --- tests/fixtures/script-indent/ts-instantiation-expression-01.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/script-indent/ts-instantiation-expression-01.vue b/tests/fixtures/script-indent/ts-instantiation-expression-01.vue index 69444765a..317cc2916 100644 --- a/tests/fixtures/script-indent/ts-instantiation-expression-01.vue +++ b/tests/fixtures/script-indent/ts-instantiation-expression-01.vue @@ -1,4 +1,4 @@ - + From 55c14db3bad2282ac6b751623768eed679096305 Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Tue, 22 Nov 2022 20:51:41 +0900 Subject: [PATCH 05/11] support for AccessorProperty --- lib/utils/indent-ts.js | 50 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/lib/utils/indent-ts.js b/lib/utils/indent-ts.js index 446f15c2b..815235b10 100644 --- a/lib/utils/indent-ts.js +++ b/lib/utils/indent-ts.js @@ -29,6 +29,7 @@ const { isTypeNode } = require('./ts-ast-utils') * @typedef {import('@typescript-eslint/types').TSESTree.TSImportEqualsDeclaration} TSImportEqualsDeclaration * @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractMethodDefinition} TSAbstractMethodDefinition * @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractPropertyDefinition} TSAbstractPropertyDefinition + * @typedef {import('@typescript-eslint/types').TSESTree.TSAbstractAccessorProperty} TSAbstractAccessorProperty * @typedef {import('@typescript-eslint/types').TSESTree.TSEnumMember} TSEnumMember * @typedef {import('@typescript-eslint/types').TSESTree.TSPropertySignature} TSPropertySignature * @typedef {import('@typescript-eslint/types').TSESTree.TSIndexSignature} TSIndexSignature @@ -206,15 +207,16 @@ function defineVisitor({ * | TSImportEqualsDeclaration * | TSAbstractMethodDefinition * | TSAbstractPropertyDefinition - * | TSAbstractClassProperty + * | TSAbstractAccessorProperty * | TSEnumMember - * | ClassProperty * | TSPropertySignature * | TSIndexSignature - * | TSMethodSignature} node + * | TSMethodSignature + * | ClassProperty + * | TSAbstractClassProperty} node */ ['TSTypeAliasDeclaration, TSCallSignatureDeclaration, TSConstructSignatureDeclaration, TSImportEqualsDeclaration,' + - 'TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember,' + + 'TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSAbstractAccessorProperty, TSEnumMember,' + 'TSPropertySignature, TSIndexSignature, TSMethodSignature,' + // Deprecated in @typescript-eslint/parser v5 'ClassProperty, TSAbstractClassProperty'](node) { @@ -1073,10 +1075,10 @@ function defineVisitor({ * // ^^^^^^^ * ``` * - * @param {TSAbstractMethodDefinition | TSAbstractPropertyDefinition | TSEnumMember | TSAbstractClassProperty | ClassProperty} node + * @param {TSAbstractMethodDefinition | TSAbstractPropertyDefinition | TSAbstractAccessorProperty | TSEnumMember | TSAbstractClassProperty | ClassProperty} node * */ - ['TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSEnumMember,' + + ['TSAbstractMethodDefinition, TSAbstractPropertyDefinition, TSAbstractAccessorProperty, TSEnumMember,' + // Deprecated in @typescript-eslint/parser v5 'ClassProperty, TSAbstractClassProperty'](node) { const { keyNode, valueNode } = @@ -1335,6 +1337,42 @@ function defineVisitor({ setOffset(atToken, 0, tokenStore.getFirstToken(decorators[0])) } }, + AccessorProperty(node) { + const keyNode = node.key + const valueNode = node.value + const firstToken = tokenStore.getFirstToken(node) + const keyTokens = getFirstAndLastTokens(keyNode) + const prefixTokens = tokenStore.getTokensBetween( + firstToken, + keyTokens.firstToken + ) + if (node.computed) { + prefixTokens.pop() // pop [ + } + setOffset(prefixTokens, 0, firstToken) + let lastKeyToken + if (node.computed) { + const leftBracketToken = tokenStore.getTokenBefore(keyTokens.firstToken) + const rightBracketToken = (lastKeyToken = tokenStore.getTokenAfter( + keyTokens.lastToken + )) + setOffset(leftBracketToken, 0, firstToken) + processNodeList([keyNode], leftBracketToken, rightBracketToken, 1) + } else { + setOffset(keyTokens.firstToken, 0, firstToken) + lastKeyToken = keyTokens.lastToken + } + + if (valueNode != null) { + const initToken = tokenStore.getFirstToken(valueNode) + setOffset( + [...tokenStore.getTokensBetween(lastKeyToken, initToken), initToken], + 1, + lastKeyToken + ) + } + processSemicolons(node) + }, ImportAttribute(node) { const firstToken = tokenStore.getFirstToken(node) const keyTokens = getFirstAndLastTokens(node.key) From e33eac87ab341a65c3d580fc50b05c07bcbc62d4 Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Thu, 24 Nov 2022 10:50:55 +0900 Subject: [PATCH 06/11] fix --- package.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/package.json b/package.json index ba55b9ec9..6ebf99ece 100644 --- a/package.json +++ b/package.json @@ -90,13 +90,7 @@ "mocha": "^10.0.0", "nyc": "^15.1.0", "prettier": "^2.6.2", -<<<<<<< HEAD - "typescript": "^4.6.4", - "vitepress": "^1.0.0-alpha.29" -======= "typescript": "^4.9.3", - "vue-eslint-editor": "^1.1.0", - "vuepress": "^1.9.7" ->>>>>>> da8cc13e (support for satisfies op) + "vitepress": "^1.0.0-alpha.29" } } From 8eeee993ec990f29981bf6f2dcbbe71425944d79 Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Sun, 27 Nov 2022 23:28:36 +0900 Subject: [PATCH 07/11] fix --- lib/utils/indent-common.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/utils/indent-common.js b/lib/utils/indent-common.js index 74b4fad6d..4db6dea7f 100644 --- a/lib/utils/indent-common.js +++ b/lib/utils/indent-common.js @@ -1171,7 +1171,10 @@ module.exports.defineVisitor = function create( const firstToken = tokenStore.getFirstToken(node) const rightToken = tokenStore.getLastToken(node) const leftToken = /** @type {Token} */ ( - tokenStore.getTokenAfter(node.callee, isOpeningParenToken) + tokenStore.getTokenAfter( + node.typeParameters || node.callee, + isOpeningParenToken + ) ) if (node.typeParameters) { @@ -1696,7 +1699,7 @@ module.exports.defineVisitor = function create( const rightToken = tokenStore.getLastToken(node) const leftToken = isClosingParenToken(rightToken) ? tokenStore.getFirstTokenBetween( - node.callee, + node.typeParameters || node.callee, rightToken, isOpeningParenToken ) From bb2c28b4dd902eeffe4f850168f8260b9c61a3ef Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Sun, 27 Nov 2022 23:52:43 +0900 Subject: [PATCH 08/11] fix --- lib/utils/indent-ts.js | 62 +++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/lib/utils/indent-ts.js b/lib/utils/indent-ts.js index 815235b10..d907a44b0 100644 --- a/lib/utils/indent-ts.js +++ b/lib/utils/indent-ts.js @@ -51,6 +51,10 @@ const { isTypeNode } = require('./ts-ast-utils') * @typedef {import('@typescript-eslint/types').TSESTree.TSInferType} TSInferType * @typedef {import('@typescript-eslint/types').TSESTree.TSOptionalType} TSOptionalType * @typedef {import('@typescript-eslint/types').TSESTree.TSNonNullExpression} TSNonNullExpression + * @typedef {import('@typescript-eslint/types').TSESTree.TSAsExpression} TSAsExpression + * @typedef {import('@typescript-eslint/types').TSESTree.TSSatisfiesExpression} TSSatisfiesExpression + * @typedef {import('@typescript-eslint/types').TSESTree.TSTypeReference} TSTypeReference + * @typedef {import('@typescript-eslint/types').TSESTree.TSInstantiationExpression} TSInstantiationExpression * @typedef {import('@typescript-eslint/types').TSESTree.JSXChild} JSXChild * @typedef {import('@typescript-eslint/types').TSESTree.TypeNode} TypeNode * @@ -281,60 +285,57 @@ function defineVisitor({ } }, /** - * Process as expression + * Process as expression or satisfies expression * * e.g. * ``` * var foo = bar as boolean * // ^^^^^^^^^^^^^^ * ``` - */ - TSAsExpression(node) { - const expressionTokens = getFirstAndLastTokens(node.expression) - const asToken = tokenStore.getTokenAfter(expressionTokens.lastToken) - setOffset( - [asToken, getFirstAndLastTokens(node.typeAnnotation).firstToken], - 1, - expressionTokens.firstToken - ) - }, - /** - * Process satisfies expression * * e.g. * ``` * var foo = bar satisfies Bar * // ^^^^^^^^^^^^^^^^^ * ``` + * + * @param {TSAsExpression | TSSatisfiesExpression} node */ - TSSatisfiesExpression(node) { + 'TSAsExpression, TSSatisfiesExpression'(node) { const expressionTokens = getFirstAndLastTokens(node.expression) - const satisfiesToken = tokenStore.getTokenAfter( + const asOrSatisfiesToken = tokenStore.getTokenAfter( expressionTokens.lastToken ) setOffset( - [satisfiesToken, getFirstAndLastTokens(node.typeAnnotation).firstToken], + [ + asOrSatisfiesToken, + getFirstAndLastTokens(node.typeAnnotation).firstToken + ], 1, expressionTokens.firstToken ) }, /** - * Process type reference + * Process type reference and instantiation expression * * e.g. * ``` * const foo: Type

* // ^^^^^^^ * ``` + * + * e.g. + * ``` + * const ErrorMap = Map; + * // ^^^^^^^^^^^^^^^^^^ + * ``` + * + * @param {TSTypeReference | TSInstantiationExpression} node */ - TSTypeReference(node) { + 'TSTypeReference, TSInstantiationExpression'(node) { if (node.typeParameters) { - const typeNameTokens = getFirstAndLastTokens(node.typeName) - setOffset( - tokenStore.getFirstToken(node.typeParameters), - 1, - typeNameTokens.firstToken - ) + const firstToken = tokenStore.getFirstToken(node) + setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken) } }, /** @@ -1288,19 +1289,6 @@ function defineVisitor({ setOffset(quasiTokens, 0, firstToken) setOffset(expressionToken, 1, firstToken) }, - /** - * Process instantiation expression - * - * e.g. - * ``` - * const ErrorMap = Map; - * // ^^^^^^^^^^^^^^^^^^ - * ``` - */ - TSInstantiationExpression(node) { - const firstToken = tokenStore.getFirstToken(node) - setOffset(tokenStore.getFirstToken(node.typeParameters), 1, firstToken) - }, // ---------------------------------------------------------------------- // NON-STANDARD NODES // ---------------------------------------------------------------------- From 1af9f580b056be38c15c6fbd6c90b4e1100c40f2 Mon Sep 17 00:00:00 2001 From: yosuke ota Date: Mon, 28 Nov 2022 16:44:15 +0900 Subject: [PATCH 09/11] add test cases --- package.json | 2 +- .../ts-abstract-accessor-property-01.vue | 12 ++++++++++++ .../script-indent/ts-accessor-property-01.vue | 8 ++++++++ .../script-indent/ts-accessor-property-02.vue | 10 ++++++++++ .../script-indent/ts-accessor-property-03.vue | 9 +++++++++ .../script-indent/ts-accessor-property-04.vue | 10 ++++++++++ .../script-indent/ts-accessor-property-05.vue | 12 ++++++++++++ .../script-indent/ts-instantiation-expression-01.vue | 2 +- 8 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/script-indent/ts-abstract-accessor-property-01.vue create mode 100644 tests/fixtures/script-indent/ts-accessor-property-01.vue create mode 100644 tests/fixtures/script-indent/ts-accessor-property-02.vue create mode 100644 tests/fixtures/script-indent/ts-accessor-property-03.vue create mode 100644 tests/fixtures/script-indent/ts-accessor-property-04.vue create mode 100644 tests/fixtures/script-indent/ts-accessor-property-05.vue diff --git a/package.json b/package.json index 6ebf99ece..5a8a242e5 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "@types/node": "^13.13.5", "@types/semver": "^7.3.9", "@types/xml-name-validator": "^4.0.0", - "@typescript-eslint/parser": "^5.44.0", + "@typescript-eslint/parser": "^5.44.1-alpha.15", "assert": "^2.0.0", "env-cmd": "^10.1.0", "esbuild": "^0.15.15", diff --git a/tests/fixtures/script-indent/ts-abstract-accessor-property-01.vue b/tests/fixtures/script-indent/ts-abstract-accessor-property-01.vue new file mode 100644 index 000000000..563b10304 --- /dev/null +++ b/tests/fixtures/script-indent/ts-abstract-accessor-property-01.vue @@ -0,0 +1,12 @@ + + diff --git a/tests/fixtures/script-indent/ts-accessor-property-01.vue b/tests/fixtures/script-indent/ts-accessor-property-01.vue new file mode 100644 index 000000000..c7fa3c38e --- /dev/null +++ b/tests/fixtures/script-indent/ts-accessor-property-01.vue @@ -0,0 +1,8 @@ + + diff --git a/tests/fixtures/script-indent/ts-accessor-property-02.vue b/tests/fixtures/script-indent/ts-accessor-property-02.vue new file mode 100644 index 000000000..a09369195 --- /dev/null +++ b/tests/fixtures/script-indent/ts-accessor-property-02.vue @@ -0,0 +1,10 @@ + + diff --git a/tests/fixtures/script-indent/ts-accessor-property-03.vue b/tests/fixtures/script-indent/ts-accessor-property-03.vue new file mode 100644 index 000000000..856502bbd --- /dev/null +++ b/tests/fixtures/script-indent/ts-accessor-property-03.vue @@ -0,0 +1,9 @@ + + diff --git a/tests/fixtures/script-indent/ts-accessor-property-04.vue b/tests/fixtures/script-indent/ts-accessor-property-04.vue new file mode 100644 index 000000000..f0ba8795c --- /dev/null +++ b/tests/fixtures/script-indent/ts-accessor-property-04.vue @@ -0,0 +1,10 @@ + + diff --git a/tests/fixtures/script-indent/ts-accessor-property-05.vue b/tests/fixtures/script-indent/ts-accessor-property-05.vue new file mode 100644 index 000000000..4328991d0 --- /dev/null +++ b/tests/fixtures/script-indent/ts-accessor-property-05.vue @@ -0,0 +1,12 @@ + + diff --git a/tests/fixtures/script-indent/ts-instantiation-expression-01.vue b/tests/fixtures/script-indent/ts-instantiation-expression-01.vue index 317cc2916..b58602542 100644 --- a/tests/fixtures/script-indent/ts-instantiation-expression-01.vue +++ b/tests/fixtures/script-indent/ts-instantiation-expression-01.vue @@ -1,4 +1,4 @@ - +