stringArrayWrappersType: 'function' now generates different indexes between each wrapper inside the same lexical scope

This commit is contained in:
sanex
2021-07-16 02:47:32 +03:00
parent 496eb920f0
commit a1dc2df04f
21 changed files with 333 additions and 331 deletions
+1 -1
View File
@@ -54,7 +54,7 @@ export enum ServiceIdentifiers {
IScopeAnalyzer = 'IScopeAnalyzer',
IStringArrayIndexNode = 'IStringArrayIndexNode',
IStringArrayScopeCallsWrapperLexicalScopeDataStorage = 'IStringArrayScopeCallsWrapperLexicalScopeDataStorage',
IStringArrayScopeCallsWrapperNamesDataStorage = 'IStringArrayScopeCallsWrapperNamesDataStorage',
IStringArrayScopeCallsWrappersDataStorage = 'IStringArrayScopeCallsWrappersDataStorage',
IStringArrayStorage = 'IStringArrayStorage',
IStringArrayStorageAnalyzer = 'IStringArrayStorageAnalyzer',
IThroughIdentifierReplacer = 'IThroughIdentifierReplacer',
@@ -10,7 +10,7 @@ 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';
@@ -20,7 +20,7 @@ import { GlobalIdentifierNamesCacheStorage } from '../../../storages/identifier-
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';
@@ -50,8 +50,8 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b
.to(StringArrayScopeCallsWrapperLexicalScopeDataStorage)
.inSingletonScope();
bind<IStringArrayScopeCallsWrapperNamesDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
.to(StringArrayScopeCallsWrapperNamesDataStorage)
bind<IStringArrayScopeCallsWrappersDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrappersDataStorage)
.to(StringArrayScopeCallsWrappersDataStorage)
.inSingletonScope();
bind<IVisitedLexicalScopeNodesStackStorage>(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage)
@@ -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
)
);
@@ -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
)
)
@@ -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',
@@ -1,7 +1,5 @@
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
import { IStringArrayScopeCallsWrapperParameterIndexesData } from './IStringArrayScopeCallsWrapperParameterIndexesData';
export interface IStringArrayScopeCallsWrapperLexicalScopeData {
/**
* @type {TNodeWithLexicalScopeStatements | null}
@@ -17,9 +15,4 @@ export interface IStringArrayScopeCallsWrapperLexicalScopeData {
* @type {number}
*/
scopeShiftedIndex: number;
/**
* @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
*/
callsWrappersParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null;
}
@@ -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[];
}
@@ -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
> {}
@@ -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
> {}
@@ -6,7 +6,7 @@ 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';
@@ -15,9 +15,8 @@ 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';
@@ -53,9 +52,9 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
/**
* @type {IStringArrayScopeCallsWrapperNamesDataStorage}
* @type {IStringArrayScopeCallsWrappersDataStorage}
*/
private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
private readonly stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage;
/**
* @type {TStringArrayCustomNodeFactory}
@@ -72,7 +71,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
* @param {IOptions} options
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
* @param {IStringArrayStorage} stringArrayStorage
* @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
* @param {IStringArrayScopeCallsWrappersDataStorage} stringArrayScopeCallsWrappersDataStorage
* @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
* @param {TStringArrayCustomNodeFactory} stringArrayTransformerCustomNodeFactory
*/
@@ -81,7 +80,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.IStringArrayScopeCallsWrappersDataStorage) stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage,
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage) stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
@inject(ServiceIdentifiers.Factory__IStringArrayCustomNode)
stringArrayTransformerCustomNodeFactory: TStringArrayCustomNodeFactory
@@ -90,7 +89,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
this.stringArrayStorage = stringArrayStorage;
this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
this.stringArrayScopeCallsWrappersDataStorage = stringArrayScopeCallsWrappersDataStorage;
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
}
@@ -133,52 +132,42 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
public transformNode (
lexicalScopeBodyNode: TNodeWithLexicalScopeStatements
): TNodeWithLexicalScopeStatements {
const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null =
this.stringArrayScopeCallsWrapperNamesDataStorage.get(lexicalScopeBodyNode) ?? null;
const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding | null =
this.stringArrayScopeCallsWrappersDataStorage.get(lexicalScopeBodyNode) ?? null;
const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(lexicalScopeBodyNode) ?? null;
if (!stringArrayScopeCallsWrapperNamesDataByEncoding || !stringArrayScopeCallsWrapperLexicalScopeData) {
if (!stringArrayScopeCallsWrappersDataByEncoding || !stringArrayScopeCallsWrapperLexicalScopeData) {
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,
for (let i = scopeCallsWrappersDataLength - 1; i >= 0; i--) {
const stringArrayScopeCallsWrapperData = scopeCallsWrappersData[i];
const upperStringArrayCallsWrapperData = this.getUpperStringArrayCallsWrapperData(
stringArrayScopeCallsWrappersData,
stringArrayScopeCallsWrapperLexicalScopeData,
);
this.getAndAppendStringArrayScopeCallsWrapperNode(
lexicalScopeBodyNode,
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
upperStringArrayCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperShiftedIndex,
stringArrayScopeCallsWrapperData,
upperStringArrayCallsWrapperData
);
}
}
@@ -187,38 +176,36 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
}
/**
* @param {IStringArrayScopeCallsWrapperNamesData} stringArrayScopeCallsWrapperNamesData
* @param {IStringArrayScopeCallsWrappersData} stringArrayScopeCallsWrappersData
* @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
* @returns {IStringArrayScopeCallsWrapperData}
*/
private getRootStringArrayCallsWrapperData (
stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrappersData,
stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
): 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 {IStringArrayScopeCallsWrappersData} stringArrayScopeCallsWrappersData
* @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
* @returns {IStringArrayScopeCallsWrapperData}
*/
private getUpperStringArrayCallsWrapperData (
stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrappersData,
stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
): IStringArrayScopeCallsWrapperData {
const {encoding} = stringArrayScopeCallsWrapperNamesData;
const {scopeShiftedIndex} = stringArrayScopeCallsWrapperLexicalScopeData;
const {encoding} = stringArrayScopeCallsWrappersData;
const rootStringArrayCallsWrapperData = this.getRootStringArrayCallsWrapperData(
stringArrayScopeCallsWrapperNamesData,
stringArrayScopeCallsWrappersData,
stringArrayScopeCallsWrapperLexicalScopeData
);
@@ -234,45 +221,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 +256,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
);
stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperFunctionNode(
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
upperStringArrayCallsWrapperParameterIndexes,
stringArrayScopeCallsWrapperShiftedIndex
stringArrayScopeCallsWrapperData,
upperStringArrayCallsWrapperData,
);
NodeAppender.insertAtIndex(
@@ -303,8 +272,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
case StringArrayWrappersType.Variable:
default: {
stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperVariableNode(
stringArrayScopeCallsWrapperName,
upperStringArrayCallsWrapperName
stringArrayScopeCallsWrapperData,
upperStringArrayCallsWrapperData
);
NodeAppender.prepend(
@@ -316,13 +285,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 +299,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 +321,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
);
stringArrayScopeCallsWrapperFunctionNode.initialize(
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
upperStringArrayCallsWrapperParameterIndexes,
stringArrayScopeCallsWrapperShiftedIndex,
stringArrayScopeCallsWrapperData,
upperStringArrayCallsWrapperData
);
return stringArrayScopeCallsWrapperFunctionNode.getNode();
@@ -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';
@@ -18,7 +18,7 @@ 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';
@@ -84,9 +84,9 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
/**
* @type {IStringArrayScopeCallsWrapperNamesDataStorage}
* @type {IStringArrayScopeCallsWrappersDataStorage}
*/
private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
private readonly stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage;
/**
* @type {TStringArrayCustomNodeFactory}
@@ -104,7 +104,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
* @param {ILiteralNodesCacheStorage} literalNodesCacheStorage
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
* @param {IStringArrayStorage} stringArrayStorage
* @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
* @param {IStringArrayScopeCallsWrappersDataStorage} stringArrayScopeCallsWrappersDataStorage
* @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
* @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -116,8 +116,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.IStringArrayScopeCallsWrappersDataStorage)
stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage,
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
@inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer,
@@ -131,7 +131,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
this.literalNodesCacheStorage = literalNodesCacheStorage;
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
this.stringArrayStorage = stringArrayStorage;
this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
this.stringArrayScopeCallsWrappersDataStorage = stringArrayScopeCallsWrappersDataStorage;
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer;
this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
@@ -219,21 +219,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 +246,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,10 +276,10 @@ 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 =
@@ -293,73 +289,24 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
throw new Error('Cannot find current lexical scope body node');
}
const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
this.getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding(
currentLexicalScopeBodyNode,
stringArrayStorageItemData
);
const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData =
this.getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData(
currentLexicalScopeBodyNode,
parentLexicalScopeBodyNode
);
const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding =
this.getAndUpdateStringArrayScopeCallsWrappersDataByEncoding(
currentLexicalScopeBodyNode,
stringArrayStorageItemData,
stringArrayScopeCallsWrapperLexicalScopeData
);
const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
const randomUpperStringArrayCallsWrapperName: string = this.randomGenerator
const stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] =
stringArrayScopeCallsWrappersDataByEncoding[encoding]?.scopeCallsWrappersData ?? [];
return this.randomGenerator
.getRandomGenerator()
.pickone(stringArrayScopeCallsWrapperNames);
const resultIndex: number = stringArrayScopeCallsWrapperLexicalScopeData
? stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex + index
: index;
return {
name: randomUpperStringArrayCallsWrapperName,
index: resultIndex,
parameterIndexesData: stringArrayScopeCallsWrapperLexicalScopeData.callsWrappersParameterIndexesData
};
}
/**
* @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
* @returns {TStringArrayScopeCallsWrapperNamesDataByEncoding}
*/
private getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding (
currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
stringArrayStorageItemData: IStringArrayStorageItemData
): TStringArrayScopeCallsWrapperNamesDataByEncoding {
const {encoding} = stringArrayStorageItemData;
const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
this.stringArrayScopeCallsWrapperNamesDataStorage.get(currentLexicalScopeBodyNode)
?? {};
const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
const isFilledScopeCallsWrapperNamesList: boolean = stringArrayScopeCallsWrapperNames.length === this.options.stringArrayWrappersCount;
if (isFilledScopeCallsWrapperNamesList) {
return stringArrayScopeCallsWrapperNamesDataByEncoding;
}
// 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();
stringArrayScopeCallsWrapperNamesDataByEncoding[encoding] = {
encoding,
names: [
...stringArrayScopeCallsWrapperNames,
nextScopeCallsWrapperName
]
};
this.stringArrayScopeCallsWrapperNamesDataStorage.set(
currentLexicalScopeBodyNode,
stringArrayScopeCallsWrapperNamesDataByEncoding
);
return stringArrayScopeCallsWrapperNamesDataByEncoding;
.pickone(stringArrayScopeCallsWrappersData);
}
/**
@@ -384,22 +331,12 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
? 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
? this.randomGenerator.getRandomInteger(
StringArrayTransformer.minShiftedIndexValue,
StringArrayTransformer.maxShiftedIndexValue
)
: 0;
const scopeShiftedIndex: number = this.getStringArrayCallsWrapperShiftedIndex();
const resultShiftedIndex: number = parentLexicalScopeData
? parentLexicalScopeData.resultShiftedIndex + scopeShiftedIndex
: scopeShiftedIndex;
const lexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData = {
callsWrappersParameterIndexesData,
parentLexicalScopeBodyNode,
resultShiftedIndex,
scopeShiftedIndex
@@ -414,9 +351,80 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
}
/**
* @returns {IStringArrayScopeCallsWrapperParameterIndexesData}
* @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
* @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
* @returns {TStringArrayScopeCallsWrappersDataByEncoding}
*/
private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData {
private getAndUpdateStringArrayScopeCallsWrappersDataByEncoding (
currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
stringArrayStorageItemData: IStringArrayStorageItemData,
stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
): TStringArrayScopeCallsWrappersDataByEncoding {
const {encoding} = stringArrayStorageItemData;
const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding =
this.stringArrayScopeCallsWrappersDataStorage.get(currentLexicalScopeBodyNode)
?? {};
const stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] =
stringArrayScopeCallsWrappersDataByEncoding[encoding]?.scopeCallsWrappersData ?? [];
const isFilledScopeCallsWrapperNamesList: boolean =
stringArrayScopeCallsWrappersData.length === this.options.stringArrayWrappersCount;
if (isFilledScopeCallsWrapperNamesList) {
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();
stringArrayScopeCallsWrappersDataByEncoding[encoding] = {
encoding,
scopeCallsWrappersData: [
...stringArrayScopeCallsWrappersData,
{
name: nextScopeCallsWrapperName,
index: stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex
+ nextScopeCallsWrapperShiftedIndex,
parameterIndexesData: nextScopeCallsWrapperParameterIndexesData
}
]
};
this.stringArrayScopeCallsWrappersDataStorage.set(
currentLexicalScopeBodyNode,
stringArrayScopeCallsWrappersDataByEncoding
);
return stringArrayScopeCallsWrappersDataByEncoding;
}
/**
* @returns {number}
*/
private getStringArrayCallsWrapperShiftedIndex (): number {
return this.options.stringArrayWrappersType === StringArrayWrappersType.Function
? this.randomGenerator.getRandomInteger(
StringArrayTransformer.minShiftedIndexValue,
StringArrayTransformer.maxShiftedIndexValue
)
: 0;
}
/**
* @returns {IStringArrayScopeCallsWrapperParameterIndexesData | null}
*/
private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData | null {
if (this.options.stringArrayWrappersType !== StringArrayWrappersType.Function) {
return null;
}
const minIndexValue: number = 0;
const maxIndexValue: number = this.options.stringArrayWrappersParametersMaxCount - 1;
@@ -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
@@ -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;
}>;
@@ -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;
}>;