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 type { PropertySignatureEntity } from '../declaration-node/propertySignatureDeclaration';
197c804472Sopenharmony_ciimport {
207c804472Sopenharmony_ci  checkIsGenericSymbol,
217c804472Sopenharmony_ci  getCallbackStatement,
227c804472Sopenharmony_ci  getTheRealReferenceFromImport,
237c804472Sopenharmony_ci  getWarnConsole,
247c804472Sopenharmony_ci  propertyTypeWhiteList,
257c804472Sopenharmony_ci  paramsTypeStart
267c804472Sopenharmony_ci} from './generateCommonUtil';
277c804472Sopenharmony_ci
287c804472Sopenharmony_ci/**
297c804472Sopenharmony_ci * generate interface signature property
307c804472Sopenharmony_ci * @param rootName
317c804472Sopenharmony_ci * @param propertySignature
327c804472Sopenharmony_ci * @param sourceFile
337c804472Sopenharmony_ci * @returns
347c804472Sopenharmony_ci */
357c804472Sopenharmony_ciexport function generatePropertySignatureDeclaration(
367c804472Sopenharmony_ci  rootName: string,
377c804472Sopenharmony_ci  propertySignature: PropertySignatureEntity,
387c804472Sopenharmony_ci  sourceFile: SourceFile,
397c804472Sopenharmony_ci  mockApi: string
407c804472Sopenharmony_ci): string {
417c804472Sopenharmony_ci  let propertySignatureBody = '';
427c804472Sopenharmony_ci  if (propertySignature.kind === SyntaxKind.FunctionType) {
437c804472Sopenharmony_ci    propertySignatureBody += `${propertySignature.propertyName}: function(...args) {`;
447c804472Sopenharmony_ci    propertySignatureBody += getWarnConsole(rootName, propertySignature.propertyName);
457c804472Sopenharmony_ci    propertySignatureBody += getCallbackStatement(mockApi);
467c804472Sopenharmony_ci    propertySignatureBody += '},\n';
477c804472Sopenharmony_ci  } else {
487c804472Sopenharmony_ci    if (
497c804472Sopenharmony_ci      (propertySignature.propertyTypeName.startsWith('{') ||
507c804472Sopenharmony_ci      propertySignature.propertyTypeName.startsWith('Record<') ||
517c804472Sopenharmony_ci      propertySignature.propertyTypeName.startsWith('Object') ||
527c804472Sopenharmony_ci      propertySignature.propertyTypeName.startsWith('object')) &&
537c804472Sopenharmony_ci      !propertySignature.propertyTypeName.endsWith(']')
547c804472Sopenharmony_ci    ) {
557c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: {},`;
567c804472Sopenharmony_ci    } else if (propertySignature.kind === SyntaxKind.TypeReference) {
577c804472Sopenharmony_ci      propertySignatureBody = generatePropertySignatureForTypeReference(propertySignature, sourceFile);
587c804472Sopenharmony_ci    } else if (propertySignature.kind === SyntaxKind.NumberKeyword) {
597c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: 0,`;
607c804472Sopenharmony_ci    } else if (propertySignature.kind === SyntaxKind.StringKeyword) {
617c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: '[PC Preview] unknown ${propertySignature.propertyName}',`;
627c804472Sopenharmony_ci    } else if (propertySignature.kind === SyntaxKind.BooleanKeyword) {
637c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: true,`;
647c804472Sopenharmony_ci    } else if (propertySignature.kind === SyntaxKind.UnionType) {
657c804472Sopenharmony_ci      propertySignatureBody = generatePropertySignatureForUnionType(propertySignature, sourceFile);
667c804472Sopenharmony_ci    } else if (propertySignature.kind === SyntaxKind.ArrayType) {
677c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: [],`;
687c804472Sopenharmony_ci    } else {
697c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: '[PC Preview] unknown ${propertySignature.propertyName}',`;
707c804472Sopenharmony_ci    }
717c804472Sopenharmony_ci  }
727c804472Sopenharmony_ci  return propertySignatureBody;
737c804472Sopenharmony_ci}
747c804472Sopenharmony_ci
757c804472Sopenharmony_ci/**
767c804472Sopenharmony_ci * generate interface signature property for TypeReference
777c804472Sopenharmony_ci * @param propertySignature
787c804472Sopenharmony_ci * @param sourceFile
797c804472Sopenharmony_ci * @returns
807c804472Sopenharmony_ci */
817c804472Sopenharmony_cifunction generatePropertySignatureForTypeReference(
827c804472Sopenharmony_ci  propertySignature: PropertySignatureEntity,
837c804472Sopenharmony_ci  sourceFile: SourceFile
847c804472Sopenharmony_ci): string {
857c804472Sopenharmony_ci  let propertySignatureBody = '';
867c804472Sopenharmony_ci  if (propertySignature.propertyTypeName.startsWith('Array')) {
877c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: [],`;
887c804472Sopenharmony_ci  } else if (propertySignature.propertyTypeName.startsWith('Map')) {
897c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: {key: {}},`;
907c804472Sopenharmony_ci  } else if (
917c804472Sopenharmony_ci    propertySignature.propertyTypeName === 'string' ||
927c804472Sopenharmony_ci    checkIsGenericSymbol(propertySignature.propertyTypeName) ||
937c804472Sopenharmony_ci    propertySignature.propertyTypeName === 'bool' ||
947c804472Sopenharmony_ci    propertySignature.propertyTypeName === 'Data'
957c804472Sopenharmony_ci  ) {
967c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: '[PC Preview] unknown ${propertySignature.propertyName}',`;
977c804472Sopenharmony_ci  } else if (propertySignature.propertyTypeName === 'IlluminateType') {
987c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: '',`;
997c804472Sopenharmony_ci  } else {
1007c804472Sopenharmony_ci    if (propertySignature.propertyTypeName.includes('<')) {
1017c804472Sopenharmony_ci      propertySignatureBody = handlepropertyTypeNameBody(propertySignature, sourceFile);
1027c804472Sopenharmony_ci    } else {
1037c804472Sopenharmony_ci      if (propertyTypeWhiteList(propertySignature.propertyTypeName) === propertySignature.propertyTypeName) {
1047c804472Sopenharmony_ci        propertySignatureBody = `${propertySignature.propertyName}: ${getTheRealReferenceFromImport(sourceFile, propertySignature.propertyTypeName)},`;
1057c804472Sopenharmony_ci      } else {
1067c804472Sopenharmony_ci        propertySignatureBody = `${propertySignature.propertyName}: ${propertyTypeWhiteList(propertySignature.propertyTypeName)},`;
1077c804472Sopenharmony_ci      }
1087c804472Sopenharmony_ci    }
1097c804472Sopenharmony_ci  }
1107c804472Sopenharmony_ci  return propertySignatureBody;
1117c804472Sopenharmony_ci}
1127c804472Sopenharmony_ci
1137c804472Sopenharmony_ci/**
1147c804472Sopenharmony_ci * generate interface signature property for UnionType
1157c804472Sopenharmony_ci * @param propertySignature
1167c804472Sopenharmony_ci * @param sourceFile
1177c804472Sopenharmony_ci * @returns
1187c804472Sopenharmony_ci */
1197c804472Sopenharmony_cifunction generatePropertySignatureForUnionType(
1207c804472Sopenharmony_ci  propertySignature: PropertySignatureEntity,
1217c804472Sopenharmony_ci  sourceFile: SourceFile
1227c804472Sopenharmony_ci): string {
1237c804472Sopenharmony_ci  let propertySignatureBody = '';
1247c804472Sopenharmony_ci  let unionFirstElement = propertySignature.propertyTypeName.split('|')[0].trim();
1257c804472Sopenharmony_ci  if (unionFirstElement.includes('[]') || unionFirstElement.startsWith('[') || unionFirstElement.endsWith(']')) {
1267c804472Sopenharmony_ci    unionFirstElement = '[]';
1277c804472Sopenharmony_ci  }
1287c804472Sopenharmony_ci  if (unionFirstElement.startsWith('"') || unionFirstElement.startsWith("'")) {
1297c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: ${unionFirstElement},`;
1307c804472Sopenharmony_ci  } else if (unionFirstElement === 'string') {
1317c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: '[PC Preview] unknown ${propertySignature.propertyName}',`;
1327c804472Sopenharmony_ci  } else if (unionFirstElement === 'number') {
1337c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: 0,`;
1347c804472Sopenharmony_ci  } else if (unionFirstElement === 'boolean') {
1357c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: true,`;
1367c804472Sopenharmony_ci  } else if (unionFirstElement === 'Uint8Array') {
1377c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: new ${unionFirstElement}(),`;
1387c804472Sopenharmony_ci  } else {
1397c804472Sopenharmony_ci    let element = unionFirstElement;
1407c804472Sopenharmony_ci    if (element === 'HTMLCanvasElement') {
1417c804472Sopenharmony_ci      element = `'[PC Preview] unknown ${propertySignature.propertyName}'`;
1427c804472Sopenharmony_ci    } else if (element === 'WebGLActiveInfo') {
1437c804472Sopenharmony_ci      element = '{size: \'[PC Preview] unknown GLint\', type: 0, name: \'[PC Preview] unknown name\'}';
1447c804472Sopenharmony_ci    } else if (element.startsWith('Array')) {
1457c804472Sopenharmony_ci      element = '[]';
1467c804472Sopenharmony_ci    } else if (propertyTypeWhiteList(unionFirstElement) === unionFirstElement) {
1477c804472Sopenharmony_ci      element = getTheRealReferenceFromImport(sourceFile, unionFirstElement);
1487c804472Sopenharmony_ci    }
1497c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: ${element},`;
1507c804472Sopenharmony_ci  }
1517c804472Sopenharmony_ci  return propertySignatureBody;
1527c804472Sopenharmony_ci}
1537c804472Sopenharmony_ci
1547c804472Sopenharmony_ci/**
1557c804472Sopenharmony_ci * generate interface signature property for TypeReference
1567c804472Sopenharmony_ci * @param propertySignature
1577c804472Sopenharmony_ci * @param sourceFile
1587c804472Sopenharmony_ci * @returns
1597c804472Sopenharmony_ci */
1607c804472Sopenharmony_cifunction handlepropertyTypeNameBody(propertySignature: PropertySignatureEntity, sourceFile: SourceFile): string {
1617c804472Sopenharmony_ci  let propertySignatureBody = '';
1627c804472Sopenharmony_ci  if (
1637c804472Sopenharmony_ci    propertySignature.propertyTypeName.startsWith('AsyncCallback') ||
1647c804472Sopenharmony_ci    propertySignature.propertyTypeName.startsWith('Callback')
1657c804472Sopenharmony_ci  ) {
1667c804472Sopenharmony_ci    propertySignatureBody = `${propertySignature.propertyName}: ()=>{},`;
1677c804472Sopenharmony_ci  } else {
1687c804472Sopenharmony_ci    const preSplit = propertySignature.propertyTypeName.split('<');
1697c804472Sopenharmony_ci    const genericArg = preSplit[preSplit.length - 1].split('>')[0];
1707c804472Sopenharmony_ci    if (genericArg.includes(',')) {
1717c804472Sopenharmony_ci      return `${propertySignature.propertyName}: {},`;
1727c804472Sopenharmony_ci    }
1737c804472Sopenharmony_ci    let sourceFileContent = sourceFile.text;
1747c804472Sopenharmony_ci    const removeNoteRegx = /\/\*[\s\S]*?\*\//g;
1757c804472Sopenharmony_ci    sourceFileContent = sourceFileContent.replace(removeNoteRegx, '');
1767c804472Sopenharmony_ci    const regex = new RegExp(`\\s${genericArg}\\s({|=|extends)`);
1777c804472Sopenharmony_ci    const results = sourceFileContent.match(regex);
1787c804472Sopenharmony_ci    if (results) {
1797c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: ${genericArg},`;
1807c804472Sopenharmony_ci    } else {
1817c804472Sopenharmony_ci      let getPropertyTypeName = null;
1827c804472Sopenharmony_ci      Object.keys(paramsTypeStart).forEach(key => {
1837c804472Sopenharmony_ci        if (genericArg.startsWith(key)) {
1847c804472Sopenharmony_ci          getPropertyTypeName =
1857c804472Sopenharmony_ci            paramsTypeStart[key] === '[PC Preview] unknown type'
1867c804472Sopenharmony_ci              ? `'${paramsTypeStart[key]}'`
1877c804472Sopenharmony_ci              : `${paramsTypeStart[key]}`;
1887c804472Sopenharmony_ci        }
1897c804472Sopenharmony_ci      });
1907c804472Sopenharmony_ci      propertySignatureBody = `${propertySignature.propertyName}: ${
1917c804472Sopenharmony_ci        getPropertyTypeName ?? '\'[PC Preview] unknown type\''
1927c804472Sopenharmony_ci      },`;
1937c804472Sopenharmony_ci    }
1947c804472Sopenharmony_ci  }
1957c804472Sopenharmony_ci  return propertySignatureBody;
1967c804472Sopenharmony_ci}
197