1/* 2 * Copyright (c) 2022-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import * as arkts from '@koalaui/libarkts'; 17import { FunctionTransformer } from './function-transformer'; 18import { PositionalIdTracker } from './utils'; 19import { factory } from './memo-factory'; 20import { ReturnTransformer } from './return-transformer'; 21import { ParameterTransformer } from './parameter-transformer'; 22import { EtsglobalRemover } from '../common/etsglobal-remover'; 23import { SignatureTransformer } from './signature-transformer'; 24 25export interface TransformerOptions { 26 trace?: boolean; 27 removeEtsglobal?: boolean; 28} 29 30export default function memoTransformer(userPluginOptions?: TransformerOptions) { 31 return (node0: arkts.EtsScript) => { 32 const node = ( 33 userPluginOptions?.removeEtsglobal ? new EtsglobalRemover().visitor(node0) : node0 34 ) as arkts.EtsScript; 35 const positionalIdTracker = new PositionalIdTracker(arkts.getFileName(), false); 36 const parameterTransformer = new ParameterTransformer({ 37 positionalIdTracker, 38 }); 39 const returnTransformer = new ReturnTransformer(); 40 const signatureTransformer = new SignatureTransformer(); 41 const functionTransformer = new FunctionTransformer({ 42 positionalIdTracker, 43 parameterTransformer, 44 returnTransformer, 45 signatureTransformer, 46 }); 47 factory.createContextTypesImportDeclaration(arkts.arktsGlobal.compilerContext?.program); 48 return functionTransformer.visitor(arkts.factory.updateEtsScript(node, node.statements)); 49 }; 50} 51