浏览代码

Merge pull request #953 from javascript-obfuscator/string-array-function-calls-wrappers-improvements

`stringArrayWrappersType: 'function'` now generates different indexes…
Timofey Kachalov 3 年之前
父节点
当前提交
e4293809b8
共有 23 个文件被更改,包括 288 次插入433 次删除
  1. 2 0
      CHANGELOG.md
  2. 0 0
      dist/index.browser.js
  3. 0 0
      dist/index.cli.js
  4. 0 0
      dist/index.js
  5. 1 2
      src/container/ServiceIdentifiers.ts
  6. 4 10
      src/container/modules/storages/StoragesModule.ts
  7. 12 21
      src/custom-nodes/string-array-nodes/StringArrayCallNode.ts
  8. 23 48
      src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts
  9. 13 12
      src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperVariableNode.ts
  10. 0 25
      src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData.ts
  11. 4 2
      src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData.ts
  12. 0 10
      src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage.ts
  13. 0 10
      src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage.ts
  14. 10 0
      src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts
  15. 60 120
      src/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperTransformer.ts
  16. 63 119
      src/node-transformers/string-array-transformers/StringArrayTransformer.ts
  17. 0 28
      src/storages/string-array-transformers/StringArrayScopeCallsWrapperLexicalScopeDataStorage.ts
  18. 5 5
      src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts
  19. 0 7
      src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding.ts
  20. 7 0
      src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding.ts
  21. 28 14
      test/dev/dev.ts
  22. 54 0
      test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts
  23. 2 0
      test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/fixtures/function-calls-wrappers-different-indexes.js

+ 2 - 0
CHANGELOG.md

@@ -2,6 +2,8 @@ Change Log
 
 v2.16.0
 ---
+* `stringArrayWrappersType: 'function'` now generates different indexes between each wrapper inside the same lexical scope
+* `stringArrayWrappersType: 'function'` now generates different parameters order between each wrapper inside the same lexical scope
 * `stringArrayWrappersType: 'function'` now appends `FunctionDeclaration` functions instead of `FunctionExpression` functions. This allows to append these wrappers at random positions inside each scope
 
 v2.15.6

文件差异内容过多而无法显示
+ 0 - 0
dist/index.browser.js


文件差异内容过多而无法显示
+ 0 - 0
dist/index.cli.js


文件差异内容过多而无法显示
+ 0 - 0
dist/index.js


+ 1 - 2
src/container/ServiceIdentifiers.ts

@@ -53,8 +53,7 @@ export enum ServiceIdentifiers {
     ISourceCode = 'ISourceCode',
     IScopeAnalyzer = 'IScopeAnalyzer',
     IStringArrayIndexNode = 'IStringArrayIndexNode',
-    IStringArrayScopeCallsWrapperLexicalScopeDataStorage = 'IStringArrayScopeCallsWrapperLexicalScopeDataStorage',
-    IStringArrayScopeCallsWrapperNamesDataStorage = 'IStringArrayScopeCallsWrapperNamesDataStorage',
+    IStringArrayScopeCallsWrappersDataStorage = 'IStringArrayScopeCallsWrappersDataStorage',
     IStringArrayStorage = 'IStringArrayStorage',
     IStringArrayStorageAnalyzer = 'IStringArrayStorageAnalyzer',
     IThroughIdentifierReplacer = 'IThroughIdentifierReplacer',

+ 4 - 10
src/container/modules/storages/StoragesModule.ts

@@ -9,8 +9,7 @@ import { ILiteralNodesCacheStorage } from '../../../interfaces/storages/string-a
 import { IOptions } from '../../../interfaces/options/IOptions';
 import { IPropertyIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IPropertyIdentifierNamesCacheStorage';
 import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 import { IStringArrayStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 import { IVisitedLexicalScopeNodesStackStorage } from '../../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage';
 
@@ -19,8 +18,7 @@ import { CustomCodeHelperGroupStorage } from '../../../storages/custom-code-help
 import { GlobalIdentifierNamesCacheStorage } from '../../../storages/identifier-names-cache/GlobalIdentifierNamesCacheStorage';
 import { LiteralNodesCacheStorage } from '../../../storages/string-array-transformers/LiteralNodesCacheStorage';
 import { PropertyIdentifierNamesCacheStorage } from '../../../storages/identifier-names-cache/PropertyIdentifierNamesCacheStorage';
-import { StringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { StringArrayScopeCallsWrapperNamesDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperNamesDataStorage';
+import { StringArrayScopeCallsWrappersDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage';
 import { StringArrayStorage } from '../../../storages/string-array-transformers/StringArrayStorage';
 import { VisitedLexicalScopeNodesStackStorage } from '../../../storages/string-array-transformers/VisitedLexicalScopeNodesStackStorage';
 
@@ -46,12 +44,8 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b
         .to(StringArrayStorage)
         .inSingletonScope();
 
-    bind<IStringArrayScopeCallsWrapperLexicalScopeDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
-        .to(StringArrayScopeCallsWrapperLexicalScopeDataStorage)
-        .inSingletonScope();
-
-    bind<IStringArrayScopeCallsWrapperNamesDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
-        .to(StringArrayScopeCallsWrapperNamesDataStorage)
+    bind<IStringArrayScopeCallsWrappersDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrappersDataStorage)
+        .to(StringArrayScopeCallsWrappersDataStorage)
         .inSingletonScope();
 
     bind<IVisitedLexicalScopeNodesStackStorage>(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage)

+ 12 - 21
src/custom-nodes/string-array-nodes/StringArrayCallNode.ts

@@ -11,7 +11,6 @@ import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
 import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 
 import { initializable } from '../../decorators/Initializable';
@@ -19,6 +18,7 @@ import { initializable } from '../../decorators/Initializable';
 import { AbstractStringArrayCallNode } from './AbstractStringArrayCallNode';
 import { NodeFactory } from '../../node/NodeFactory';
 import { NodeUtils } from '../../node/NodeUtils';
+import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 
 @injectable()
 export class StringArrayCallNode extends AbstractStringArrayCallNode {
@@ -41,16 +41,10 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
     private indexShiftAmount!: number;
 
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private stringArrayCallsWrapperName!: string;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
-     */
-    @initializable()
-    private stringArrayCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
+    private stringArrayCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
      * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -84,23 +78,20 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
     }
 
     /**
-     * @param {string} stringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayCallsWrapperParameterIndexesData
      * @param {number} index
      * @param {number} indexShiftAmount
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayCallsWrapperData
      * @param {string | null} decodeKey
      */
     public initialize (
-        stringArrayCallsWrapperName: string,
-        stringArrayCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
         index: number,
         indexShiftAmount: number,
+        stringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
         decodeKey: string | null
     ): void {
-        this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
-        this.stringArrayCallsWrapperParameterIndexesData = stringArrayCallsWrapperParameterIndexesData;
         this.index = index;
         this.indexShiftAmount = indexShiftAmount;
+        this.stringArrayCallsWrapperData = stringArrayCallsWrapperData;
         this.decodeKey = decodeKey;
     }
 
@@ -108,7 +99,7 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
      * @returns {TStatement[]}
      */
     protected getNodeStructure (): TStatement[] {
-        const resultIndex: number = this.indexShiftAmount + this.index;
+        const resultIndex: number = this.indexShiftAmount + this.stringArrayCallsWrapperData.index + this.index;
 
         const indexNode: ESTree.Expression = this.getStringArrayIndexNode(resultIndex);
         const rc4KeyLiteralNode: ESTree.Literal | null = this.decodeKey
@@ -117,7 +108,7 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
 
         // filling call expression arguments with a fake arguments first
         const callExpressionArgs: ESTree.Expression[] = this.arrayUtils.fillWithRange(
-            !this.stringArrayCallsWrapperParameterIndexesData
+            !this.stringArrayCallsWrapperData.parameterIndexesData
                 // root string array calls wrapper
                 ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
@@ -126,14 +117,14 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
         );
 
         callExpressionArgs.splice(
-            this.stringArrayCallsWrapperParameterIndexesData?.valueIndexParameterIndex ?? 0,
+            this.stringArrayCallsWrapperData.parameterIndexesData?.valueIndexParameterIndex ?? 0,
             1,
             indexNode
         );
 
-        if (this.stringArrayCallsWrapperParameterIndexesData) {
+        if (this.stringArrayCallsWrapperData.parameterIndexesData) {
             callExpressionArgs.splice(
-                this.stringArrayCallsWrapperParameterIndexesData.decodeKeyParameterIndex,
+                this.stringArrayCallsWrapperData.parameterIndexesData.decodeKeyParameterIndex,
                 1,
                 // use rc4 key literal node if exists or a node with fake string array wrapper index
                 rc4KeyLiteralNode ?? this.getFakeStringArrayIndexNode(resultIndex)
@@ -147,7 +138,7 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
 
         const structure: TStatement = NodeFactory.expressionStatementNode(
             NodeFactory.callExpressionNode(
-                NodeFactory.identifierNode(this.stringArrayCallsWrapperName),
+                NodeFactory.identifierNode(this.stringArrayCallsWrapperData.name),
                 callExpressionArgs
             )
         );

+ 23 - 48
src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts

@@ -11,7 +11,7 @@ import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
 import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
+import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 
 import { initializable } from '../../decorators/Initializable';
@@ -23,35 +23,16 @@ import { NodeUtils } from '../../node/NodeUtils';
 @injectable()
 export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArrayCallNode {
     /**
-     * @type {number}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private shiftedIndex!: number;
+    private upperStringArrayCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private upperStringArrayCallsWrapperName!: string;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData}
-     */
-    @initializable()
-    private upperStringArrayCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
-
-    /**
-     * @type {string}
-     */
-    @initializable()
-    private stringArrayScopeCallsWrapperName!: string;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData}
-     */
-    @initializable()
-    private stringArrayScopeCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
-
+    private stringArrayScopeCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
      * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -85,24 +66,15 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexesData
-     * @param {string} upperStringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexesData
-     * @param {number} shiftedIndex
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      */
     public initialize (
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayScopeCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        upperStringArrayCallsWrapperName: string,
-        upperStringArrayCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        shiftedIndex: number,
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
     ): void {
-        this.stringArrayScopeCallsWrapperName = stringArrayScopeCallsWrapperName;
-        this.stringArrayScopeCallsWrapperParameterIndexesData = stringArrayScopeCallsWrapperParameterIndexesData;
-        this.upperStringArrayCallsWrapperName = upperStringArrayCallsWrapperName;
-        this.upperStringArrayCallsWrapperParameterIndexesData = upperStringArrayCallsWrapperParameterIndexesData;
-        this.shiftedIndex = shiftedIndex;
+        this.stringArrayScopeCallsWrapperData = stringArrayScopeCallsWrapperData;
+        this.upperStringArrayCallsWrapperData = upperStringArrayCallsWrapperData;
     }
 
     /**
@@ -116,13 +88,16 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
 
         const stringArrayCallNode: ESTree.Expression = this.getUpperStringArrayCallNode(
             stringArrayCallIdentifierNode,
-            this.getStringArrayIndexNode(this.shiftedIndex)
+            this.getStringArrayIndexNode(
+                this.stringArrayScopeCallsWrapperData.index
+                - this.upperStringArrayCallsWrapperData.index
+            )
         );
 
         // stage 1: function expression node parameters
         // filling all parameters with a fake parameters first
         const parameters: ESTree.Identifier[] = this.arrayUtils.fillWithRange(
-            !this.stringArrayScopeCallsWrapperParameterIndexesData
+            !this.stringArrayScopeCallsWrapperData.parameterIndexesData
                 // root string array calls wrapper
                 ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
@@ -130,12 +105,12 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
             () => this.getFakeParameterNode()
         );
         parameters.splice(
-            this.stringArrayScopeCallsWrapperParameterIndexesData?.valueIndexParameterIndex ?? 0,
+            this.stringArrayScopeCallsWrapperData.parameterIndexesData?.valueIndexParameterIndex ?? 0,
             1,
             stringArrayCallIdentifierNode
         );
         parameters.splice(
-            this.stringArrayScopeCallsWrapperParameterIndexesData?.decodeKeyParameterIndex ?? 1,
+            this.stringArrayScopeCallsWrapperData.parameterIndexesData?.decodeKeyParameterIndex ?? 1,
             1,
             decodeKeyIdentifierNode
         );
@@ -143,7 +118,7 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
         // stage 2: upper string array call expression arguments
         // filling all call expression arguments with a fake string array calls
         const callExpressionArgs: ESTree.Expression[] = this.arrayUtils.fillWithRange(
-            !this.upperStringArrayCallsWrapperParameterIndexesData
+            !this.upperStringArrayCallsWrapperData.parameterIndexesData
                 // root string array calls wrapper
                 ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
@@ -155,24 +130,24 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
         );
 
         callExpressionArgs.splice(
-            this.upperStringArrayCallsWrapperParameterIndexesData?.valueIndexParameterIndex ?? 0,
+            this.upperStringArrayCallsWrapperData.parameterIndexesData?.valueIndexParameterIndex ?? 0,
             1,
             stringArrayCallNode
         );
         callExpressionArgs.splice(
-            this.upperStringArrayCallsWrapperParameterIndexesData?.decodeKeyParameterIndex ?? 1,
+            this.upperStringArrayCallsWrapperData.parameterIndexesData?.decodeKeyParameterIndex ?? 1,
             1,
             decodeKeyIdentifierNode
         );
 
         // stage 3: function declaration node
         const functionDeclarationNode: ESTree.FunctionDeclaration =  NodeFactory.functionDeclarationNode(
-            this.stringArrayScopeCallsWrapperName,
+            this.stringArrayScopeCallsWrapperData.name,
             parameters,
             NodeFactory.blockStatementNode([
                 NodeFactory.returnStatementNode(
                     NodeFactory.callExpressionNode(
-                        NodeFactory.identifierNode(this.upperStringArrayCallsWrapperName),
+                        NodeFactory.identifierNode(this.upperStringArrayCallsWrapperData.name),
                         callExpressionArgs
                     )
                 )

+ 13 - 12
src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperVariableNode.ts

@@ -9,6 +9,7 @@ import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
 import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
+import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 
 import { initializable } from '../../decorators/Initializable';
@@ -20,16 +21,16 @@ import { NodeUtils } from '../../node/NodeUtils';
 @injectable()
 export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArrayCallNode {
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private stringArrayCallsWrapperName!: string;
+    private stringArrayCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private stringArrayScopeCallsWrapperName!: string;
+    private stringArrayScopeCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
 
     /**
@@ -64,15 +65,15 @@ export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArra
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {string} stringArrayCallsWrapperName
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayCallsWrapperData
      */
     public initialize (
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayCallsWrapperName: string
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        stringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData
     ): void {
-        this.stringArrayScopeCallsWrapperName = stringArrayScopeCallsWrapperName;
-        this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
+        this.stringArrayScopeCallsWrapperData = stringArrayScopeCallsWrapperData;
+        this.stringArrayCallsWrapperData = stringArrayCallsWrapperData;
     }
 
     /**
@@ -82,8 +83,8 @@ export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArra
         const structure: TStatement = NodeFactory.variableDeclarationNode(
             [
                 NodeFactory.variableDeclaratorNode(
-                    NodeFactory.identifierNode(this.stringArrayScopeCallsWrapperName),
-                    NodeFactory.identifierNode(this.stringArrayCallsWrapperName)
+                    NodeFactory.identifierNode(this.stringArrayScopeCallsWrapperData.name),
+                    NodeFactory.identifierNode(this.stringArrayCallsWrapperData.name)
                 )
             ],
             'const',

+ 0 - 25
src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData.ts

@@ -1,25 +0,0 @@
-import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
-
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from './IStringArrayScopeCallsWrapperParameterIndexesData';
-
-export interface IStringArrayScopeCallsWrapperLexicalScopeData {
-    /**
-     * @type {TNodeWithLexicalScopeStatements | null}
-     */
-    parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null;
-
-    /**
-     * @type {number}
-     */
-    resultShiftedIndex: number;
-
-    /**
-     * @type {number}
-     */
-    scopeShiftedIndex: number;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
-     */
-    callsWrappersParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null;
-}

+ 4 - 2
src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperNamesData.ts → src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData.ts

@@ -1,6 +1,8 @@
 import { TStringArrayEncoding } from '../../../types/options/TStringArrayEncoding';
 
-export interface IStringArrayScopeCallsWrapperNamesData {
+import { IStringArrayScopeCallsWrapperData } from './IStringArrayScopeCallsWrapperData';
+
+export interface IStringArrayScopeCallsWrappersData {
     /**
      * @type {TStringArrayEncoding}
      */
@@ -9,5 +11,5 @@ export interface IStringArrayScopeCallsWrapperNamesData {
     /**
      * @type {string[]}
      */
-    names: string[];
+    scopeCallsWrappersData: IStringArrayScopeCallsWrapperData[];
 }

+ 0 - 10
src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage.ts

@@ -1,10 +0,0 @@
-import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
-
-import { IMapStorage } from '../IMapStorage';
-import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
-
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-export interface IStringArrayScopeCallsWrapperLexicalScopeDataStorage extends IMapStorage<
-    TNodeWithLexicalScopeStatements,
-    IStringArrayScopeCallsWrapperLexicalScopeData
-> {}

+ 0 - 10
src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage.ts

@@ -1,10 +0,0 @@
-import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
-
-import { IMapStorage } from '../IMapStorage';
-
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-export interface IStringArrayScopeCallsWrapperNamesDataStorage extends IMapStorage<
-    TNodeWithLexicalScopeStatements,
-    TStringArrayScopeCallsWrapperNamesDataByEncoding
-> {}

+ 10 - 0
src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts

@@ -0,0 +1,10 @@
+import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
+
+import { IMapStorage } from '../IMapStorage';
+
+// eslint-disable-next-line @typescript-eslint/no-empty-interface
+export interface IStringArrayScopeCallsWrappersDataStorage extends IMapStorage<
+    TNodeWithLexicalScopeStatements,
+    TStringArrayScopeCallsWrappersDataByEncoding
+> {}

+ 60 - 120
src/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperTransformer.ts

@@ -6,18 +6,15 @@ import * as ESTree from 'estree';
 import { TInitialData } from '../../types/TInitialData';
 import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
 import { TStatement } from '../../types/node/TStatement';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
 import { TStringArrayCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayCustomNodeFactory';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
 import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
-import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
-import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { IStringArrayScopeCallsWrapperNamesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperNamesData';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
+import { IStringArrayScopeCallsWrappersData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 import { IVisitedLexicalScopeNodesStackStorage } from '../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage';
 import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
@@ -48,14 +45,9 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     private readonly stringArrayStorage: IStringArrayStorage;
 
     /**
-     * @type {IStringArrayScopeCallsWrapperLexicalScopeDataStorage}
+     * @type {IStringArrayScopeCallsWrappersDataStorage}
      */
-    private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperNamesDataStorage}
-     */
-    private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
+    private readonly stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage;
 
     /**
      * @type {TStringArrayCustomNodeFactory}
@@ -72,8 +64,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
      * @param {IOptions} options
      * @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
      * @param {IStringArrayStorage} stringArrayStorage
-     * @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
-     * @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
+     * @param {IStringArrayScopeCallsWrappersDataStorage} stringArrayScopeCallsWrappersDataStorage
      * @param {TStringArrayCustomNodeFactory} stringArrayTransformerCustomNodeFactory
      */
     public constructor (
@@ -81,8 +72,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
         @inject(ServiceIdentifiers.IOptions) options: IOptions,
         @inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
         @inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
-        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage) stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
-        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage) stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
+        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrappersDataStorage) stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage,
         @inject(ServiceIdentifiers.Factory__IStringArrayCustomNode)
             stringArrayTransformerCustomNodeFactory: TStringArrayCustomNodeFactory
     ) {
@@ -90,8 +80,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
 
         this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
         this.stringArrayStorage = stringArrayStorage;
-        this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
-        this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
+        this.stringArrayScopeCallsWrappersDataStorage = stringArrayScopeCallsWrappersDataStorage;
         this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
     }
 
@@ -133,52 +122,38 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     public transformNode (
         lexicalScopeBodyNode: TNodeWithLexicalScopeStatements
     ): TNodeWithLexicalScopeStatements {
-        const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null =
-            this.stringArrayScopeCallsWrapperNamesDataStorage.get(lexicalScopeBodyNode) ?? null;
-        const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
-            this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(lexicalScopeBodyNode) ?? null;
+        const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding | null =
+            this.stringArrayScopeCallsWrappersDataStorage.get(lexicalScopeBodyNode) ?? null;
 
-        if (!stringArrayScopeCallsWrapperNamesDataByEncoding || !stringArrayScopeCallsWrapperLexicalScopeData) {
+        if (!stringArrayScopeCallsWrappersDataByEncoding) {
             return lexicalScopeBodyNode;
         }
 
-        const {
-            callsWrappersParameterIndexesData: stringArrayScopeCallsWrapperParameterIndexes
-        } = stringArrayScopeCallsWrapperLexicalScopeData;
-        const stringArrayScopeCallsWrapperNamesDataList: (IStringArrayScopeCallsWrapperNamesData | undefined)[] =
-            Object.values(stringArrayScopeCallsWrapperNamesDataByEncoding);
+        const stringArrayScopeCallsWrappersDataList: (IStringArrayScopeCallsWrappersData | undefined)[] =
+            Object.values(stringArrayScopeCallsWrappersDataByEncoding);
 
         // iterates over data for each encoding type
-        for (const stringArrayScopeCallsWrapperNamesData of stringArrayScopeCallsWrapperNamesDataList) {
-            if (!stringArrayScopeCallsWrapperNamesData) {
+        for (const stringArrayScopeCallsWrappersData of stringArrayScopeCallsWrappersDataList) {
+            if (!stringArrayScopeCallsWrappersData) {
                 continue;
             }
 
-            const {names} = stringArrayScopeCallsWrapperNamesData;
-            const namesLength: number = names.length;
+            const {scopeCallsWrappersData} = stringArrayScopeCallsWrappersData;
+            const scopeCallsWrappersDataLength: number = scopeCallsWrappersData.length;
 
             /**
              * Iterates over each name of scope wrapper name
              * Reverse iteration appends wrappers at index `0` at the correct order
              */
-            for (let i = namesLength - 1; i >= 0; i--) {
-                const stringArrayScopeCallsWrapperName: string = names[i];
-                const {
-                    name: upperStringArrayCallsWrapperName,
-                    index: upperStringArrayCallsWrapperShiftedIndex,
-                    parameterIndexesData: upperStringArrayCallsWrapperParameterIndexes
-                } = this.getUpperStringArrayCallsWrapperData(
-                    stringArrayScopeCallsWrapperNamesData,
-                    stringArrayScopeCallsWrapperLexicalScopeData,
-                );
+            for (let i = scopeCallsWrappersDataLength - 1; i >= 0; i--) {
+                const stringArrayScopeCallsWrapperData = scopeCallsWrappersData[i];
+                const upperStringArrayCallsWrapperData =
+                    this.getUpperStringArrayCallsWrapperData(stringArrayScopeCallsWrappersData);
 
                 this.getAndAppendStringArrayScopeCallsWrapperNode(
                     lexicalScopeBodyNode,
-                    stringArrayScopeCallsWrapperName,
-                    stringArrayScopeCallsWrapperParameterIndexes,
-                    upperStringArrayCallsWrapperName,
-                    upperStringArrayCallsWrapperParameterIndexes,
-                    upperStringArrayCallsWrapperShiftedIndex,
+                    stringArrayScopeCallsWrapperData,
+                    upperStringArrayCallsWrapperData
                 );
             }
         }
@@ -187,40 +162,32 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     }
 
     /**
-     * @param {IStringArrayScopeCallsWrapperNamesData} stringArrayScopeCallsWrapperNamesData
-     * @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
+     * @param {IStringArrayScopeCallsWrappersData} stringArrayScopeCallsWrappersData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
     private getRootStringArrayCallsWrapperData (
-        stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
-        stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
+        stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrappersData,
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding} = stringArrayScopeCallsWrapperNamesData;
-        const {resultShiftedIndex} = stringArrayScopeCallsWrapperLexicalScopeData;
+        const {encoding} = stringArrayScopeCallsWrappersData;
 
         return {
             name: this.stringArrayStorage.getStorageCallsWrapperName(encoding),
-            index: resultShiftedIndex,
+            index: 0,
             parameterIndexesData: null
         };
     }
 
     /**
-     * @param {IStringArrayScopeCallsWrapperNamesData} stringArrayScopeCallsWrapperNamesData
-     * @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
+     * @param {IStringArrayScopeCallsWrappersData} stringArrayScopeCallsWrappersData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
     private getUpperStringArrayCallsWrapperData (
-        stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
-        stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
+        stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrappersData,
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding} = stringArrayScopeCallsWrapperNamesData;
-        const {scopeShiftedIndex} = stringArrayScopeCallsWrapperLexicalScopeData;
+        const {encoding} = stringArrayScopeCallsWrappersData;
 
-        const rootStringArrayCallsWrapperData = this.getRootStringArrayCallsWrapperData(
-            stringArrayScopeCallsWrapperNamesData,
-            stringArrayScopeCallsWrapperLexicalScopeData
-        );
+        const rootStringArrayCallsWrapperData =
+            this.getRootStringArrayCallsWrapperData(stringArrayScopeCallsWrappersData);
 
         if (!this.options.stringArrayWrappersChainedCalls) {
             return rootStringArrayCallsWrapperData;
@@ -234,45 +201,30 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             return rootStringArrayCallsWrapperData;
         }
 
-        const parentLexicalScopeNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null = this.stringArrayScopeCallsWrapperNamesDataStorage
-            .get(parentLexicalScopeBodyNode) ?? null;
-        const parentScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null = this.stringArrayScopeCallsWrapperLexicalScopeDataStorage
-            .get(parentLexicalScopeBodyNode) ?? null;
+        const parentLexicalScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding | null =
+            this.stringArrayScopeCallsWrappersDataStorage
+                .get(parentLexicalScopeBodyNode) ?? null;
+        const parentScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] | null =
+            parentLexicalScopeCallsWrappersDataByEncoding?.[encoding]?.scopeCallsWrappersData ?? null;
 
-        const parentLexicalScopeNames: string[] | null = parentLexicalScopeNamesDataByEncoding?.[encoding]?.names ?? null;
-
-        if (!parentLexicalScopeNames?.length) {
+        if (!parentScopeCallsWrappersData?.length) {
             return rootStringArrayCallsWrapperData;
         }
 
-        const upperStringArrayCallsWrapperName: string = this.randomGenerator
+        return this.randomGenerator
             .getRandomGenerator()
-            .pickone(parentLexicalScopeNames);
-        const parameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null =
-            parentScopeCallsWrapperLexicalScopeData?.callsWrappersParameterIndexesData ?? null;
-
-        return {
-            name: upperStringArrayCallsWrapperName,
-            index: scopeShiftedIndex,
-            parameterIndexesData
-        };
+            .pickone(parentScopeCallsWrappersData);
     }
 
     /**
      * @param {TNodeWithLexicalScopeStatements} lexicalScopeBodyNode
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexes
-     * @param {string} upperStringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexes
-     * @param {number} stringArrayScopeCallsWrapperShiftedIndex
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      */
     private getAndAppendStringArrayScopeCallsWrapperNode (
         lexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayScopeCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        upperStringArrayCallsWrapperName: string,
-        upperStringArrayCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        stringArrayScopeCallsWrapperShiftedIndex: number
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
     ): void {
         let stringArrayScopeCallsWrapperNode: TStatement[];
 
@@ -284,11 +236,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
                 );
 
                 stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperFunctionNode(
-                    stringArrayScopeCallsWrapperName,
-                    stringArrayScopeCallsWrapperParameterIndexes,
-                    upperStringArrayCallsWrapperName,
-                    upperStringArrayCallsWrapperParameterIndexes,
-                    stringArrayScopeCallsWrapperShiftedIndex
+                    stringArrayScopeCallsWrapperData,
+                    upperStringArrayCallsWrapperData,
                 );
 
                 NodeAppender.insertAtIndex(
@@ -303,8 +252,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             case StringArrayWrappersType.Variable:
             default: {
                 stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperVariableNode(
-                    stringArrayScopeCallsWrapperName,
-                    upperStringArrayCallsWrapperName
+                    stringArrayScopeCallsWrapperData,
+                    upperStringArrayCallsWrapperData
                 );
 
                 NodeAppender.prepend(
@@ -316,13 +265,13 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {string} upperStringArrayCallsWrapperName
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      * @returns {TStatement[]}
      */
     private getStringArrayScopeCallsWrapperVariableNode (
-        stringArrayScopeCallsWrapperName: string,
-        upperStringArrayCallsWrapperName: string
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData
     ): TStatement[] {
         const stringArrayScopeCallsWrapperVariableNode: ICustomNode<TInitialData<StringArrayScopeCallsWrapperVariableNode>> =
             this.stringArrayTransformerCustomNodeFactory(
@@ -330,27 +279,21 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             );
 
         stringArrayScopeCallsWrapperVariableNode.initialize(
-            stringArrayScopeCallsWrapperName,
-            upperStringArrayCallsWrapperName
+            stringArrayScopeCallsWrapperData,
+            upperStringArrayCallsWrapperData
         );
 
         return stringArrayScopeCallsWrapperVariableNode.getNode();
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexes
-     * @param {string} upperStringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexes
-     * @param {number} stringArrayScopeCallsWrapperShiftedIndex
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      * @returns {TStatement[]}
      */
     private getStringArrayScopeCallsWrapperFunctionNode (
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayScopeCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        upperStringArrayCallsWrapperName: string,
-        upperStringArrayCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        stringArrayScopeCallsWrapperShiftedIndex: number
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
     ): TStatement[] {
         const stringArrayScopeCallsWrapperFunctionNode: ICustomNode<TInitialData<StringArrayScopeCallsWrapperFunctionNode>> =
             this.stringArrayTransformerCustomNodeFactory(
@@ -358,11 +301,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             );
 
         stringArrayScopeCallsWrapperFunctionNode.initialize(
-            stringArrayScopeCallsWrapperName,
-            stringArrayScopeCallsWrapperParameterIndexes,
-            upperStringArrayCallsWrapperName,
-            upperStringArrayCallsWrapperParameterIndexes,
-            stringArrayScopeCallsWrapperShiftedIndex,
+            stringArrayScopeCallsWrapperData,
+            upperStringArrayCallsWrapperData
         );
 
         return stringArrayScopeCallsWrapperFunctionNode.getNode();

+ 63 - 119
src/node-transformers/string-array-transformers/StringArrayTransformer.ts

@@ -7,7 +7,7 @@ import { TIdentifierNamesGeneratorFactory } from '../../types/container/generato
 import { TInitialData } from '../../types/TInitialData';
 import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
 import { TStatement } from '../../types/node/TStatement';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
 import { TStringArrayCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayCustomNodeFactory';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
@@ -16,9 +16,7 @@ import { ILiteralNodesCacheStorage } from '../../interfaces/storages/string-arra
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
 import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
-import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
-import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 import { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
@@ -57,7 +55,6 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
         NodeTransformer.StringArrayRotateFunctionTransformer
     ];
 
-
     /**
      * @type {IIdentifierNamesGenerator}
      */
@@ -79,14 +76,9 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
     private readonly stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer;
 
     /**
-     * @type {IStringArrayScopeCallsWrapperLexicalScopeDataStorage}
-     */
-    private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperNamesDataStorage}
+     * @type {IStringArrayScopeCallsWrappersDataStorage}
      */
-    private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
+    private readonly stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage;
 
     /**
      * @type {TStringArrayCustomNodeFactory}
@@ -104,8 +96,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @param {ILiteralNodesCacheStorage} literalNodesCacheStorage
      * @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
      * @param {IStringArrayStorage} stringArrayStorage
-     * @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
-     * @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
+     * @param {IStringArrayScopeCallsWrappersDataStorage} stringArrayScopeCallsWrappersDataStorage
      * @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer
      * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
      * @param {TStringArrayCustomNodeFactory} stringArrayTransformerCustomNodeFactory
@@ -116,10 +107,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
         @inject(ServiceIdentifiers.ILiteralNodesCacheStorage) literalNodesCacheStorage: ILiteralNodesCacheStorage,
         @inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
         @inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
-        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
-            stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
-        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
-            stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
+        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrappersDataStorage)
+            stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage,
         @inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer,
         @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
             identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
@@ -131,8 +120,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
         this.literalNodesCacheStorage = literalNodesCacheStorage;
         this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
         this.stringArrayStorage = stringArrayStorage;
-        this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
-        this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
+        this.stringArrayScopeCallsWrappersDataStorage = stringArrayScopeCallsWrappersDataStorage;
         this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer;
         this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
         this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
@@ -219,21 +207,17 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @returns {Expression}
      */
     private getStringArrayCallNode (stringArrayStorageItemData: IStringArrayStorageItemData): ESTree.Expression {
-        const {
-            name: stringArrayCallsWrapperName,
-            index,
-            parameterIndexesData
-        } = this.getStringArrayCallsWrapperData(stringArrayStorageItemData);
-        const {decodeKey } = stringArrayStorageItemData;
+        const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData =
+            this.getStringArrayScopeCallsWrapperData(stringArrayStorageItemData);
+        const {decodeKey, index} = stringArrayStorageItemData;
 
         const stringArrayCallCustomNode: ICustomNode<TInitialData<StringArrayCallNode>> =
             this.stringArrayTransformerCustomNodeFactory(StringArrayCustomNode.StringArrayCallNode);
 
         stringArrayCallCustomNode.initialize(
-            stringArrayCallsWrapperName,
-            parameterIndexesData,
             index,
             this.stringArrayStorage.getIndexShiftAmount(),
+            stringArrayScopeCallsWrapperData,
             decodeKey
         );
 
@@ -250,29 +234,29 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @param {IStringArrayStorageItemData} stringArrayStorageItemData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
-    private getStringArrayCallsWrapperData (
+    private getStringArrayScopeCallsWrapperData (
         stringArrayStorageItemData: IStringArrayStorageItemData
     ): IStringArrayScopeCallsWrapperData {
         return !this.options.stringArrayWrappersCount
-            ? this.getRootStringArrayCallsWrapperData(stringArrayStorageItemData)
-            : this.getUpperStringArrayCallsWrapperData(stringArrayStorageItemData);
+            ? this.getRootStringArrayScopeCallsWrapperData(stringArrayStorageItemData)
+            : this.getUpperStringArrayScopeCallsWrapperData(stringArrayStorageItemData);
     }
 
     /**
      * @param {IStringArrayStorageItemData} stringArrayStorageItemData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
-    private getRootStringArrayCallsWrapperData (
+    private getRootStringArrayScopeCallsWrapperData (
         stringArrayStorageItemData: IStringArrayStorageItemData
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding, index} = stringArrayStorageItemData;
+        const {encoding} = stringArrayStorageItemData;
 
         const rootStringArrayCallsWrapperName: string = this.stringArrayStorage.getStorageCallsWrapperName(encoding);
 
         return {
             name: rootStringArrayCallsWrapperName,
-            parameterIndexesData: null,
-            index
+            index: 0,
+            parameterIndexesData: null
         };
     }
 
@@ -280,143 +264,103 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @param {IStringArrayStorageItemData} stringArrayStorageItemData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
-    private getUpperStringArrayCallsWrapperData (
+    private getUpperStringArrayScopeCallsWrapperData (
         stringArrayStorageItemData: IStringArrayStorageItemData
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding, index} = stringArrayStorageItemData;
+        const {encoding} = stringArrayStorageItemData;
         const currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
             this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
-        const parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
-            this.visitedLexicalScopeNodesStackStorage.getPenultimateElement() ?? null;
 
         if (!currentLexicalScopeBodyNode) {
             throw new Error('Cannot find current lexical scope body node');
         }
 
-        const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
-            this.getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding(
+        const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding =
+            this.getAndUpdateStringArrayScopeCallsWrappersDataByEncoding(
                 currentLexicalScopeBodyNode,
                 stringArrayStorageItemData
             );
-        const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData =
-            this.getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData(
-                currentLexicalScopeBodyNode,
-                parentLexicalScopeBodyNode
-            );
-
-        const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
-        const randomUpperStringArrayCallsWrapperName: string = this.randomGenerator
-            .getRandomGenerator()
-            .pickone(stringArrayScopeCallsWrapperNames);
 
-        const resultIndex: number = stringArrayScopeCallsWrapperLexicalScopeData
-            ? stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex + index
-            : index;
+        const stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] =
+            stringArrayScopeCallsWrappersDataByEncoding[encoding]?.scopeCallsWrappersData ?? [];
 
-        return {
-            name: randomUpperStringArrayCallsWrapperName,
-            index: resultIndex,
-            parameterIndexesData: stringArrayScopeCallsWrapperLexicalScopeData.callsWrappersParameterIndexesData
-        };
+        return this.randomGenerator
+            .getRandomGenerator()
+            .pickone(stringArrayScopeCallsWrappersData);
     }
 
     /**
      * @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
      * @param {IStringArrayStorageItemData} stringArrayStorageItemData
-     * @returns {TStringArrayScopeCallsWrapperNamesDataByEncoding}
+     * @returns {TStringArrayScopeCallsWrappersDataByEncoding}
      */
-    private getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding (
+    private getAndUpdateStringArrayScopeCallsWrappersDataByEncoding (
         currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
-        stringArrayStorageItemData: IStringArrayStorageItemData
-    ): TStringArrayScopeCallsWrapperNamesDataByEncoding {
+        stringArrayStorageItemData: IStringArrayStorageItemData,
+    ): TStringArrayScopeCallsWrappersDataByEncoding {
         const {encoding} = stringArrayStorageItemData;
-        const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
-            this.stringArrayScopeCallsWrapperNamesDataStorage.get(currentLexicalScopeBodyNode)
+        const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding =
+            this.stringArrayScopeCallsWrappersDataStorage.get(currentLexicalScopeBodyNode)
             ?? {};
 
-        const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
-        const isFilledScopeCallsWrapperNamesList: boolean = stringArrayScopeCallsWrapperNames.length === this.options.stringArrayWrappersCount;
+        const stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] =
+            stringArrayScopeCallsWrappersDataByEncoding[encoding]?.scopeCallsWrappersData ?? [];
+        const isFilledScopeCallsWrapperNamesList: boolean =
+            stringArrayScopeCallsWrappersData.length === this.options.stringArrayWrappersCount;
 
         if (isFilledScopeCallsWrapperNamesList) {
-            return stringArrayScopeCallsWrapperNamesDataByEncoding;
+            return stringArrayScopeCallsWrappersDataByEncoding;
         }
 
         // have to use `generateForGlobalScope` for program node for correct attach prefix to the calls wrapper name
         const nextScopeCallsWrapperName: string = NodeGuards.isProgramNode(currentLexicalScopeBodyNode)
             ? this.identifierNamesGenerator.generateForGlobalScope()
             : this.identifierNamesGenerator.generateNext();
+        const nextScopeCallsWrapperShiftedIndex: number =
+            this.getStringArrayCallsWrapperShiftedIndex();
+        const nextScopeCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null =
+            this.getStringArrayCallsWrapperParameterIndexesData();
 
-        stringArrayScopeCallsWrapperNamesDataByEncoding[encoding] = {
+        stringArrayScopeCallsWrappersDataByEncoding[encoding] = {
             encoding,
-            names: [
-                ...stringArrayScopeCallsWrapperNames,
-                nextScopeCallsWrapperName
+            scopeCallsWrappersData: [
+                ...stringArrayScopeCallsWrappersData,
+                {
+                    name: nextScopeCallsWrapperName,
+                    index: nextScopeCallsWrapperShiftedIndex,
+                    parameterIndexesData: nextScopeCallsWrapperParameterIndexesData
+                }
             ]
         };
 
-        this.stringArrayScopeCallsWrapperNamesDataStorage.set(
+        this.stringArrayScopeCallsWrappersDataStorage.set(
             currentLexicalScopeBodyNode,
-            stringArrayScopeCallsWrapperNamesDataByEncoding
+            stringArrayScopeCallsWrappersDataByEncoding
         );
 
-        return stringArrayScopeCallsWrapperNamesDataByEncoding;
+        return stringArrayScopeCallsWrappersDataByEncoding;
     }
 
     /**
-     * @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
-     * @param {TNodeWithLexicalScopeStatements | null} parentLexicalScopeBodyNode
-     * @returns {IStringArrayScopeCallsWrapperLexicalScopeData}
-     * @private
+     * @returns {number}
      */
-    private getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData (
-        currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
-        parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null
-    ): IStringArrayScopeCallsWrapperLexicalScopeData {
-        const storedLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
-            this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(currentLexicalScopeBodyNode)
-            ?? null;
-
-        if (storedLexicalScopeData) {
-            return storedLexicalScopeData;
-        }
-
-        const parentLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null = parentLexicalScopeBodyNode
-            ? this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(parentLexicalScopeBodyNode) ?? null
-            : null;
-
-        const callsWrappersParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null =
-            this.options.stringArrayWrappersType === StringArrayWrappersType.Function
-            ? this.getStringArrayCallsWrapperParameterIndexesData()
-            : null;
-        const scopeShiftedIndex: number = this.options.stringArrayWrappersType === StringArrayWrappersType.Function
+    private getStringArrayCallsWrapperShiftedIndex (): number {
+        return this.options.stringArrayWrappersType === StringArrayWrappersType.Function
             ? this.randomGenerator.getRandomInteger(
                 StringArrayTransformer.minShiftedIndexValue,
                 StringArrayTransformer.maxShiftedIndexValue
             )
             : 0;
-        const resultShiftedIndex: number = parentLexicalScopeData
-            ? parentLexicalScopeData.resultShiftedIndex + scopeShiftedIndex
-            : scopeShiftedIndex;
-
-        const lexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData = {
-            callsWrappersParameterIndexesData,
-            parentLexicalScopeBodyNode,
-            resultShiftedIndex,
-            scopeShiftedIndex
-        };
-
-        this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.set(
-            currentLexicalScopeBodyNode,
-            lexicalScopeData
-        );
-
-        return lexicalScopeData;
     }
 
     /**
-     * @returns {IStringArrayScopeCallsWrapperParameterIndexesData}
+     * @returns {IStringArrayScopeCallsWrapperParameterIndexesData | null}
      */
-    private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData {
+    private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData | null {
+        if (this.options.stringArrayWrappersType !== StringArrayWrappersType.Function) {
+            return null;
+        }
+
         const minIndexValue: number = 0;
         const maxIndexValue: number = this.options.stringArrayWrappersParametersMaxCount - 1;
 

+ 0 - 28
src/storages/string-array-transformers/StringArrayScopeCallsWrapperLexicalScopeDataStorage.ts

@@ -1,28 +0,0 @@
-import { inject, injectable } from 'inversify';
-import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
-
-import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
-
-import { IOptions } from '../../interfaces/options/IOptions';
-import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
-import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
-
-import { MapStorage } from '../MapStorage';
-
-@injectable()
-export class StringArrayScopeCallsWrapperLexicalScopeDataStorage extends MapStorage <
-    TNodeWithLexicalScopeStatements,
-    IStringArrayScopeCallsWrapperLexicalScopeData
-> implements IStringArrayScopeCallsWrapperLexicalScopeDataStorage {
-    /**
-     * @param {IRandomGenerator} randomGenerator
-     * @param {IOptions} options
-     */
-    public constructor (
-        @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
-        @inject(ServiceIdentifiers.IOptions) options: IOptions
-    ) {
-        super(randomGenerator, options);
-    }
-}

+ 5 - 5
src/storages/string-array-transformers/StringArrayScopeCallsWrapperNamesDataStorage.ts → src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts

@@ -2,19 +2,19 @@ import { inject, injectable } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
 
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 
 import { MapStorage } from '../MapStorage';
 
 @injectable()
-export class StringArrayScopeCallsWrapperNamesDataStorage extends MapStorage <
+export class StringArrayScopeCallsWrappersDataStorage extends MapStorage <
     TNodeWithLexicalScopeStatements,
-    TStringArrayScopeCallsWrapperNamesDataByEncoding
-> implements IStringArrayScopeCallsWrapperNamesDataStorage {
+    TStringArrayScopeCallsWrappersDataByEncoding
+> implements IStringArrayScopeCallsWrappersDataStorage {
     /**
      * @param {IRandomGenerator} randomGenerator
      * @param {IOptions} options

+ 0 - 7
src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding.ts

@@ -1,7 +0,0 @@
-import { TStringArrayEncoding } from '../../options/TStringArrayEncoding';
-
-import { IStringArrayScopeCallsWrapperNamesData } from '../../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperNamesData';
-
-export type TStringArrayScopeCallsWrapperNamesDataByEncoding = Partial<{
-    [key in TStringArrayEncoding]: IStringArrayScopeCallsWrapperNamesData;
-}>;

+ 7 - 0
src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding.ts

@@ -0,0 +1,7 @@
+import { TStringArrayEncoding } from '../../options/TStringArrayEncoding';
+
+import { IStringArrayScopeCallsWrappersData } from '../../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData';
+
+export type TStringArrayScopeCallsWrappersDataByEncoding = Partial<{
+    [key in TStringArrayEncoding]: IStringArrayScopeCallsWrappersData;
+}>;

+ 28 - 14
test/dev/dev.ts

@@ -7,28 +7,42 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
 
     let obfuscationResult = JavaScriptObfuscator.obfuscate(
         `
-             (function(){
-                var variable1 = '5' - 3;
-                var variable2 = '5' + 3;
-                var variable3 = '5' + - '2';
-                var variable4 = ['10','10','10','10','10'].map(parseInt);
-                var variable5 = 'foo ' + 1 + 1;
-                console.log(variable1);
-                console.log(variable2);
-                console.log(variable3);
-                console.log(variable4);
-                console.log(variable5);
-            })();
+             function foo () {
+                console.log('foo', 1);             
+                console.log('foo', 2);             
+                console.log('foo', 3);
+                
+                function bar() {
+                    console.log('bar', 1);
+                    console.log('bar', 2);
+                    console.log('bar', 3);
+                    
+                    function baz() {
+                        console.log('baz', 1);
+                        console.log('baz', 2);
+                        console.log('baz', 3);
+                    }
+                    
+                    baz();
+                }             
+                
+                bar();
+             }
+             
+             foo();
         `,
         {
             ...NO_ADDITIONAL_NODES_PRESET,
+            seed: 1,
             compact: false,
             simplify: false,
             stringArray: true,
             stringArrayThreshold: 1,
-            stringArrayChainedCalls: true,
-            stringArrayWrappersCount: 2,
+            stringArrayIndexShift: true,
+            stringArrayWrappersChainedCalls: true,
+            stringArrayWrappersCount: 3,
             stringArrayWrappersType: 'function',
+            stringArrayWrappersParametersMaxCount: 5,
             identifierNamesGenerator: 'mangled'
         }
     );

+ 54 - 0
test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts

@@ -9,6 +9,7 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/N
 
 import { readFileAsString } from '../../../../helpers/readFileAsString';
 import { checkCodeEvaluation } from '../../../../helpers/checkCodeEvaluation';
+import { getRegExpMatch } from '../../../../helpers/getRegExpMatch';
 
 import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
 
@@ -1246,6 +1247,59 @@ describe('StringArrayScopeCallsWrapperTransformer', function () {
                     });
                 });
             });
+
+            describe('Variant #6: different indexes for calls wrappers', () => {
+                const getStringArrayScopeCallsWrapperMatch = (stringArrayScopeCallsWrapperName: string) =>
+                    `function *${stringArrayScopeCallsWrapperName} *\\(e, *f\\) *{` +
+                        `return b\\([ef] *-(?: -)?(${hexadecimalIndexMatch}), *[ef]\\);` +
+                    '}.*';
+
+                const stringArrayScopeCallsWrapperIndexRegExp1: RegExp = new RegExp(
+                    getStringArrayScopeCallsWrapperMatch('c')
+                );
+                const stringArrayScopeCallsWrapperIndexRegExp2: RegExp = new RegExp(
+                    getStringArrayScopeCallsWrapperMatch('d')
+                );
+
+                const differentIndexesMatchesSamplesCount: number = 20;
+                let differentIndexesMatchesCount: number = 0;
+                let differentIndexesMatchesDelta: number = 3;
+
+                before(() => {
+                    const code: string = readFileAsString(__dirname + '/fixtures/function-calls-wrappers-different-indexes.js');
+
+                    for (let i = 0; i < differentIndexesMatchesSamplesCount; i++) {
+                        const obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
+                            code,
+                            {
+                                ...NO_ADDITIONAL_NODES_PRESET,
+                                identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator,
+                                stringArray: true,
+                                stringArrayThreshold: 1,
+                                stringArrayWrappersChainedCalls: true,
+                                stringArrayWrappersCount: 2,
+                                stringArrayWrappersParametersMaxCount: 2,
+                                stringArrayWrappersType: StringArrayWrappersType.Function
+                            }
+                        ).getObfuscatedCode();
+
+                        const indexMatch1 = getRegExpMatch(obfuscatedCode, stringArrayScopeCallsWrapperIndexRegExp1);
+                        const indexMatch2 = getRegExpMatch(obfuscatedCode, stringArrayScopeCallsWrapperIndexRegExp2);
+
+                        if (indexMatch1 !== indexMatch2) {
+                            differentIndexesMatchesCount++;
+                        }
+                    }
+                });
+
+                it('Should generate a different indexes for different string array scope calls wrappers', () => {
+                    assert.closeTo(
+                        differentIndexesMatchesCount,
+                        differentIndexesMatchesSamplesCount,
+                        differentIndexesMatchesDelta
+                    );
+                });
+            });
         });
     });
 

+ 2 - 0
test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/fixtures/function-calls-wrappers-different-indexes.js

@@ -0,0 +1,2 @@
+var foo = 'foo'
+var bar = 'bar'

部分文件因为文件数量过多而无法显示