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 { getClassNameSet, specialClassName } from '../common/commonUtils'; 197c804472Sopenharmony_ciimport type { PropertyEntity } from '../declaration-node/propertyDeclaration'; 207c804472Sopenharmony_ciimport { getTheRealReferenceFromImport, getWarnConsole } from './generateCommonUtil'; 217c804472Sopenharmony_ciimport { ImportElementEntity } from '../declaration-node/importAndExportDeclaration'; 227c804472Sopenharmony_ciimport { addExtraImport } from './generateInterfaceDeclaration'; 237c804472Sopenharmony_ci 247c804472Sopenharmony_ci/** 257c804472Sopenharmony_ci * generate class property 267c804472Sopenharmony_ci * @param rootName 277c804472Sopenharmony_ci * @param propertyDeclaration 287c804472Sopenharmony_ci * @param sourceFile 297c804472Sopenharmony_ci * @returns 307c804472Sopenharmony_ci */ 317c804472Sopenharmony_ciexport function generatePropertyDeclaration( 327c804472Sopenharmony_ci rootName: string, 337c804472Sopenharmony_ci propertyDeclaration: PropertyEntity, 347c804472Sopenharmony_ci sourceFile: SourceFile, 357c804472Sopenharmony_ci extraImport: string[], 367c804472Sopenharmony_ci importDeclarations?: ImportElementEntity[] 377c804472Sopenharmony_ci): string { 387c804472Sopenharmony_ci let propertyBody = ''; 397c804472Sopenharmony_ci if (propertyDeclaration.isInitializer) { 407c804472Sopenharmony_ci propertyBody = `this.${propertyDeclaration.propertyName} = ${propertyDeclaration.initializer};`; 417c804472Sopenharmony_ci } else { 427c804472Sopenharmony_ci propertyBody = `this.${propertyDeclaration.propertyName} = `; 437c804472Sopenharmony_ci if (propertyDeclaration.kinds === SyntaxKind.GetAccessor) { 447c804472Sopenharmony_ci const warnCon = getWarnConsole(rootName, propertyDeclaration.propertyName); 457c804472Sopenharmony_ci propertyBody += `(function () {\n ${warnCon} \n return `; 467c804472Sopenharmony_ci } 477c804472Sopenharmony_ci if (propertyDeclaration.propertyTypeName.startsWith('{')) { 487c804472Sopenharmony_ci propertyBody += '{};'; 497c804472Sopenharmony_ci } else if (propertyDeclaration.kind === SyntaxKind.LiteralType) { 507c804472Sopenharmony_ci propertyBody += `${propertyDeclaration.propertyTypeName};`; 517c804472Sopenharmony_ci } else if (propertyDeclaration.kind === SyntaxKind.NumberKeyword) { 527c804472Sopenharmony_ci propertyBody += '0;'; 537c804472Sopenharmony_ci } else if (propertyDeclaration.kind === SyntaxKind.StringKeyword) { 547c804472Sopenharmony_ci propertyBody += '\'\''; 557c804472Sopenharmony_ci } else if (propertyDeclaration.kind === SyntaxKind.BooleanKeyword) { 567c804472Sopenharmony_ci propertyBody += 'true'; 577c804472Sopenharmony_ci } else if (propertyDeclaration.propertyTypeName.startsWith('Array')) { 587c804472Sopenharmony_ci propertyBody += '[];'; 597c804472Sopenharmony_ci } else if (propertyDeclaration.propertyTypeName.startsWith('Map')) { 607c804472Sopenharmony_ci propertyBody += '{key: {}};'; 617c804472Sopenharmony_ci } else if (propertyDeclaration.kind === SyntaxKind.TypeReference) { 627c804472Sopenharmony_ci propertyBody = generateTypeReference(propertyDeclaration, sourceFile, propertyBody); 637c804472Sopenharmony_ci } else if ( 647c804472Sopenharmony_ci propertyDeclaration.kind === SyntaxKind.NumericLiteral || 657c804472Sopenharmony_ci propertyDeclaration.kind === SyntaxKind.StringLiteral 667c804472Sopenharmony_ci ) { 677c804472Sopenharmony_ci propertyBody += ` ${propertyDeclaration.propertyTypeName};`; 687c804472Sopenharmony_ci } else { 697c804472Sopenharmony_ci propertyBody += `'[PC Previwe] unknown ${propertyDeclaration.propertyName}';`; 707c804472Sopenharmony_ci } 717c804472Sopenharmony_ci if (propertyDeclaration.kinds === SyntaxKind.GetAccessor) { 727c804472Sopenharmony_ci addExtraImport(extraImport, importDeclarations, sourceFile, propertyDeclaration); 737c804472Sopenharmony_ci propertyBody += '\n })();'; 747c804472Sopenharmony_ci } 757c804472Sopenharmony_ci } 767c804472Sopenharmony_ci return propertyBody; 777c804472Sopenharmony_ci} 787c804472Sopenharmony_ci 797c804472Sopenharmony_ci/** 807c804472Sopenharmony_ci * generate type reference 817c804472Sopenharmony_ci * @param propertyDeclaration 827c804472Sopenharmony_ci * @param sourceFile 837c804472Sopenharmony_ci * @param propertyBody 847c804472Sopenharmony_ci * @returns 857c804472Sopenharmony_ci */ 867c804472Sopenharmony_cifunction generateTypeReference( 877c804472Sopenharmony_ci propertyDeclaration: PropertyEntity, 887c804472Sopenharmony_ci sourceFile: SourceFile, 897c804472Sopenharmony_ci propertyBody: string 907c804472Sopenharmony_ci): string { 917c804472Sopenharmony_ci if (getClassNameSet().has(propertyDeclaration.propertyTypeName)) { 927c804472Sopenharmony_ci if (!specialClassName.includes(propertyDeclaration.propertyTypeName)) { 937c804472Sopenharmony_ci propertyBody += `new ${getTheRealReferenceFromImport(sourceFile, propertyDeclaration.propertyTypeName)}();`; 947c804472Sopenharmony_ci } else { 957c804472Sopenharmony_ci propertyBody += `${getTheRealReferenceFromImport(sourceFile, propertyDeclaration.propertyTypeName)};`; 967c804472Sopenharmony_ci } 977c804472Sopenharmony_ci } else { 987c804472Sopenharmony_ci propertyBody += `${getTheRealReferenceFromImport(sourceFile, propertyDeclaration.propertyTypeName)};`; 997c804472Sopenharmony_ci } 1007c804472Sopenharmony_ci return propertyBody; 1017c804472Sopenharmony_ci} 102