From 0f3f64571ea5d938081b1a9f3fd1495765201700 Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Thu, 22 Dec 2022 07:36:28 +1030 Subject: [PATCH] fix(ast-spec): correct some incorrect ast types (#6257) * fix(ast-spec): correct some ast types * type error --- .../ast-spec/src/expression/ArrayExpression/spec.ts | 5 ++++- .../src/expression/MemberExpression/spec.ts | 3 +-- .../ast-spec/src/unions/ObjectLiteralElement.ts | 3 +-- .../src/rules/plugin-test-formatting.ts | 13 ++++++++----- .../src/rules/no-unnecessary-condition.ts | 4 +--- .../src/rules/prefer-string-starts-ends-with.ts | 2 +- .../src/rules/require-array-sort-compare.ts | 2 +- .../tests/lib/semanticInfo.test.ts | 2 +- 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/packages/ast-spec/src/expression/ArrayExpression/spec.ts b/packages/ast-spec/src/expression/ArrayExpression/spec.ts index 7dc07e30952..3dccf5c6ab8 100644 --- a/packages/ast-spec/src/expression/ArrayExpression/spec.ts +++ b/packages/ast-spec/src/expression/ArrayExpression/spec.ts @@ -5,5 +5,8 @@ import type { Expression } from '../../unions/Expression'; export interface ArrayExpression extends BaseNode { type: AST_NODE_TYPES.ArrayExpression; - elements: (Expression | SpreadElement)[]; + /** + * an element will be `null` in the case of a sparse array: `[1, ,3]` + */ + elements: (Expression | SpreadElement | null)[]; } diff --git a/packages/ast-spec/src/expression/MemberExpression/spec.ts b/packages/ast-spec/src/expression/MemberExpression/spec.ts index 260574cc59f..a0a7cc65a33 100644 --- a/packages/ast-spec/src/expression/MemberExpression/spec.ts +++ b/packages/ast-spec/src/expression/MemberExpression/spec.ts @@ -2,11 +2,10 @@ import type { AST_NODE_TYPES } from '../../ast-node-types'; import type { BaseNode } from '../../base/BaseNode'; import type { PrivateIdentifier } from '../../special/PrivateIdentifier/spec'; import type { Expression } from '../../unions/Expression'; -import type { LeftHandSideExpression } from '../../unions/LeftHandSideExpression'; import type { Identifier } from '../Identifier/spec'; interface MemberExpressionBase extends BaseNode { - object: LeftHandSideExpression; + object: Expression; property: Expression | Identifier | PrivateIdentifier; computed: boolean; optional: boolean; diff --git a/packages/ast-spec/src/unions/ObjectLiteralElement.ts b/packages/ast-spec/src/unions/ObjectLiteralElement.ts index d7575c80c1b..e6ac567c63e 100644 --- a/packages/ast-spec/src/unions/ObjectLiteralElement.ts +++ b/packages/ast-spec/src/unions/ObjectLiteralElement.ts @@ -1,8 +1,7 @@ -import type { MethodDefinition } from '../element/MethodDefinition/spec'; import type { Property } from '../element/Property/spec'; import type { SpreadElement } from '../element/SpreadElement/spec'; -export type ObjectLiteralElement = MethodDefinition | Property | SpreadElement; +export type ObjectLiteralElement = Property | SpreadElement; // TODO - breaking change remove this export type ObjectLiteralElementLike = ObjectLiteralElement; diff --git a/packages/eslint-plugin-internal/src/rules/plugin-test-formatting.ts b/packages/eslint-plugin-internal/src/rules/plugin-test-formatting.ts index f86d4946836..313a32eea5b 100644 --- a/packages/eslint-plugin-internal/src/rules/plugin-test-formatting.ts +++ b/packages/eslint-plugin-internal/src/rules/plugin-test-formatting.ts @@ -197,8 +197,11 @@ export default createRule({ } } - function checkExpression(node: TSESTree.Node, isErrorTest: boolean): void { - switch (node.type) { + function checkExpression( + node: TSESTree.Node | null, + isErrorTest: boolean, + ): void { + switch (node?.type) { case AST_NODE_TYPES.Literal: checkLiteral(node, isErrorTest); break; @@ -478,7 +481,7 @@ export default createRule({ function checkValidTest(tests: TSESTree.ArrayExpression): void { for (const test of tests.elements) { - switch (test.type) { + switch (test?.type) { case AST_NODE_TYPES.ObjectExpression: // delegate object-style tests to the invalid checker checkInvalidTest(test, false); @@ -546,7 +549,7 @@ export default createRule({ case 'invalid': for (const element of prop.value.elements) { - if (element.type === AST_NODE_TYPES.ObjectExpression) { + if (element?.type === AST_NODE_TYPES.ObjectExpression) { checkInvalidTest(element); } } @@ -575,7 +578,7 @@ export default createRule({ } for (const errorElement of testProp.value.elements) { - if (errorElement.type !== AST_NODE_TYPES.ObjectExpression) { + if (errorElement?.type !== AST_NODE_TYPES.ObjectExpression) { continue; } diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts index 030ed4fe188..5a6872f5748 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts @@ -568,9 +568,7 @@ export default createRule({ return false; } - function isOptionableExpression( - node: TSESTree.LeftHandSideExpression, - ): boolean { + function isOptionableExpression(node: TSESTree.Expression): boolean { const type = getNodeType(node); const isOwnNullable = node.type === AST_NODE_TYPES.MemberExpression diff --git a/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts b/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts index f0949acd16c..31a570652dc 100644 --- a/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts +++ b/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts @@ -47,7 +47,7 @@ export default createRule({ * Check if a given node is a string. * @param node The node to check. */ - function isStringType(node: TSESTree.LeftHandSideExpression): boolean { + function isStringType(node: TSESTree.Expression): boolean { const objectType = typeChecker.getTypeAtLocation( service.esTreeNodeToTSNodeMap.get(node), ); diff --git a/packages/eslint-plugin/src/rules/require-array-sort-compare.ts b/packages/eslint-plugin/src/rules/require-array-sort-compare.ts index b37490abc5a..aafd46e690d 100644 --- a/packages/eslint-plugin/src/rules/require-array-sort-compare.ts +++ b/packages/eslint-plugin/src/rules/require-array-sort-compare.ts @@ -50,7 +50,7 @@ export default util.createRule({ * Check if a given node is an array which all elements are string. * @param node */ - function isStringArrayNode(node: TSESTree.LeftHandSideExpression): boolean { + function isStringArrayNode(node: TSESTree.Expression): boolean { const type = checker.getTypeAtLocation( service.esTreeNodeToTSNodeMap.get(node), ); diff --git a/packages/typescript-estree/tests/lib/semanticInfo.test.ts b/packages/typescript-estree/tests/lib/semanticInfo.test.ts index 3ebe689185e..9c8aacf6668 100644 --- a/packages/typescript-estree/tests/lib/semanticInfo.test.ts +++ b/packages/typescript-estree/tests/lib/semanticInfo.test.ts @@ -365,7 +365,7 @@ function testIsolatedFile( const declaration = (parseResult.ast.body[0] as TSESTree.VariableDeclaration) .declarations[0]; const arrayMember = (declaration.init! as TSESTree.ArrayExpression) - .elements[0]; + .elements[0]!; expect(parseResult).toHaveProperty('services.esTreeNodeToTSNodeMap'); // get corresponding TS node