17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ciimport { SyntaxKind } from 'typescript';
177c804472Sopenharmony_ciimport type { SourceFile } from 'typescript';
187c804472Sopenharmony_ciimport { firstCharacterToUppercase } from '../common/commonUtils';
197c804472Sopenharmony_ciimport type { StaticMethodEntity } from '../declaration-node/methodDeclaration';
207c804472Sopenharmony_ciimport { generateSymbolIterator, getCallbackStatement, getReturnStatement, getWarnConsole } from './generateCommonUtil';
217c804472Sopenharmony_ci
227c804472Sopenharmony_ci/**
237c804472Sopenharmony_ci * generate static method
247c804472Sopenharmony_ci * @param staticMethod
257c804472Sopenharmony_ci * @param isSystem
267c804472Sopenharmony_ci * @param sourceFile
277c804472Sopenharmony_ci * @returns
287c804472Sopenharmony_ci */
297c804472Sopenharmony_ciexport function generateStaticFunction(
307c804472Sopenharmony_ci  staticMethod: StaticMethodEntity,
317c804472Sopenharmony_ci  isSystem: boolean,
327c804472Sopenharmony_ci  sourceFile: SourceFile,
337c804472Sopenharmony_ci  mockApi: string
347c804472Sopenharmony_ci): string {
357c804472Sopenharmony_ci  let methodBody = '';
367c804472Sopenharmony_ci  const rootName = staticMethod.className;
377c804472Sopenharmony_ci  const methodEntity = staticMethod.methodEntity;
387c804472Sopenharmony_ci  if (isSystem) {
397c804472Sopenharmony_ci    methodBody += `${methodEntity.functionName.name}: function(...args) {`;
407c804472Sopenharmony_ci  } else {
417c804472Sopenharmony_ci    methodBody += `${firstCharacterToUppercase(staticMethod.className)}.${
427c804472Sopenharmony_ci      methodEntity.functionName.name
437c804472Sopenharmony_ci    } = function(...args) {`;
447c804472Sopenharmony_ci  }
457c804472Sopenharmony_ci
467c804472Sopenharmony_ci  methodBody += getWarnConsole(rootName, methodEntity.functionName.name);
477c804472Sopenharmony_ci  if (methodEntity.functionName.name === 'Symbol.iterator') {
487c804472Sopenharmony_ci    methodBody += generateSymbolIterator(methodEntity);
497c804472Sopenharmony_ci    methodBody += '}';
507c804472Sopenharmony_ci    return methodBody;
517c804472Sopenharmony_ci  }
527c804472Sopenharmony_ci
537c804472Sopenharmony_ci  const args = methodEntity.args;
547c804472Sopenharmony_ci  const len = args.length;
557c804472Sopenharmony_ci  if (args.length > 0 && args[len - 1].paramName === 'callback') {
567c804472Sopenharmony_ci    methodBody += getCallbackStatement(mockApi, args[len - 1]?.paramTypeString);
577c804472Sopenharmony_ci  }
587c804472Sopenharmony_ci
597c804472Sopenharmony_ci  if (methodEntity.returnType.returnKind !== SyntaxKind.VoidKeyword) {
607c804472Sopenharmony_ci    methodBody += getReturnStatement(methodEntity.returnType, sourceFile);
617c804472Sopenharmony_ci  }
627c804472Sopenharmony_ci  methodBody += '}';
637c804472Sopenharmony_ci
647c804472Sopenharmony_ci  if (isSystem) {
657c804472Sopenharmony_ci    methodBody += ',';
667c804472Sopenharmony_ci  } else {
677c804472Sopenharmony_ci    methodBody += ';';
687c804472Sopenharmony_ci  }
697c804472Sopenharmony_ci  return methodBody;
707c804472Sopenharmony_ci}
71