From 15b0c10c990ff6aa18d2efec84ed04dce278edb2 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 20 Apr 2023 13:44:43 +0200 Subject: [PATCH] Support default exported classes that extend other classes --- src/ast/nodes/ExportDefaultDeclaration.ts | 37 ++++++------------- .../_config.js | 3 ++ .../_expected.js | 7 ++++ .../main.js | 5 +++ 4 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 test/form/samples/default-export-anonymous-class-extends/_config.js create mode 100644 test/form/samples/default-export-anonymous-class-extends/_expected.js create mode 100644 test/form/samples/default-export-anonymous-class-extends/main.js diff --git a/src/ast/nodes/ExportDefaultDeclaration.ts b/src/ast/nodes/ExportDefaultDeclaration.ts index ca9372bd5c6..7a626667691 100644 --- a/src/ast/nodes/ExportDefaultDeclaration.ts +++ b/src/ast/nodes/ExportDefaultDeclaration.ts @@ -21,18 +21,10 @@ function getDeclarationStart(code: string, start: number): number { return findNonWhiteSpace(code, findFirstOccurrenceOutsideComment(code, 'default', start) + 7); } -function getIdInsertPosition( - code: string, - declarationKeyword: string, - endMarker: string, - start: number -): number { +function getFunctionIdInsertPosition(code: string, start: number): number { const declarationEnd = - findFirstOccurrenceOutsideComment(code, declarationKeyword, start) + declarationKeyword.length; - code = code.slice( - declarationEnd, - findFirstOccurrenceOutsideComment(code, endMarker, declarationEnd) - ); + findFirstOccurrenceOutsideComment(code, 'function', start) + 'function'.length; + code = code.slice(declarationEnd, findFirstOccurrenceOutsideComment(code, '(', declarationEnd)); const generatorStarPos = findFirstOccurrenceOutsideComment(code, '*'); if (generatorStarPos === -1) { return declarationEnd; @@ -76,18 +68,18 @@ export default class ExportDefaultDeclaration extends NodeBase { this.renderNamedDeclaration( code, declarationStart, - 'function', - '(', - this.declaration.id === null, + this.declaration.id === null + ? getFunctionIdInsertPosition(code.original, declarationStart) + : null, options ); } else if (this.declaration instanceof ClassDeclaration) { this.renderNamedDeclaration( code, declarationStart, - 'class', - '{', - this.declaration.id === null, + this.declaration.id === null + ? findFirstOccurrenceOutsideComment(code.original, 'class', start) + 'class'.length + : null, options ); } else if (this.variable.getOriginalVariable() !== this.variable) { @@ -114,9 +106,7 @@ export default class ExportDefaultDeclaration extends NodeBase { private renderNamedDeclaration( code: MagicString, declarationStart: number, - declarationKeyword: string, - endMarker: string, - needsId: boolean, + idInsertPosition: number | null, options: RenderOptions ): void { const { @@ -128,11 +118,8 @@ export default class ExportDefaultDeclaration extends NodeBase { // Remove `export default` code.remove(this.start, declarationStart); - if (needsId) { - code.appendLeft( - getIdInsertPosition(code.original, declarationKeyword, endMarker, declarationStart), - ` ${name}` - ); + if (idInsertPosition !== null) { + code.appendLeft(idInsertPosition, ` ${name}`); } if ( format === 'system' && diff --git a/test/form/samples/default-export-anonymous-class-extends/_config.js b/test/form/samples/default-export-anonymous-class-extends/_config.js new file mode 100644 index 00000000000..2ed4457e53c --- /dev/null +++ b/test/form/samples/default-export-anonymous-class-extends/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'handles default exported classes extending a regular expression argument (#4783)' +}; diff --git a/test/form/samples/default-export-anonymous-class-extends/_expected.js b/test/form/samples/default-export-anonymous-class-extends/_expected.js new file mode 100644 index 00000000000..f8f4d1e17a5 --- /dev/null +++ b/test/form/samples/default-export-anonymous-class-extends/_expected.js @@ -0,0 +1,7 @@ +function foo(val) { + return val; +} + +class main extends foo(/1/) {} + +export { main as default }; diff --git a/test/form/samples/default-export-anonymous-class-extends/main.js b/test/form/samples/default-export-anonymous-class-extends/main.js new file mode 100644 index 00000000000..87344a1ea57 --- /dev/null +++ b/test/form/samples/default-export-anonymous-class-extends/main.js @@ -0,0 +1,5 @@ +function foo(val) { + return val; +} + +export default class extends foo(/1/) {}