WIP: added random string array scope calls wrappers parameters

This commit is contained in:
sanex
2020-11-15 22:15:37 +03:00
parent 4bc8a76e46
commit 4079b42fbd
22 changed files with 50244 additions and 78 deletions
@@ -0,0 +1,6 @@
/**
* Max count of root string array calls wrapper parameters
*
* @type {number}
*/
export const stringArrayRootCallsWrapperParametersDefaultCount: number = 2;
@@ -0,0 +1,6 @@
/**
* Max count of scope string array calls wrapper parameters
*
* @type {number}
*/
export const stringArrayScopeCallsWrapperParametersMaxCount: number = 5;
@@ -141,6 +141,8 @@ export const customNodesModule: interfaces.ContainerModule = new ContainerModule
ServiceIdentifiers.Factory__IIdentifierNamesGenerator,
ServiceIdentifiers.Factory__IStringArrayIndexNode,
ServiceIdentifiers.ICustomCodeHelperFormatter,
ServiceIdentifiers.IStringArrayStorage,
ServiceIdentifiers.IArrayUtils,
ServiceIdentifiers.IRandomGenerator,
ServiceIdentifiers.IOptions
));
@@ -10,6 +10,7 @@ import { TStringArrayIndexNodeFactory } from '../../types/container/custom-nodes
import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
import { IOptions } from '../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
import { StringArrayIndexesType } from '../../enums/node-transformers/string-array-transformers/StringArrayIndexesType';
import { StringArrayIndexNode } from '../../enums/custom-nodes/string-array-index-nodes/StringArrayIndexNode';
@@ -18,6 +19,7 @@ import { AbstractCustomNode } from '../AbstractCustomNode';
import { NodeFactory } from '../../node/NodeFactory';
import { NodeMetadata } from '../../node/NodeMetadata';
import { NodeUtils } from '../../node/NodeUtils';
import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
@injectable()
export abstract class AbstractStringArrayCallNode extends AbstractCustomNode {
@@ -29,6 +31,16 @@ export abstract class AbstractStringArrayCallNode extends AbstractCustomNode {
[StringArrayIndexesType.HexadecimalNumericString, StringArrayIndexNode.StringArrayHexadecimalNumericStringIndexNode]
]);
/**
* @type {IArrayUtils}
*/
protected readonly arrayUtils: IArrayUtils;
/**
* @type {IStringArrayStorage}
*/
protected readonly stringArrayStorage: IStringArrayStorage;
/**
* @type {TStringArrayIndexNodeFactory}
*/
@@ -38,6 +50,8 @@ export abstract class AbstractStringArrayCallNode extends AbstractCustomNode {
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
* @param {TStringArrayIndexNodeFactory} stringArrayIndexNodeFactory
* @param {ICustomCodeHelperFormatter} customCodeHelperFormatter
* @param {IStringArrayStorage} stringArrayStorage
* @param {IArrayUtils} arrayUtils
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
@@ -47,6 +61,8 @@ export abstract class AbstractStringArrayCallNode extends AbstractCustomNode {
@inject(ServiceIdentifiers.Factory__IStringArrayIndexNode)
stringArrayIndexNodeFactory: TStringArrayIndexNodeFactory,
@inject(ServiceIdentifiers.ICustomCodeHelperFormatter) customCodeHelperFormatter: ICustomCodeHelperFormatter,
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
@inject(ServiceIdentifiers.IArrayUtils) arrayUtils: IArrayUtils,
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
@inject(ServiceIdentifiers.IOptions) options: IOptions
) {
@@ -58,6 +74,8 @@ export abstract class AbstractStringArrayCallNode extends AbstractCustomNode {
);
this.stringArrayIndexNodeFactory = stringArrayIndexNodeFactory;
this.stringArrayStorage = stringArrayStorage;
this.arrayUtils = arrayUtils;
}
/**
@@ -7,12 +7,18 @@ import { TIdentifierNamesGeneratorFactory } from '../../types/container/generato
import { TStatement } from '../../types/node/TStatement';
import { TStringArrayIndexNodeFactory } from '../../types/container/custom-nodes/string-array-index-nodes/TStringArrayIndexNodeFactory';
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';
import { stringArrayRootCallsWrapperParametersDefaultCount } from '../../constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount';
import { stringArrayScopeCallsWrapperParametersMaxCount } from '../../constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount';
import { AbstractStringArrayCallNode } from './AbstractStringArrayCallNode';
import { NodeFactory } from '../../node/NodeFactory';
import { NodeUtils } from '../../node/NodeUtils';
@@ -43,10 +49,18 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
@initializable()
private stringArrayCallsWrapperName!: string;
/**
* @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
*/
@initializable()
private stringArrayCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
/**
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
* @param {TStringArrayIndexNodeFactory} stringArrayIndexNodeFactory
* @param {ICustomCodeHelperFormatter} customCodeHelperFormatter
* @param {IStringArrayStorage} stringArrayStorage
* @param {IArrayUtils} arrayUtils
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
@@ -56,6 +70,8 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
@inject(ServiceIdentifiers.Factory__IStringArrayIndexNode)
stringArrayIndexNodeFactory: TStringArrayIndexNodeFactory,
@inject(ServiceIdentifiers.ICustomCodeHelperFormatter) customCodeHelperFormatter: ICustomCodeHelperFormatter,
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
@inject(ServiceIdentifiers.IArrayUtils) arrayUtils: IArrayUtils,
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
@inject(ServiceIdentifiers.IOptions) options: IOptions
) {
@@ -63,6 +79,8 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
identifierNamesGeneratorFactory,
stringArrayIndexNodeFactory,
customCodeHelperFormatter,
stringArrayStorage,
arrayUtils,
randomGenerator,
options
);
@@ -70,17 +88,20 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
/**
* @param {string} stringArrayCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayCallsWrapperParameterIndexesData
* @param {number} index
* @param {number} indexShiftAmount
* @param {string | null} decodeKey
*/
public initialize (
stringArrayCallsWrapperName: string,
stringArrayCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
index: number,
indexShiftAmount: number,
decodeKey: string | null
): void {
this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
this.stringArrayCallsWrapperParameterIndexesData = stringArrayCallsWrapperParameterIndexesData;
this.index = index;
this.indexShiftAmount = indexShiftAmount;
this.decodeKey = decodeKey;
@@ -90,21 +111,42 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
* @returns {TStatement[]}
*/
protected getNodeStructure (): TStatement[] {
const callExpressionArgs: ESTree.Expression[] = [
this.getStringArrayIndexNode(this.indexShiftAmount + this.index)
];
const resultIndex: number = this.indexShiftAmount + this.index;
if (this.decodeKey) {
callExpressionArgs.push(this.getRc4KeyLiteralNode(this.decodeKey));
const indexNode: ESTree.Expression = this.getStringArrayIndexNode(resultIndex);
const rc4KeyLiteralNode: ESTree.Literal | null = this.decodeKey
? this.getRc4KeyLiteralNode(this.decodeKey)
: null;
// filling call expression arguments with a fake arguments first
const callExpressionArgs: ESTree.Expression[] = this.arrayUtils.fillWithRange(
!this.stringArrayCallsWrapperParameterIndexesData
// root string array calls wrapper
? stringArrayRootCallsWrapperParametersDefaultCount
// scope string array calls wrapper
: stringArrayScopeCallsWrapperParametersMaxCount,
() => this.getFakeStringArrayIndexNode(resultIndex)
);
callExpressionArgs.splice(this.stringArrayCallsWrapperParameterIndexesData?.index ?? 0, 1, indexNode);
if (this.stringArrayCallsWrapperParameterIndexesData) {
callExpressionArgs.splice(
this.stringArrayCallsWrapperParameterIndexesData.decodeKey,
1,
// use rc4 key literal node if exists or a node with fake string array wrapper index
rc4KeyLiteralNode ?? this.getFakeStringArrayIndexNode(resultIndex)
);
} else if (rc4KeyLiteralNode) {
callExpressionArgs.splice(1, 1, rc4KeyLiteralNode);
} else {
// have to delete element
callExpressionArgs.splice(1, 1);
}
const stringArrayIdentifierNode: ESTree.Identifier =
NodeFactory.identifierNode(this.stringArrayCallsWrapperName);
const structure: TStatement = NodeFactory.expressionStatementNode(
NodeFactory.callExpressionNode(
stringArrayIdentifierNode,
NodeFactory.identifierNode(this.stringArrayCallsWrapperName),
callExpressionArgs
)
);
@@ -113,4 +155,27 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
return [structure];
}
/**
* @param {number} actualIndex
* @returns {Expression}
*/
private getFakeStringArrayIndexNode (actualIndex: number): ESTree.Expression {
return this.getStringArrayIndexNode(this.getFakeStringArrayIndex(actualIndex));
}
/**
* @param {number} actualIndex
* @returns {number}
*/
private getFakeStringArrayIndex (actualIndex: number): number {
const stringArrayStorageLength: number = this.stringArrayStorage.getLength();
const fakeIndexOffset: number = stringArrayStorageLength / 2;
const minimumIndex: number = actualIndex - fakeIndexOffset;
const maximumIndex: number = actualIndex + fakeIndexOffset;
return this.randomGenerator.getRandomInteger(minimumIndex, maximumIndex);
}
}
@@ -7,15 +7,21 @@ import { TIdentifierNamesGeneratorFactory } from '../../types/container/generato
import { TStatement } from '../../types/node/TStatement';
import { TStringArrayIndexNodeFactory } from '../../types/container/custom-nodes/string-array-index-nodes/TStringArrayIndexNodeFactory';
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';
import { stringArrayScopeCallsWrapperParametersMaxCount } from '../../constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount';
import { AbstractStringArrayCallNode } from './AbstractStringArrayCallNode';
import { NodeFactory } from '../../node/NodeFactory';
import { NodeUtils } from '../../node/NodeUtils';
import { stringArrayRootCallsWrapperParametersDefaultCount } from '../../constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount';
@injectable()
export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArrayCallNode {
@@ -29,7 +35,13 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
* @type {string}
*/
@initializable()
private stringArrayCallsWrapperName!: string;
private upperStringArrayCallsWrapperName!: string;
/**
* @type {IStringArrayScopeCallsWrapperParameterIndexesData}
*/
@initializable()
private upperStringArrayCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
/**
* @type {string}
@@ -37,11 +49,19 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
@initializable()
private stringArrayScopeCallsWrapperName!: string;
/**
* @type {IStringArrayScopeCallsWrapperParameterIndexesData}
*/
@initializable()
private stringArrayScopeCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
/**
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
* @param {TStringArrayIndexNodeFactory} stringArrayIndexNodeFactory
* @param {ICustomCodeHelperFormatter} customCodeHelperFormatter
* @param {IStringArrayStorage} stringArrayStorage
* @param {IArrayUtils} arrayUtils
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
@@ -51,6 +71,8 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
@inject(ServiceIdentifiers.Factory__IStringArrayIndexNode)
stringArrayIndexNodeFactory: TStringArrayIndexNodeFactory,
@inject(ServiceIdentifiers.ICustomCodeHelperFormatter) customCodeHelperFormatter: ICustomCodeHelperFormatter,
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
@inject(ServiceIdentifiers.IArrayUtils) arrayUtils: IArrayUtils,
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
@inject(ServiceIdentifiers.IOptions) options: IOptions
) {
@@ -58,6 +80,8 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
identifierNamesGeneratorFactory,
stringArrayIndexNodeFactory,
customCodeHelperFormatter,
stringArrayStorage,
arrayUtils,
randomGenerator,
options
);
@@ -65,16 +89,22 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
/**
* @param {string} stringArrayScopeCallsWrapperName
* @param {string} stringArrayCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexesData
* @param {string} upperStringArrayCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexesData
* @param {number} shiftedIndex
*/
public initialize (
stringArrayScopeCallsWrapperName: string,
stringArrayCallsWrapperName: string,
shiftedIndex: number
stringArrayScopeCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
upperStringArrayCallsWrapperName: string,
upperStringArrayCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
shiftedIndex: number,
): void {
this.stringArrayScopeCallsWrapperName = stringArrayScopeCallsWrapperName;
this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
this.stringArrayScopeCallsWrapperParameterIndexesData = stringArrayScopeCallsWrapperParameterIndexesData;
this.upperStringArrayCallsWrapperName = upperStringArrayCallsWrapperName;
this.upperStringArrayCallsWrapperParameterIndexesData = upperStringArrayCallsWrapperParameterIndexesData;
this.shiftedIndex = shiftedIndex;
}
@@ -84,32 +114,52 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
protected getNodeStructure (): TStatement[] {
// identifiers of function expression parameters
// as a temporary names use random strings
const firstParameterIdentifierNode: ESTree.Identifier = NodeFactory.identifierNode(this.randomGenerator.getRandomString(6));
const secondParameterIdentifierNode: ESTree.Identifier = NodeFactory.identifierNode(this.randomGenerator.getRandomString(6));
const stringArrayCallIdentifierNode: ESTree.Identifier = NodeFactory.identifierNode(this.randomGenerator.getRandomString(6));
const decodeKeyIdentifierNode: ESTree.Identifier = NodeFactory.identifierNode(this.randomGenerator.getRandomString(6));
// identifiers of call to the parent string array scope wrapper
// as a temporary names use random strings
const firstCallArgumentIdentifierNode: ESTree.Identifier = NodeFactory.identifierNode(this.randomGenerator.getRandomString(6));
const secondCallArgumentIdentifierNode: ESTree.Identifier = NodeFactory.identifierNode(this.randomGenerator.getRandomString(6));
const stringArrayCallNode: ESTree.Expression = this.getUpperStringArrayCallNode(
stringArrayCallIdentifierNode,
this.getStringArrayIndexNode(this.shiftedIndex)
);
// function expression node
// stage 1: function expression node parameters
// filling all parameters with a fake parameters first
const parameters: ESTree.Identifier[] = this.arrayUtils.fillWithRange(
!this.stringArrayScopeCallsWrapperParameterIndexesData
// root string array calls wrapper
? stringArrayRootCallsWrapperParametersDefaultCount
// scope string array calls wrapper
: stringArrayScopeCallsWrapperParametersMaxCount,
() => this.getFakeParameterNode()
);
parameters.splice(this.stringArrayScopeCallsWrapperParameterIndexesData?.index ?? 0, 1, stringArrayCallIdentifierNode);
parameters.splice(this.stringArrayScopeCallsWrapperParameterIndexesData?.decodeKey ?? 1, 1, decodeKeyIdentifierNode);
// 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
// root string array calls wrapper
? stringArrayRootCallsWrapperParametersDefaultCount
// scope string array calls wrapper
: stringArrayScopeCallsWrapperParametersMaxCount,
(index: number) => this.getUpperStringArrayCallNode(
parameters[index],
this.getFakeUpperStringArrayIndexNode()
)
);
callExpressionArgs.splice(this.upperStringArrayCallsWrapperParameterIndexesData?.index ?? 0, 1, stringArrayCallNode);
callExpressionArgs.splice(this.upperStringArrayCallsWrapperParameterIndexesData?.decodeKey ?? 1, 1, decodeKeyIdentifierNode);
// stage 3: function expression node
const functionExpressionNode: ESTree.FunctionExpression = NodeFactory.functionExpressionNode(
[
firstParameterIdentifierNode,
secondParameterIdentifierNode,
],
parameters,
NodeFactory.blockStatementNode([
NodeFactory.returnStatementNode(
NodeFactory.callExpressionNode(
NodeFactory.identifierNode(this.stringArrayCallsWrapperName),
[
NodeFactory.binaryExpressionNode(
'-',
firstCallArgumentIdentifierNode,
this.getStringArrayIndexNode(this.shiftedIndex)
),
secondCallArgumentIdentifierNode
]
NodeFactory.identifierNode(this.upperStringArrayCallsWrapperName),
callExpressionArgs
)
)
])
@@ -127,16 +177,42 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
NodeUtils.parentizeAst(structure);
// stage 4: rename
// have to generate names for both parameter and call identifiers
const firstParameterName: string = this.identifierNamesGenerator.generateForLexicalScope(functionExpressionNode);
const secondParameterName: string = this.identifierNamesGenerator.generateForLexicalScope(functionExpressionNode);
firstParameterIdentifierNode.name = firstParameterName;
secondParameterIdentifierNode.name = secondParameterName;
firstCallArgumentIdentifierNode.name = firstParameterName;
secondCallArgumentIdentifierNode.name = secondParameterName;
for (const parameter of parameters) {
parameter.name = this.identifierNamesGenerator.generateForLexicalScope(functionExpressionNode);
}
return [structure];
}
/**
* @param {Identifier} indexParameterIdentifierNode
* @param {Expression} indexShiftNode
* @returns {Expression}
*/
private getUpperStringArrayCallNode (
indexParameterIdentifierNode: ESTree.Identifier,
indexShiftNode: ESTree.Expression
): ESTree.Expression {
return NodeFactory.binaryExpressionNode(
'-',
indexParameterIdentifierNode,
indexShiftNode
);
}
/**
* @returns {Identifier}
*/
private getFakeParameterNode (): ESTree.Identifier {
return NodeFactory.identifierNode(this.randomGenerator.getRandomString(6));
}
/**
* @returns {Expression}
*/
private getFakeUpperStringArrayIndexNode (): ESTree.Expression {
return this.getStringArrayIndexNode(this.randomGenerator.getRandomInteger(0, 500));
}
}
@@ -5,9 +5,11 @@ import { TIdentifierNamesGeneratorFactory } from '../../types/container/generato
import { TStatement } from '../../types/node/TStatement';
import { TStringArrayIndexNodeFactory } from '../../types/container/custom-nodes/string-array-index-nodes/TStringArrayIndexNodeFactory';
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 { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
import { initializable } from '../../decorators/Initializable';
@@ -34,6 +36,8 @@ export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArra
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
* @param {TStringArrayIndexNodeFactory} stringArrayIndexNodeFactory
* @param {ICustomCodeHelperFormatter} customCodeHelperFormatter
* @param {IStringArrayStorage} stringArrayStorage
* @param {IArrayUtils} arrayUtils
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
@@ -43,6 +47,8 @@ export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArra
@inject(ServiceIdentifiers.Factory__IStringArrayIndexNode)
stringArrayIndexNodeFactory: TStringArrayIndexNodeFactory,
@inject(ServiceIdentifiers.ICustomCodeHelperFormatter) customCodeHelperFormatter: ICustomCodeHelperFormatter,
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
@inject(ServiceIdentifiers.IArrayUtils) arrayUtils: IArrayUtils,
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
@inject(ServiceIdentifiers.IOptions) options: IOptions,
) {
@@ -50,6 +56,8 @@ export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArra
identifierNamesGeneratorFactory,
stringArrayIndexNodeFactory,
customCodeHelperFormatter,
stringArrayStorage,
arrayUtils,
randomGenerator,
options
);
@@ -0,0 +1,18 @@
import { IStringArrayScopeCallsWrapperParameterIndexesData } from './IStringArrayScopeCallsWrapperParameterIndexesData';
export interface IStringArrayScopeCallsWrapperData {
/**
* @type {number}
*/
index: number;
/**
* @type {string}
*/
name: string;
/**
* @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
*/
parameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null;
}
@@ -1,5 +1,7 @@
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
import { IStringArrayScopeCallsWrapperParameterIndexesData } from './IStringArrayScopeCallsWrapperParameterIndexesData';
export interface IStringArrayScopeCallsWrapperLexicalScopeData {
/**
* @type {TNodeWithLexicalScopeStatements | null}
@@ -15,4 +17,9 @@ export interface IStringArrayScopeCallsWrapperLexicalScopeData {
* @type {number}
*/
scopeShiftedIndex: number;
/**
* @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
*/
callsWrappersParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null;
}
@@ -0,0 +1,11 @@
export interface IStringArrayScopeCallsWrapperParameterIndexesData {
/**
* @type {number}
*/
index: number;
/**
* @type {number}
*/
decodeKey: number;
}
+7
View File
@@ -5,6 +5,13 @@ export interface IArrayUtils {
*/
createWithRange (length: number): number[];
/**
* @param {number} length
* @param {(index: number) => TValue} valueFunction
* @returns {TValue[]}
*/
fillWithRange <TValue> (length: number, valueFunction: (index: number) => TValue): TValue[];
/**
* @param {T[]} array
* @returns {T | null}
+8
View File
@@ -20,6 +20,14 @@ export interface IRandomGenerator {
*/
getRandomInteger (min: number, max: number): number;
/**
* @param {number} min
* @param {number} max
* @param {number[]} valuesToExclude
* @returns {number}
*/
getRandomIntegerExcluding (min: number, max: number, valuesToExclude: number[]): number;
/**
* @param length
* @param pool
@@ -12,10 +12,12 @@ import { TStringArrayCustomNodeFactory } from '../../types/container/custom-node
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 { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
import { IVisitedLexicalScopeNodesStackStorage } from '../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage';
import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
@@ -132,6 +134,9 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
return lexicalScopeBodyNode;
}
const {
callsWrappersParameterIndexesData: stringArrayScopeCallsWrapperParameterIndexes
} = stringArrayScopeCallsWrapperLexicalScopeData;
const stringArrayScopeCallsWrapperNamesDataList: (IStringArrayScopeCallsWrapperNamesData | undefined)[] =
Object.values(stringArrayScopeCallsWrapperNamesDataByEncoding);
@@ -150,17 +155,20 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
*/
for (let i = namesLength - 1; i >= 0; i--) {
const stringArrayScopeCallsWrapperName: string = names[i];
const [
upperStringArrayCallsWrapperName,
upperStringArrayCallsWrapperShiftedIndex,
] = this.getUpperStringArrayCallsWrapperData(
const {
name: upperStringArrayCallsWrapperName,
index: upperStringArrayCallsWrapperShiftedIndex,
parameterIndexesData: upperStringArrayCallsWrapperParameterIndexes
} = this.getUpperStringArrayCallsWrapperData(
stringArrayScopeCallsWrapperNamesData,
stringArrayScopeCallsWrapperLexicalScopeData,
);
const stringArrayScopeCallsWrapperNode: TStatement[] = this.getStringArrayScopeCallsWrapperNode(
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
upperStringArrayCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperShiftedIndex
);
@@ -177,30 +185,31 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
/**
* @param {IStringArrayScopeCallsWrapperNamesData} stringArrayScopeCallsWrapperNamesData
* @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
* @returns {[name: string, index: number]}
* @returns {IStringArrayScopeCallsWrapperData}
*/
private getRootStringArrayCallsWrapperData (
stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
): [name: string, index: number] {
): IStringArrayScopeCallsWrapperData {
const {encoding} = stringArrayScopeCallsWrapperNamesData;
const {resultShiftedIndex} = stringArrayScopeCallsWrapperLexicalScopeData;
return [
this.stringArrayStorage.getStorageCallsWrapperName(encoding),
resultShiftedIndex
];
return {
name: this.stringArrayStorage.getStorageCallsWrapperName(encoding),
index: resultShiftedIndex,
parameterIndexesData: null
};
}
/**
* @param {IStringArrayScopeCallsWrapperNamesData} stringArrayScopeCallsWrapperNamesData
* @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
* @returns {[name: string, index: number]}
* @returns {IStringArrayScopeCallsWrapperData}
*/
private getUpperStringArrayCallsWrapperData (
stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
): [name: string, index: number] {
): IStringArrayScopeCallsWrapperData {
const {encoding} = stringArrayScopeCallsWrapperNamesData;
const {scopeShiftedIndex} = stringArrayScopeCallsWrapperLexicalScopeData;
@@ -223,6 +232,9 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
const parentLexicalScopeNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null = this.stringArrayScopeCallsWrapperNamesDataStorage
.get(parentLexicalScopeBodyNode) ?? null;
const parentScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null = this.stringArrayScopeCallsWrapperLexicalScopeDataStorage
.get(parentLexicalScopeBodyNode) ?? null;
const parentLexicalScopeNames: string[] | null = parentLexicalScopeNamesDataByEncoding?.[encoding]?.names ?? null;
if (!parentLexicalScopeNames?.length) {
@@ -232,29 +244,38 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
const upperStringArrayCallsWrapperName: string = this.randomGenerator
.getRandomGenerator()
.pickone(parentLexicalScopeNames);
const parameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null =
parentScopeCallsWrapperLexicalScopeData?.callsWrappersParameterIndexesData ?? null;
return [
upperStringArrayCallsWrapperName,
scopeShiftedIndex
];
return {
name: upperStringArrayCallsWrapperName,
index: scopeShiftedIndex,
parameterIndexesData
};
}
/**
* @param {string} stringArrayScopeCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexes
* @param {string} upperStringArrayCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexes
* @param {number} stringArrayScopeCallsWrapperShiftedIndex
* @returns {TStatement[]}
*/
private getStringArrayScopeCallsWrapperNode (
stringArrayScopeCallsWrapperName: string,
stringArrayScopeCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
upperStringArrayCallsWrapperName: string,
upperStringArrayCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
stringArrayScopeCallsWrapperShiftedIndex: number
): TStatement[] {
switch (this.options.stringArrayWrappersType) {
case StringArrayWrappersType.Function:
return this.getStringArrayScopeCallsWrapperFunctionNode(
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
upperStringArrayCallsWrapperParameterIndexes,
stringArrayScopeCallsWrapperShiftedIndex
);
@@ -291,13 +312,17 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
/**
* @param {string} stringArrayScopeCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexes
* @param {string} upperStringArrayCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexes
* @param {number} stringArrayScopeCallsWrapperShiftedIndex
* @returns {TStatement[]}
*/
private getStringArrayScopeCallsWrapperFunctionNode (
stringArrayScopeCallsWrapperName: string,
stringArrayScopeCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
upperStringArrayCallsWrapperName: string,
upperStringArrayCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
stringArrayScopeCallsWrapperShiftedIndex: number
): TStatement[] {
const stringArrayScopeCallsWrapperFunctionNode: ICustomNode<TInitialData<StringArrayScopeCallsWrapperFunctionNode>> =
@@ -307,8 +332,10 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
stringArrayScopeCallsWrapperFunctionNode.initialize(
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
stringArrayScopeCallsWrapperShiftedIndex
upperStringArrayCallsWrapperParameterIndexes,
stringArrayScopeCallsWrapperShiftedIndex,
);
return stringArrayScopeCallsWrapperFunctionNode.getNode();
@@ -15,9 +15,11 @@ import { IIdentifierNamesGenerator } from '../../interfaces/generators/identifie
import { ILiteralNodesCacheStorage } from '../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage';
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 { 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';
import { IStringArrayStorageItemData } from '../../interfaces/storages/string-array-transformers/IStringArrayStorageItem';
@@ -28,6 +30,8 @@ import { NodeTransformationStage } from '../../enums/node-transformers/NodeTrans
import { StringArrayCustomNode } from '../../enums/custom-nodes/StringArrayCustomNode';
import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
import { stringArrayScopeCallsWrapperParametersMaxCount } from '../../constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount';
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
import { NodeGuards } from '../../node/NodeGuards';
import { NodeLiteralUtils } from '../../node/NodeLiteralUtils';
@@ -207,7 +211,11 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
* @returns {Expression}
*/
private getStringArrayCallNode (stringArrayStorageItemData: IStringArrayStorageItemData): ESTree.Expression {
const [stringArrayCallsWrapperName, index] = this.getStringArrayCallsWrapperData(stringArrayStorageItemData);
const {
name: stringArrayCallsWrapperName,
index,
parameterIndexesData
} = this.getStringArrayCallsWrapperData(stringArrayStorageItemData);
const {decodeKey } = stringArrayStorageItemData;
const stringArrayCallCustomNode: ICustomNode<TInitialData<StringArrayCallNode>> =
@@ -215,6 +223,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
stringArrayCallCustomNode.initialize(
stringArrayCallsWrapperName,
parameterIndexesData,
index,
this.stringArrayStorage.getIndexShiftAmount(),
decodeKey
@@ -231,11 +240,11 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
/**
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
* @returns {[name: string, index: number]}
* @returns {IStringArrayScopeCallsWrapperData}
*/
private getStringArrayCallsWrapperData (
stringArrayStorageItemData: IStringArrayStorageItemData
): [name: string, index: number] {
): IStringArrayScopeCallsWrapperData {
return !this.options.stringArrayWrappersCount
? this.getRootStringArrayCallsWrapperData(stringArrayStorageItemData)
: this.getUpperStringArrayCallsWrapperData(stringArrayStorageItemData);
@@ -243,28 +252,29 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
/**
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
* @returns {[name: string, index: number]}
* @returns {IStringArrayScopeCallsWrapperData}
*/
private getRootStringArrayCallsWrapperData (
stringArrayStorageItemData: IStringArrayStorageItemData
): [name: string, index: number] {
): IStringArrayScopeCallsWrapperData {
const {encoding, index} = stringArrayStorageItemData;
const rootStringArrayCallsWrapperName: string = this.stringArrayStorage.getStorageCallsWrapperName(encoding);
return [
rootStringArrayCallsWrapperName,
return {
name: rootStringArrayCallsWrapperName,
parameterIndexesData: null,
index
];
};
}
/**
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
* @returns {[name: string, index: number]}
* @returns {IStringArrayScopeCallsWrapperData}
*/
private getUpperStringArrayCallsWrapperData (
stringArrayStorageItemData: IStringArrayStorageItemData
): [name: string, index: number] {
): IStringArrayScopeCallsWrapperData {
const {encoding, index} = stringArrayStorageItemData;
const currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
@@ -295,10 +305,11 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
? stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex + index
: index;
return [
randomUpperStringArrayCallsWrapperName,
resultIndex
];
return {
name: randomUpperStringArrayCallsWrapperName,
index: resultIndex,
parameterIndexesData: stringArrayScopeCallsWrapperLexicalScopeData.callsWrappersParameterIndexesData
};
}
/**
@@ -362,6 +373,10 @@ 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,
@@ -373,6 +388,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
: scopeShiftedIndex;
const lexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData = {
callsWrappersParameterIndexesData,
parentLexicalScopeBodyNode,
resultShiftedIndex,
scopeShiftedIndex
@@ -385,4 +401,20 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
return lexicalScopeData;
}
/**
* @returns {IStringArrayScopeCallsWrapperParameterIndexesData}
*/
private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData {
const minIndexValue: number = 0;
const maxIndexValue: number = stringArrayScopeCallsWrapperParametersMaxCount - 1;
const index: number = this.randomGenerator.getRandomInteger(minIndexValue, maxIndexValue);
const decodeKey: number = this.randomGenerator.getRandomIntegerExcluding(minIndexValue, maxIndexValue, [index]);
return {
index,
decodeKey
};
}
}
+15
View File
@@ -34,6 +34,21 @@ export class ArrayUtils implements IArrayUtils {
return range;
}
/**
* @param {number} length
* @param {(index: number) => TValue} valueFunction
* @returns {TValue[]}
*/
public fillWithRange <TValue> (length: number, valueFunction: (index: number) => TValue): TValue[] {
const range: TValue[] = [];
for (let i: number = 0; i < length; i++) {
range.push(valueFunction(i));
}
return range;
}
/**
* @param {T[]} array
* @returns {T | null}
+20
View File
@@ -80,6 +80,26 @@ export class RandomGenerator implements IRandomGenerator, IInitializable {
});
}
/**
* @param {number} min
* @param {number} max
* @param {number[]} valuesToExclude
* @returns {number}
*/
public getRandomIntegerExcluding (min: number, max: number, valuesToExclude: number[]): number {
const valuesToPickArray: number[] = [];
for (let value: number = min; value <= max; value++) {
if (valuesToExclude.includes(value)) {
continue;
}
valuesToPickArray.push(value);
}
return this.randomGenerator.pickone(valuesToPickArray);
}
/**
* @param {number} length
* @param {string} pool