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