• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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