From 66f0afb2f30569fc382804e5f0bdc908e451f938 Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Fri, 7 Feb 2025 02:46:32 +0000 Subject: [PATCH] refactor(ast): shorten TS type definitions for enums (#8938) Where one enum inherits the variants of another, express that in TS type definitions, rather than repeating all the inherited variants. --- npm/oxc-types/types.d.ts | 346 +------------------ tasks/ast_tools/src/generators/typescript.rs | 23 +- 2 files changed, 28 insertions(+), 341 deletions(-) diff --git a/npm/oxc-types/types.d.ts b/npm/oxc-types/types.d.ts index 34a37341037b9..67d2436a22bd0 100644 --- a/npm/oxc-types/types.d.ts +++ b/npm/oxc-types/types.d.ts @@ -49,9 +49,7 @@ export type Expression = | TSTypeAssertion | TSNonNullExpression | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; + | MemberExpression; export interface IdentifierName extends Span { type: 'Identifier'; @@ -99,51 +97,7 @@ export interface ObjectProperty extends Span { computed: boolean; } -export type PropertyKey = - | IdentifierName - | PrivateIdentifier - | BooleanLiteral - | NullLiteral - | NumericLiteral - | BigIntLiteral - | RegExpLiteral - | StringLiteral - | TemplateLiteral - | IdentifierReference - | MetaProperty - | Super - | ArrayExpression - | ArrowFunctionExpression - | AssignmentExpression - | AwaitExpression - | BinaryExpression - | CallExpression - | ChainExpression - | Class - | ConditionalExpression - | Function - | ImportExpression - | LogicalExpression - | NewExpression - | ObjectExpression - | ParenthesizedExpression - | SequenceExpression - | TaggedTemplateExpression - | ThisExpression - | UnaryExpression - | UpdateExpression - | YieldExpression - | PrivateInExpression - | JSXElement - | JSXFragment - | TSAsExpression - | TSSatisfiesExpression - | TSTypeAssertion - | TSNonNullExpression - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; +export type PropertyKey = IdentifierName | PrivateIdentifier | Expression; export type PropertyKind = 'init' | 'get' | 'set'; @@ -223,50 +177,7 @@ export interface SpreadElement extends Span { argument: Expression; } -export type Argument = - | SpreadElement - | BooleanLiteral - | NullLiteral - | NumericLiteral - | BigIntLiteral - | RegExpLiteral - | StringLiteral - | TemplateLiteral - | IdentifierReference - | MetaProperty - | Super - | ArrayExpression - | ArrowFunctionExpression - | AssignmentExpression - | AwaitExpression - | BinaryExpression - | CallExpression - | ChainExpression - | Class - | ConditionalExpression - | Function - | ImportExpression - | LogicalExpression - | NewExpression - | ObjectExpression - | ParenthesizedExpression - | SequenceExpression - | TaggedTemplateExpression - | ThisExpression - | UnaryExpression - | UpdateExpression - | YieldExpression - | PrivateInExpression - | JSXElement - | JSXFragment - | TSAsExpression - | TSSatisfiesExpression - | TSTypeAssertion - | TSNonNullExpression - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; +export type Argument = SpreadElement | Expression; export interface UpdateExpression extends Span { type: 'UpdateExpression'; @@ -316,18 +227,7 @@ export interface AssignmentExpression extends Span { right: Expression; } -export type AssignmentTarget = - | IdentifierReference - | TSAsExpression - | TSSatisfiesExpression - | TSNonNullExpression - | TSTypeAssertion - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression - | ArrayAssignmentTarget - | ObjectAssignmentTarget; +export type AssignmentTarget = SimpleAssignmentTarget | AssignmentTargetPattern; export type SimpleAssignmentTarget = | IdentifierReference @@ -336,9 +236,7 @@ export type SimpleAssignmentTarget = | TSNonNullExpression | TSTypeAssertion | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; + | MemberExpression; export type AssignmentTargetPattern = ArrayAssignmentTarget | ObjectAssignmentTarget; @@ -357,19 +255,7 @@ export interface AssignmentTargetRest extends Span { argument: AssignmentTarget; } -export type AssignmentTargetMaybeDefault = - | AssignmentTargetWithDefault - | IdentifierReference - | TSAsExpression - | TSSatisfiesExpression - | TSNonNullExpression - | TSTypeAssertion - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression - | ArrayAssignmentTarget - | ObjectAssignmentTarget; +export type AssignmentTargetMaybeDefault = AssignmentTargetWithDefault | AssignmentTarget; export interface AssignmentTargetWithDefault extends Span { type: 'AssignmentTargetWithDefault'; @@ -411,12 +297,7 @@ export interface ChainExpression extends Span { expression: ChainElement; } -export type ChainElement = - | CallExpression - | TSNonNullExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; +export type ChainElement = CallExpression | TSNonNullExpression | MemberExpression; export interface ParenthesizedExpression extends Span { type: 'ParenthesizedExpression'; @@ -442,20 +323,8 @@ export type Statement = | TryStatement | WhileStatement | WithStatement - | VariableDeclaration - | Function - | Class - | TSTypeAliasDeclaration - | TSInterfaceDeclaration - | TSEnumDeclaration - | TSModuleDeclaration - | TSImportEqualsDeclaration - | ImportDeclaration - | ExportAllDeclaration - | ExportDefaultDeclaration - | ExportNamedDeclaration - | TSExportAssignment - | TSNamespaceExportDeclaration; + | Declaration + | ModuleDeclaration; export interface Directive extends Span { type: 'Directive'; @@ -535,50 +404,7 @@ export interface ForStatement extends Span { body: Statement; } -export type ForStatementInit = - | VariableDeclaration - | BooleanLiteral - | NullLiteral - | NumericLiteral - | BigIntLiteral - | RegExpLiteral - | StringLiteral - | TemplateLiteral - | IdentifierReference - | MetaProperty - | Super - | ArrayExpression - | ArrowFunctionExpression - | AssignmentExpression - | AwaitExpression - | BinaryExpression - | CallExpression - | ChainExpression - | Class - | ConditionalExpression - | Function - | ImportExpression - | LogicalExpression - | NewExpression - | ObjectExpression - | ParenthesizedExpression - | SequenceExpression - | TaggedTemplateExpression - | ThisExpression - | UnaryExpression - | UpdateExpression - | YieldExpression - | PrivateInExpression - | JSXElement - | JSXFragment - | TSAsExpression - | TSSatisfiesExpression - | TSTypeAssertion - | TSNonNullExpression - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; +export type ForStatementInit = VariableDeclaration | Expression; export interface ForInStatement extends Span { type: 'ForInStatement'; @@ -587,19 +413,7 @@ export interface ForInStatement extends Span { body: Statement; } -export type ForStatementLeft = - | VariableDeclaration - | IdentifierReference - | TSAsExpression - | TSSatisfiesExpression - | TSNonNullExpression - | TSTypeAssertion - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression - | ArrayAssignmentTarget - | ObjectAssignmentTarget; +export type ForStatementLeft = VariableDeclaration | AssignmentTarget; export interface ForOfStatement extends Span { type: 'ForOfStatement'; @@ -951,52 +765,7 @@ export interface ExportSpecifier extends Span { exportKind: ImportOrExportKind; } -export type ExportDefaultDeclarationKind = - | Function - | Class - | TSInterfaceDeclaration - | BooleanLiteral - | NullLiteral - | NumericLiteral - | BigIntLiteral - | RegExpLiteral - | StringLiteral - | TemplateLiteral - | IdentifierReference - | MetaProperty - | Super - | ArrayExpression - | ArrowFunctionExpression - | AssignmentExpression - | AwaitExpression - | BinaryExpression - | CallExpression - | ChainExpression - | Class - | ConditionalExpression - | Function - | ImportExpression - | LogicalExpression - | NewExpression - | ObjectExpression - | ParenthesizedExpression - | SequenceExpression - | TaggedTemplateExpression - | ThisExpression - | UnaryExpression - | UpdateExpression - | YieldExpression - | PrivateInExpression - | JSXElement - | JSXFragment - | TSAsExpression - | TSSatisfiesExpression - | TSTypeAssertion - | TSNonNullExpression - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; +export type ExportDefaultDeclarationKind = Function | Class | TSInterfaceDeclaration | Expression; export type ModuleExportName = IdentifierName | IdentifierReference | StringLiteral; @@ -1099,50 +868,7 @@ export interface JSXExpressionContainer extends Span { expression: JSXExpression; } -export type JSXExpression = - | JSXEmptyExpression - | BooleanLiteral - | NullLiteral - | NumericLiteral - | BigIntLiteral - | RegExpLiteral - | StringLiteral - | TemplateLiteral - | IdentifierReference - | MetaProperty - | Super - | ArrayExpression - | ArrowFunctionExpression - | AssignmentExpression - | AwaitExpression - | BinaryExpression - | CallExpression - | ChainExpression - | Class - | ConditionalExpression - | Function - | ImportExpression - | LogicalExpression - | NewExpression - | ObjectExpression - | ParenthesizedExpression - | SequenceExpression - | TaggedTemplateExpression - | ThisExpression - | UnaryExpression - | UpdateExpression - | YieldExpression - | PrivateInExpression - | JSXElement - | JSXFragment - | TSAsExpression - | TSSatisfiesExpression - | TSTypeAssertion - | TSNonNullExpression - | TSInstantiationExpression - | ComputedMemberExpression - | StaticMemberExpression - | PrivateFieldExpression; +export type JSXExpression = JSXEmptyExpression | Expression; export interface JSXEmptyExpression extends Span { type: 'JSXEmptyExpression'; @@ -1327,47 +1053,7 @@ export interface TSRestType extends Span { typeAnnotation: TSType; } -export type TSTupleElement = - | TSOptionalType - | TSRestType - | TSAnyKeyword - | TSBigIntKeyword - | TSBooleanKeyword - | TSIntrinsicKeyword - | TSNeverKeyword - | TSNullKeyword - | TSNumberKeyword - | TSObjectKeyword - | TSStringKeyword - | TSSymbolKeyword - | TSUndefinedKeyword - | TSUnknownKeyword - | TSVoidKeyword - | TSArrayType - | TSConditionalType - | TSConstructorType - | TSFunctionType - | TSImportType - | TSIndexedAccessType - | TSInferType - | TSIntersectionType - | TSLiteralType - | TSMappedType - | TSNamedTupleMember - | TSQualifiedName - | TSTemplateLiteralType - | TSThisType - | TSTupleType - | TSTypeLiteral - | TSTypeOperator - | TSTypePredicate - | TSTypeQuery - | TSTypeReference - | TSUnionType - | TSParenthesizedType - | JSDocNullableType - | JSDocNonNullableType - | JSDocUnknownType; +export type TSTupleElement = TSOptionalType | TSRestType | TSType; export interface TSAnyKeyword extends Span { type: 'TSAnyKeyword'; @@ -1598,7 +1284,7 @@ export interface TSTypeQuery extends Span { typeParameters: TSTypeParameterInstantiation | null; } -export type TSTypeQueryExprName = TSImportType | IdentifierReference | TSQualifiedName; +export type TSTypeQueryExprName = TSImportType | TSTypeName; export interface TSImportType extends Span { type: 'TSImportType'; @@ -1681,7 +1367,7 @@ export interface TSImportEqualsDeclaration extends Span { importKind: ImportOrExportKind; } -export type TSModuleReference = TSExternalModuleReference | IdentifierReference | TSQualifiedName; +export type TSModuleReference = TSExternalModuleReference | TSTypeName; export interface TSExternalModuleReference extends Span { type: 'TSExternalModuleReference'; diff --git a/tasks/ast_tools/src/generators/typescript.rs b/tasks/ast_tools/src/generators/typescript.rs index 8191ef003cc2a..19876cc09646e 100644 --- a/tasks/ast_tools/src/generators/typescript.rs +++ b/tasks/ast_tools/src/generators/typescript.rs @@ -232,17 +232,18 @@ fn generate_ts_type_def_for_struct_field<'s>( /// Generate Typescript type definition for an enum. fn generate_ts_type_def_for_enum(enum_def: &EnumDef, schema: &Schema) -> String { - let union = if enum_def.is_fieldless() { - enum_def - .all_variants(schema) - .map(|variant| format!("'{}'", get_fieldless_variant_value(enum_def, variant))) - .join(" | ") - } else { - enum_def - .all_variants(schema) - .map(|variant| ts_type_name(variant.field_type(schema).unwrap(), schema)) - .join(" | ") - }; + let own_variants_type_names = enum_def.variants.iter().map(|variant| { + if let Some(variant_type) = variant.field_type(schema) { + ts_type_name(variant_type, schema) + } else { + Cow::Owned(format!("'{}'", get_fieldless_variant_value(enum_def, variant))) + } + }); + + let inherits_type_names = + enum_def.inherits_types(schema).map(|inherited_type| ts_type_name(inherited_type, schema)); + + let union = own_variants_type_names.chain(inherits_type_names).join(" | "); let enum_name = enum_def.name(); format!("export type {enum_name} = {union};")