From 7f2ea18050b50d8019c0bb74864fe239e64a737e Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Thu, 6 Mar 2025 10:01:16 +0100 Subject: [PATCH] feat: Add support for destructuring parameters in AMD factory functions --- .../moduleDeclarationToDefinition.ts | 41 +++++++++++++----- .../amd/Factory_ParameterDestructuring.js | 7 +++ .../amdTranspiler/snapshots/transpiler.ts.md | 20 +++++++++ .../snapshots/transpiler.ts.snap | Bin 16228 -> 16344 bytes 4 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 test/fixtures/transpiler/amd/Factory_ParameterDestructuring.js diff --git a/src/linter/ui5Types/amdTranspiler/moduleDeclarationToDefinition.ts b/src/linter/ui5Types/amdTranspiler/moduleDeclarationToDefinition.ts index 1f8960e95..3f4641be6 100644 --- a/src/linter/ui5Types/amdTranspiler/moduleDeclarationToDefinition.ts +++ b/src/linter/ui5Types/amdTranspiler/moduleDeclarationToDefinition.ts @@ -49,7 +49,7 @@ function collectImports( return {imports, identifiers}; } - let factoryParams: ts.Identifier[] | undefined; + let factoryParams: (ts.Identifier | ts.ObjectBindingPattern)[] | undefined; let factoryRequiresCallWrapper = false; if (moduleDeclaration.factory) { if (ts.isFunctionExpression(moduleDeclaration.factory) || @@ -57,13 +57,12 @@ function collectImports( ts.isFunctionDeclaration(moduleDeclaration.factory)) { // Extract parameter names factoryParams = moduleDeclaration.factory.parameters.map((param) => { - if (!ts.isIdentifier(param.name)) { - // Indicates destructuring in factory signature. This is not (yet?) supported - throw new UnsupportedModuleError( - `Unexpected parameter type ${ts.SyntaxKind[param.kind]} ` + - `at ${toPosStr(param)}`); + if (ts.isIdentifier(param.name) || ts.isObjectBindingPattern(param.name)) { + return param.name; + } else { + throw new UnsupportedModuleError(`Unable to determine parameter name for factory. Can't parse ` + + `parameter at ${toPosStr(param)}`); } - return param.name; }); } else if (ts.isIdentifier(moduleDeclaration.factory)) { factoryRequiresCallWrapper = true; @@ -92,20 +91,25 @@ function collectImports( moduleSpecifier = dep; } let identifier: ts.Identifier | undefined; + let namedImports: ts.NamedImports | undefined; if (factoryRequiresCallWrapper) { // Generate variable name based on import module // Later this variable will be used to call the factory function identifier = nodeFactory.createUniqueName(dep.text.replace(/[^a-zA-Z0-9]/g, "_")); } else if (factoryParams?.[i]) { // Use factory parameter identifier as import identifier - identifier = factoryParams[i]; + const factoryParam = factoryParams[i]; + if (ts.isIdentifier(factoryParam)) { + identifier = factoryParam; + } else if (ts.isObjectBindingPattern(factoryParam)) { + namedImports = createNamedImportsFromObjectBindingPattern(factoryParam, nodeFactory); + } } // else: Side effect imports. No identifier needed - let importClause; if (identifier) { identifiers.push(identifier); - importClause = nodeFactory.createImportClause(false, identifier, undefined); } + const importClause = nodeFactory.createImportClause(false, identifier, namedImports); imports.push(nodeFactory.createImportDeclaration( undefined, @@ -343,3 +347,20 @@ function createDefaultExport(factory: ts.NodeFactory, node: ts.Node): ts.Stateme toPosStr(node)); } } + +function createNamedImportsFromObjectBindingPattern( + objectBindingPattern: ts.ObjectBindingPattern, nodeFactory: ts.NodeFactory +): ts.NamedImports { + const elements: ts.ImportSpecifier[] = []; + for (const element of objectBindingPattern.elements) { + if (ts.isBindingElement(element)) { + if (ts.isIdentifier(element.name)) { + elements.push(nodeFactory.createImportSpecifier(false, undefined, element.name)); + } else { + throw new UnsupportedModuleError( + `Unsupported parameter destructuring for factory at ${toPosStr(element.name)}`); + } + } + } + return nodeFactory.createNamedImports(elements); +} diff --git a/test/fixtures/transpiler/amd/Factory_ParameterDestructuring.js b/test/fixtures/transpiler/amd/Factory_ParameterDestructuring.js new file mode 100644 index 000000000..c1900fbcf --- /dev/null +++ b/test/fixtures/transpiler/amd/Factory_ParameterDestructuring.js @@ -0,0 +1,7 @@ +sap.ui.define([ + "sap/ui/core/library" +], function( + {MessageType} +) { + +}); diff --git a/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md b/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md index 5fdfff128..44bbf716f 100644 --- a/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md +++ b/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md @@ -702,6 +702,26 @@ Generated by [AVA](https://avajs.dev). version: 3, } +## Transpile Factory_ParameterDestructuring.js + +> Snapshot 1 + + `import { MessageType } from "sap/ui/core/library";␊ + //# sourceMappingURL=Factory_ParameterDestructuring.js.map` + +> Snapshot 2 + + { + file: 'Factory_ParameterDestructuring.js', + mappings: 'SAGE,WAAW,QAFZ,qBAAqB', + names: [], + sourceRoot: '', + sources: [ + 'Factory_ParameterDestructuring.js', + ], + version: 3, + } + ## Transpile Factory_ReturnCallExp.js > Snapshot 1 diff --git a/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.snap b/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.snap index 8502be0493420e2d0d1ecdd0af2473e10486d79b..62724f02308990662f6939166b53ed9de689a9b4 100644 GIT binary patch literal 16344 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 a37-Psr=J=&BVpoR+y4hl%YETNO922v6OP9K literal 16228 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 B@i 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 O+WtQYEQO}fNC5!LU3&BY