1/* 2 * Copyright (c) 2023 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 type {INameGenerator, NameGeneratorOptions} from './INameGenerator'; 17 18/** 19 * @Desc: a name generator which use underline to get obfuscated name 20 */ 21export class UnderlineNameGenerator implements INameGenerator { 22 private readonly mMaxLength: number; 23 private readonly mReservedNames: Set<string>; 24 25 private mCurrentLength: number; 26 27 constructor(options: NameGeneratorOptions) { 28 const maxValue: number = 128; 29 this.mMaxLength = (options && options.underlineMaxLength) ? options.underlineMaxLength : maxValue; 30 this.mReservedNames = options?.reservedNames; 31 this.mCurrentLength = 1; 32 } 33 34 /** 35 * @return: null for end 36 */ 37 public getName(): string { 38 if (this.mCurrentLength > this.mMaxLength) { 39 return null; 40 } 41 42 let targetStr: string = '_'.repeat(this.mCurrentLength); 43 this.mCurrentLength += 1; 44 45 if (this.mReservedNames?.has(targetStr)) { 46 return this.getName(); 47 } 48 49 return targetStr; 50 } 51 52 public reset(): void { 53 this.mCurrentLength = 1; 54 } 55} 56