diff --git a/packages/ast-spec/src/expression/AssignmentExpression/AssignmentOperatorToText.ts b/packages/ast-spec/src/expression/AssignmentExpression/AssignmentOperatorToText.ts new file mode 100644 index 000000000000..a0c723aa1f30 --- /dev/null +++ b/packages/ast-spec/src/expression/AssignmentExpression/AssignmentOperatorToText.ts @@ -0,0 +1,20 @@ +import type { SyntaxKind } from 'typescript'; + +export interface AssignmentOperatorToText { + [SyntaxKind.EqualsToken]: '='; + [SyntaxKind.PlusEqualsToken]: '+='; + [SyntaxKind.MinusEqualsToken]: '-='; + [SyntaxKind.AsteriskEqualsToken]: '*='; + [SyntaxKind.AsteriskAsteriskEqualsToken]: '**='; + [SyntaxKind.SlashEqualsToken]: '/='; + [SyntaxKind.PercentEqualsToken]: '%='; + [SyntaxKind.LessThanLessThanEqualsToken]: '<<='; + [SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>='; + [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>='; + [SyntaxKind.AmpersandEqualsToken]: '&='; + [SyntaxKind.BarEqualsToken]: '|='; + [SyntaxKind.BarBarEqualsToken]: '||='; // included in PunctuationSyntaxKind in TS 4.4 + [SyntaxKind.AmpersandAmpersandEqualsToken]: '&&='; // included in PunctuationSyntaxKind in TS 4.4 + [SyntaxKind.QuestionQuestionEqualsToken]: '??='; // included in PunctuationSyntaxKind in TS 4.4 + [SyntaxKind.CaretEqualsToken]: '^='; +} diff --git a/packages/ast-spec/src/expression/AssignmentExpression/spec.ts b/packages/ast-spec/src/expression/AssignmentExpression/spec.ts index 8d76be21bdcc..03420505a506 100644 --- a/packages/ast-spec/src/expression/AssignmentExpression/spec.ts +++ b/packages/ast-spec/src/expression/AssignmentExpression/spec.ts @@ -1,23 +1,11 @@ import type { AST_NODE_TYPES } from '../../ast-node-types'; import type { BinaryExpressionBase } from '../../base/BinaryExpressionBase'; +import type { ValueOf } from '../../utils'; +import type { AssignmentOperatorToText } from './AssignmentOperatorToText'; + +export * from './AssignmentOperatorToText'; export interface AssignmentExpression extends BinaryExpressionBase { type: AST_NODE_TYPES.AssignmentExpression; - operator: - | '-=' - | '??=' - | '**=' - | '*=' - | '/=' - | '&&=' - | '&=' - | '%=' - | '^=' - | '+=' - | '<<=' - | '=' - | '>>=' - | '>>>=' - | '|=' - | '||='; + operator: ValueOf; } diff --git a/packages/ast-spec/src/token/PunctuatorToken/PunctuatorTokenToText.ts b/packages/ast-spec/src/token/PunctuatorToken/PunctuatorTokenToText.ts index d15682a4efe7..a3ea5b151613 100644 --- a/packages/ast-spec/src/token/PunctuatorToken/PunctuatorTokenToText.ts +++ b/packages/ast-spec/src/token/PunctuatorToken/PunctuatorTokenToText.ts @@ -1,6 +1,8 @@ import type { SyntaxKind } from 'typescript'; -export interface PunctuatorTokenToText { +import type { AssignmentOperatorToText } from '../../expression/AssignmentExpression/AssignmentOperatorToText'; + +export interface PunctuatorTokenToText extends AssignmentOperatorToText { [SyntaxKind.OpenBraceToken]: '{'; [SyntaxKind.CloseBraceToken]: '}'; [SyntaxKind.OpenParenToken]: '('; @@ -46,20 +48,4 @@ export interface PunctuatorTokenToText { [SyntaxKind.QuestionQuestionToken]: '??'; [SyntaxKind.BacktickToken]: '`'; [SyntaxKind.HashToken]: '#'; - [SyntaxKind.EqualsToken]: '='; - [SyntaxKind.PlusEqualsToken]: '+='; - [SyntaxKind.MinusEqualsToken]: '-='; - [SyntaxKind.AsteriskEqualsToken]: '*='; - [SyntaxKind.AsteriskAsteriskEqualsToken]: '**='; - [SyntaxKind.SlashEqualsToken]: '/='; - [SyntaxKind.PercentEqualsToken]: '%='; - [SyntaxKind.LessThanLessThanEqualsToken]: '<<='; - [SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>='; - [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>='; - [SyntaxKind.AmpersandEqualsToken]: '&='; - [SyntaxKind.BarEqualsToken]: '|='; - [SyntaxKind.BarBarEqualsToken]: '||='; - [SyntaxKind.AmpersandAmpersandEqualsToken]: '&&='; - [SyntaxKind.QuestionQuestionEqualsToken]: '??='; - [SyntaxKind.CaretEqualsToken]: '^='; } diff --git a/packages/ast-spec/src/token/PunctuatorToken/spec.ts b/packages/ast-spec/src/token/PunctuatorToken/spec.ts index 68156aad6638..733e0108d2f4 100644 --- a/packages/ast-spec/src/token/PunctuatorToken/spec.ts +++ b/packages/ast-spec/src/token/PunctuatorToken/spec.ts @@ -1,11 +1,10 @@ import type { AST_TOKEN_TYPES } from '../../ast-token-types'; import type { BaseToken } from '../../base/BaseToken'; +import type { ValueOf } from '../../utils'; import type { PunctuatorTokenToText } from './PunctuatorTokenToText'; export * from './PunctuatorTokenToText'; -type ValueOf = T[keyof T]; - export interface PunctuatorToken extends BaseToken { type: AST_TOKEN_TYPES.Punctuator; value: ValueOf; diff --git a/packages/ast-spec/src/utils.ts b/packages/ast-spec/src/utils.ts new file mode 100644 index 000000000000..5f2cf2cf07f3 --- /dev/null +++ b/packages/ast-spec/src/utils.ts @@ -0,0 +1 @@ +export type ValueOf = T[keyof T]; diff --git a/packages/ast-spec/tests/AssignmentOperatorToText.test.ts b/packages/ast-spec/tests/AssignmentOperatorToText.test.ts new file mode 100644 index 000000000000..867eec016ef4 --- /dev/null +++ b/packages/ast-spec/tests/AssignmentOperatorToText.test.ts @@ -0,0 +1,11 @@ +import type { AssignmentOperator } from 'typescript'; + +import { AssignmentOperatorToText } from '../src'; + +// @ts-expect-error: purposely unused +type _Test = { + readonly [T in AssignmentOperator]: AssignmentOperatorToText[T]; + // If there are any AssignmentOperator members that don't have a corresponding + // AssignmentOperatorToText, then this line will error with "Type 'T' cannot + // be used to index type 'AssignmentOperatorToText'." +};