|
@@ -3,21 +3,22 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
|
|
|
|
|
|
import * as ESTree from 'estree';
|
|
import * as ESTree from 'estree';
|
|
|
|
|
|
|
|
+import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory';
|
|
import { TInitialData } from '../../types/TInitialData';
|
|
import { TInitialData } from '../../types/TInitialData';
|
|
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
|
|
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
|
|
import { TStatement } from '../../types/node/TStatement';
|
|
import { TStatement } from '../../types/node/TStatement';
|
|
-import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
|
|
|
|
-import { TStringArrayScopeCallsWrapperDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperDataByEncoding';
|
|
|
|
|
|
+import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
|
|
import { TStringArrayTransformerCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayTransformerCustomNodeFactory';
|
|
import { TStringArrayTransformerCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayTransformerCustomNodeFactory';
|
|
|
|
|
|
import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
|
|
import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
|
|
import { IEscapeSequenceEncoder } from '../../interfaces/utils/IEscapeSequenceEncoder';
|
|
import { IEscapeSequenceEncoder } from '../../interfaces/utils/IEscapeSequenceEncoder';
|
|
import { IIdentifierNamesGenerator } from '../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator';
|
|
import { IIdentifierNamesGenerator } from '../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator';
|
|
-import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory';
|
|
|
|
import { ILiteralNodesCacheStorage } from '../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage';
|
|
import { ILiteralNodesCacheStorage } from '../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage';
|
|
import { IOptions } from '../../interfaces/options/IOptions';
|
|
import { IOptions } from '../../interfaces/options/IOptions';
|
|
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
|
|
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
|
|
-import { IStringArrayScopeCallsWrapperDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
|
|
|
|
|
|
+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 { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
|
|
import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
|
|
import { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
|
|
import { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
|
|
import { IStringArrayStorageItemData } from '../../interfaces/storages/string-array-transformers/IStringArrayStorageItem';
|
|
import { IStringArrayStorageItemData } from '../../interfaces/storages/string-array-transformers/IStringArrayStorageItem';
|
|
@@ -26,6 +27,7 @@ import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
|
|
|
|
|
|
import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
|
|
import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
|
|
import { StringArrayTransformerCustomNode } from '../../enums/custom-nodes/StringArrayTransformerCustomNode';
|
|
import { StringArrayTransformerCustomNode } from '../../enums/custom-nodes/StringArrayTransformerCustomNode';
|
|
|
|
+import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
|
|
|
|
|
|
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
|
|
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
|
|
import { NodeFactory } from '../../node/NodeFactory';
|
|
import { NodeFactory } from '../../node/NodeFactory';
|
|
@@ -37,6 +39,16 @@ import { StringArrayCallNode } from '../../custom-nodes/string-array-nodes/Strin
|
|
|
|
|
|
@injectable()
|
|
@injectable()
|
|
export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
|
|
+ /**
|
|
|
|
+ * @type {number}
|
|
|
|
+ */
|
|
|
|
+ private static readonly minShiftedIndexValue: number = -1000;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @type {number}
|
|
|
|
+ */
|
|
|
|
+ private static readonly maxShiftedIndexValue: number = 1000;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @type {IEscapeSequenceEncoder}
|
|
* @type {IEscapeSequenceEncoder}
|
|
*/
|
|
*/
|
|
@@ -63,9 +75,14 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
private readonly stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer;
|
|
private readonly stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer;
|
|
|
|
|
|
/**
|
|
/**
|
|
- * @type {IStringArrayScopeCallsWrapperDataStorage}
|
|
|
|
|
|
+ * @type {IStringArrayScopeCallsWrapperLexicalScopeDataStorage}
|
|
|
|
+ */
|
|
|
|
+ private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @type {IStringArrayScopeCallsWrapperNamesDataStorage}
|
|
*/
|
|
*/
|
|
- private readonly stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage;
|
|
|
|
|
|
+ private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
|
|
|
|
|
|
/**
|
|
/**
|
|
* @type {TStringArrayTransformerCustomNodeFactory}
|
|
* @type {TStringArrayTransformerCustomNodeFactory}
|
|
@@ -84,7 +101,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
* @param {ILiteralNodesCacheStorage} literalNodesCacheStorage
|
|
* @param {ILiteralNodesCacheStorage} literalNodesCacheStorage
|
|
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
|
|
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
|
|
* @param {IStringArrayStorage} stringArrayStorage
|
|
* @param {IStringArrayStorage} stringArrayStorage
|
|
- * @param {IStringArrayScopeCallsWrapperDataStorage} stringArrayScopeCallsWrapperDataStorage
|
|
|
|
|
|
+ * @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
|
|
|
|
+ * @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
|
|
* @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer
|
|
* @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer
|
|
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
|
|
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
|
|
* @param {TStringArrayTransformerCustomNodeFactory} stringArrayTransformerCustomNodeFactory
|
|
* @param {TStringArrayTransformerCustomNodeFactory} stringArrayTransformerCustomNodeFactory
|
|
@@ -96,7 +114,10 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
@inject(ServiceIdentifiers.ILiteralNodesCacheStorage) literalNodesCacheStorage: ILiteralNodesCacheStorage,
|
|
@inject(ServiceIdentifiers.ILiteralNodesCacheStorage) literalNodesCacheStorage: ILiteralNodesCacheStorage,
|
|
@inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
|
|
@inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
|
|
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
|
|
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
|
|
- @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperDataStorage) stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage,
|
|
|
|
|
|
+ @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
|
|
|
|
+ stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
|
|
|
|
+ @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
|
|
|
|
+ stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
|
|
@inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer,
|
|
@inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer,
|
|
@inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
|
|
@inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
|
|
identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
|
|
identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
|
|
@@ -109,7 +130,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
this.literalNodesCacheStorage = literalNodesCacheStorage;
|
|
this.literalNodesCacheStorage = literalNodesCacheStorage;
|
|
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
|
|
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
|
|
this.stringArrayStorage = stringArrayStorage;
|
|
this.stringArrayStorage = stringArrayStorage;
|
|
- this.stringArrayScopeCallsWrapperDataStorage = stringArrayScopeCallsWrapperDataStorage;
|
|
|
|
|
|
+ this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
|
|
|
|
+ this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
|
|
this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer;
|
|
this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer;
|
|
this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
|
|
this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
|
|
this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
|
|
this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
|
|
@@ -208,8 +230,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
* @returns {Node}
|
|
* @returns {Node}
|
|
*/
|
|
*/
|
|
private getStringArrayCallNode (stringArrayStorageItemData: IStringArrayStorageItemData): ESTree.Node {
|
|
private getStringArrayCallNode (stringArrayStorageItemData: IStringArrayStorageItemData): ESTree.Node {
|
|
- const stringArrayCallsWrapperName: string = this.getStringArrayCallsWrapperName(stringArrayStorageItemData);
|
|
|
|
- const { index, decodeKey } = stringArrayStorageItemData;
|
|
|
|
|
|
+ const [stringArrayCallsWrapperName, index] = this.getStringArrayCallsWrapperData(stringArrayStorageItemData);
|
|
|
|
+ const {decodeKey } = stringArrayStorageItemData;
|
|
|
|
|
|
const stringArrayCallCustomNode: ICustomNode<TInitialData<StringArrayCallNode>> =
|
|
const stringArrayCallCustomNode: ICustomNode<TInitialData<StringArrayCallNode>> =
|
|
this.stringArrayTransformerCustomNodeFactory(StringArrayTransformerCustomNode.StringArrayCallNode);
|
|
this.stringArrayTransformerCustomNodeFactory(StringArrayTransformerCustomNode.StringArrayCallNode);
|
|
@@ -227,58 +249,159 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
|
|
|
|
|
/**
|
|
/**
|
|
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
|
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
|
- * @returns {string}
|
|
|
|
|
|
+ * @returns {[name: string, index: number]}
|
|
*/
|
|
*/
|
|
- private getStringArrayCallsWrapperName (stringArrayStorageItemData: IStringArrayStorageItemData): string {
|
|
|
|
- const {encoding} = stringArrayStorageItemData;
|
|
|
|
-
|
|
|
|
|
|
+ private getStringArrayCallsWrapperData (
|
|
|
|
+ stringArrayStorageItemData: IStringArrayStorageItemData
|
|
|
|
+ ): [name: string, index: number] {
|
|
return !this.options.stringArrayWrappersCount
|
|
return !this.options.stringArrayWrappersCount
|
|
- ? this.getRootStringArrayCallsWrapperName(encoding)
|
|
|
|
- : this.getUpperStringArrayCallsWrapperName(encoding);
|
|
|
|
-
|
|
|
|
|
|
+ ? this.getRootStringArrayCallsWrapperData(stringArrayStorageItemData)
|
|
|
|
+ : this.getUpperStringArrayCallsWrapperData(stringArrayStorageItemData);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * @param {TStringArrayEncoding} encoding
|
|
|
|
- * @returns {string}
|
|
|
|
|
|
+ * @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
|
|
|
+ * @returns {[name: string, index: number]}
|
|
*/
|
|
*/
|
|
- private getRootStringArrayCallsWrapperName (encoding: TStringArrayEncoding): string {
|
|
|
|
- return this.stringArrayStorage.getStorageCallsWrapperName(encoding);
|
|
|
|
|
|
+ private getRootStringArrayCallsWrapperData (
|
|
|
|
+ stringArrayStorageItemData: IStringArrayStorageItemData
|
|
|
|
+ ): [name: string, index: number] {
|
|
|
|
+ const {encoding, index} = stringArrayStorageItemData;
|
|
|
|
+
|
|
|
|
+ const rootStringArrayCallsWrapperName: string = this.stringArrayStorage.getStorageCallsWrapperName(encoding);
|
|
|
|
+
|
|
|
|
+ return [
|
|
|
|
+ rootStringArrayCallsWrapperName,
|
|
|
|
+ index
|
|
|
|
+ ];
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * @param {TStringArrayEncoding} encoding
|
|
|
|
- * @returns {string}
|
|
|
|
|
|
+ * @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
|
|
|
+ * @returns {[name: string, index: number]}
|
|
*/
|
|
*/
|
|
- private getUpperStringArrayCallsWrapperName (encoding: TStringArrayEncoding): string {
|
|
|
|
- const currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | undefined =
|
|
|
|
- this.visitedLexicalScopeNodesStackStorage.getLastElement();
|
|
|
|
|
|
+ private getUpperStringArrayCallsWrapperData (
|
|
|
|
+ stringArrayStorageItemData: IStringArrayStorageItemData
|
|
|
|
+ ): [name: string, index: number] {
|
|
|
|
+ const {encoding, index} = stringArrayStorageItemData;
|
|
|
|
+ const currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
|
|
|
|
+ this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
|
|
|
|
+ const parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
|
|
|
|
+ this.visitedLexicalScopeNodesStackStorage.getPenultimateElement() ?? null;
|
|
|
|
|
|
if (!currentLexicalScopeBodyNode) {
|
|
if (!currentLexicalScopeBodyNode) {
|
|
throw new Error('Cannot find current lexical scope body node');
|
|
throw new Error('Cannot find current lexical scope body node');
|
|
}
|
|
}
|
|
|
|
|
|
- const stringArrayScopeCallsWrapperDataByEncoding: TStringArrayScopeCallsWrapperDataByEncoding =
|
|
|
|
- this.stringArrayScopeCallsWrapperDataStorage.get(currentLexicalScopeBodyNode) ?? {};
|
|
|
|
- const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperDataByEncoding[encoding]?.names ?? [];
|
|
|
|
|
|
+ const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
|
|
|
|
+ this.getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding(
|
|
|
|
+ currentLexicalScopeBodyNode,
|
|
|
|
+ stringArrayStorageItemData
|
|
|
|
+ );
|
|
|
|
+ const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData =
|
|
|
|
+ this.getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData(
|
|
|
|
+ currentLexicalScopeBodyNode,
|
|
|
|
+ parentLexicalScopeBodyNode
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
|
|
|
|
+ const randomUpperStringArrayCallsWrapperName: string = this.randomGenerator
|
|
|
|
+ .getRandomGenerator()
|
|
|
|
+ .pickone(stringArrayScopeCallsWrapperNames);
|
|
|
|
+
|
|
|
|
+ const resultIndex: number = stringArrayScopeCallsWrapperLexicalScopeData
|
|
|
|
+ ? stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex + index
|
|
|
|
+ : index;
|
|
|
|
+
|
|
|
|
+ return [
|
|
|
|
+ randomUpperStringArrayCallsWrapperName,
|
|
|
|
+ resultIndex
|
|
|
|
+ ];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @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;
|
|
const isFilledScopeCallsWrapperNamesList: boolean = stringArrayScopeCallsWrapperNames.length === this.options.stringArrayWrappersCount;
|
|
|
|
|
|
- if (!isFilledScopeCallsWrapperNamesList) {
|
|
|
|
- const nextScopeCallsWrapperName: string = this.identifierNamesGenerator.generateNext();
|
|
|
|
|
|
+ if (isFilledScopeCallsWrapperNamesList) {
|
|
|
|
+ return stringArrayScopeCallsWrapperNamesDataByEncoding;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const nextScopeCallsWrapperName: string = this.identifierNamesGenerator.generateNext();
|
|
|
|
|
|
- stringArrayScopeCallsWrapperNames.push(nextScopeCallsWrapperName);
|
|
|
|
- stringArrayScopeCallsWrapperDataByEncoding[encoding] = {
|
|
|
|
- encoding,
|
|
|
|
- names: stringArrayScopeCallsWrapperNames
|
|
|
|
- };
|
|
|
|
|
|
+ stringArrayScopeCallsWrapperNamesDataByEncoding[encoding] = {
|
|
|
|
+ encoding,
|
|
|
|
+ names: [
|
|
|
|
+ ...stringArrayScopeCallsWrapperNames,
|
|
|
|
+ nextScopeCallsWrapperName
|
|
|
|
+ ]
|
|
|
|
+ };
|
|
|
|
|
|
- this.stringArrayScopeCallsWrapperDataStorage.set(
|
|
|
|
- currentLexicalScopeBodyNode,
|
|
|
|
- stringArrayScopeCallsWrapperDataByEncoding
|
|
|
|
- );
|
|
|
|
|
|
+ this.stringArrayScopeCallsWrapperNamesDataStorage.set(
|
|
|
|
+ currentLexicalScopeBodyNode,
|
|
|
|
+ stringArrayScopeCallsWrapperNamesDataByEncoding
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ return stringArrayScopeCallsWrapperNamesDataByEncoding;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
|
|
|
|
+ * @param {TNodeWithLexicalScopeStatements | null} parentLexicalScopeBodyNode
|
|
|
|
+ * @returns {IStringArrayScopeCallsWrapperLexicalScopeData}
|
|
|
|
+ * @private
|
|
|
|
+ */
|
|
|
|
+ private getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData (
|
|
|
|
+ currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
|
|
|
|
+ parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null
|
|
|
|
+ ): IStringArrayScopeCallsWrapperLexicalScopeData {
|
|
|
|
+ const storedLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
|
|
|
|
+ this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(currentLexicalScopeBodyNode)
|
|
|
|
+ ?? null;
|
|
|
|
+
|
|
|
|
+ if (storedLexicalScopeData) {
|
|
|
|
+ return storedLexicalScopeData;
|
|
}
|
|
}
|
|
|
|
|
|
- return this.randomGenerator.getRandomGenerator().pickone(stringArrayScopeCallsWrapperNames);
|
|
|
|
|
|
+ const parentLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null = parentLexicalScopeBodyNode
|
|
|
|
+ ? this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(parentLexicalScopeBodyNode) ?? null
|
|
|
|
+ : null;
|
|
|
|
+
|
|
|
|
+ const scopeShiftedIndex: number = this.options.stringArrayWrappersType === StringArrayWrappersType.Function
|
|
|
|
+ ? this.randomGenerator.getRandomInteger(
|
|
|
|
+ StringArrayTransformer.minShiftedIndexValue,
|
|
|
|
+ StringArrayTransformer.maxShiftedIndexValue
|
|
|
|
+ )
|
|
|
|
+ : 0;
|
|
|
|
+ const resultShiftedIndex: number = parentLexicalScopeData
|
|
|
|
+ ? parentLexicalScopeData.resultShiftedIndex + scopeShiftedIndex
|
|
|
|
+ : scopeShiftedIndex;
|
|
|
|
+
|
|
|
|
+ const lexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData = {
|
|
|
|
+ parentLexicalScopeBodyNode,
|
|
|
|
+ resultShiftedIndex,
|
|
|
|
+ scopeShiftedIndex
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.set(
|
|
|
|
+ currentLexicalScopeBodyNode,
|
|
|
|
+ lexicalScopeData
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ return lexicalScopeData;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|