WIP: shifted indexes of string array wrappers #2: refactoring

This commit is contained in:
sanex
2020-09-16 20:36:14 +03:00
parent 559e3a440a
commit 3036e8be1a
14 changed files with 269 additions and 35421 deletions
+2 -1
View File
@@ -50,7 +50,8 @@ export enum ServiceIdentifiers {
IScopeIdentifiersTraverser = 'IScopeIdentifiersTraverser',
ISourceCode = 'ISourceCode',
IScopeAnalyzer = 'IScopeAnalyzer',
IStringArrayScopeCallsWrapperDataStorage = 'IStringArrayScopeCallsWrapperDataStorage',
IStringArrayScopeCallsWrapperLexicalScopeDataStorage = 'IStringArrayScopeCallsWrapperLexicalScopeDataStorage',
IStringArrayScopeCallsWrapperNamesDataStorage = 'IStringArrayScopeCallsWrapperNamesDataStorage',
IStringArrayStorage = 'IStringArrayStorage',
IStringArrayStorageAnalyzer = 'IStringArrayStorageAnalyzer',
IVisitedLexicalScopeNodesStackStorage = 'IVisitedLexicalScopeNodesStackStorage',
@@ -7,14 +7,16 @@ import { TCustomCodeHelperGroupStorage } from '../../../types/storages/TCustomCo
import { ILiteralNodesCacheStorage } from '../../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage';
import { IOptions } from '../../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator';
import { IStringArrayScopeCallsWrapperDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
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 { IVisitedLexicalScopeNodesStackStorage } from '../../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage';
import { ControlFlowStorage } from '../../../storages/custom-nodes/ControlFlowStorage';
import { CustomCodeHelperGroupStorage } from '../../../storages/custom-code-helpers/CustomCodeHelperGroupStorage';
import { LiteralNodesCacheStorage } from '../../../storages/string-array-transformers/LiteralNodesCacheStorage';
import { StringArrayScopeCallsWrapperDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperDataStorage';
import { StringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperLexicalScopeDataStorage';
import { StringArrayScopeCallsWrapperNamesDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperNamesDataStorage';
import { StringArrayStorage } from '../../../storages/string-array-transformers/StringArrayStorage';
import { VisitedLexicalScopeNodesStackStorage } from '../../../storages/string-array-transformers/VisitedLexicalScopeNodesStackStorage';
@@ -32,8 +34,12 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b
.to(StringArrayStorage)
.inSingletonScope();
bind<IStringArrayScopeCallsWrapperDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperDataStorage)
.to(StringArrayScopeCallsWrapperDataStorage)
bind<IStringArrayScopeCallsWrapperLexicalScopeDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
.to(StringArrayScopeCallsWrapperLexicalScopeDataStorage)
.inSingletonScope();
bind<IStringArrayScopeCallsWrapperNamesDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
.to(StringArrayScopeCallsWrapperNamesDataStorage)
.inSingletonScope();
bind<IVisitedLexicalScopeNodesStackStorage>(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage)
@@ -1,24 +0,0 @@
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
export interface IStringArrayScopeCallsWrapperData {
/**
* @type {number}
*/
globalIndexShift: number;
/**
* @type {TStringArrayScopeCallsWrapperNamesDataByEncoding}
*/
names: TStringArrayScopeCallsWrapperNamesDataByEncoding;
/**
* @type {TNodeWithLexicalScopeStatements | null}
*/
parentLexicalScopeNode: TNodeWithLexicalScopeStatements | null;
/**
* @type {number}
*/
scopeIndexShift: number;
}
@@ -0,0 +1,18 @@
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
export interface IStringArrayScopeCallsWrapperLexicalScopeData {
/**
* @type {TNodeWithLexicalScopeStatements | null}
*/
parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null;
/**
* @type {number}
*/
resultShiftedIndex: number;
/**
* @type {number}
*/
scopeShiftedIndex: number;
}
@@ -1,11 +0,0 @@
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
import { IStringArrayScopeCallsWrapperData } from '../../node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
import { IMapStorage } from '../IMapStorage';
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface IStringArrayScopeCallsWrapperDataStorage extends IMapStorage<
TNodeWithLexicalScopeStatements,
IStringArrayScopeCallsWrapperData
> {}
@@ -0,0 +1,10 @@
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
import { IMapStorage } from '../IMapStorage';
import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface IStringArrayScopeCallsWrapperLexicalScopeDataStorage extends IMapStorage<
TNodeWithLexicalScopeStatements,
IStringArrayScopeCallsWrapperLexicalScopeData
> {}
@@ -0,0 +1,10 @@
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
> {}
@@ -5,28 +5,30 @@ import * as ESTree from 'estree';
import { TInitialData } from '../../types/TInitialData';
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
import { TStatement } from '../../types/node/TStatement';
import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
import { TStringArrayTransformerCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayTransformerCustomNodeFactory';
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 { IStringArrayScopeCallsWrapperDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
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';
import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
import { StringArrayTransformerCustomNode } from '../../enums/custom-nodes/StringArrayTransformerCustomNode';
import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
import { NodeAppender } from '../../node/NodeAppender';
import { NodeGuards } from '../../node/NodeGuards';
import { StringArrayScopeCallsWrapperVariableNode } from '../../custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperVariableNode';
import { TStatement } from '../../types/node/TStatement';
import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
import { StringArrayScopeCallsWrapperFunctionNode } from '../../custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode';
@injectable()
@@ -37,9 +39,14 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
private readonly stringArrayStorage: IStringArrayStorage;
/**
* @type {IStringArrayScopeCallsWrapperDataStorage}
* @type {IStringArrayScopeCallsWrapperLexicalScopeDataStorage}
*/
private readonly stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage;
private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
/**
* @type {IStringArrayScopeCallsWrapperNamesDataStorage}
*/
private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
/**
* @type {TStringArrayTransformerCustomNodeFactory}
@@ -56,7 +63,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
* @param {IOptions} options
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
* @param {IStringArrayStorage} stringArrayStorage
* @param {IStringArrayScopeCallsWrapperDataStorage} stringArrayScopeCallsWrapperDataStorage
* @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
* @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
* @param {TStringArrayTransformerCustomNodeFactory} stringArrayTransformerCustomNodeFactory
*/
public constructor (
@@ -64,7 +72,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
@inject(ServiceIdentifiers.IOptions) options: IOptions,
@inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperDataStorage) stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage,
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage) stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage) stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
@inject(ServiceIdentifiers.Factory__IStringArrayTransformerCustomNode)
stringArrayTransformerCustomNodeFactory: TStringArrayTransformerCustomNodeFactory
) {
@@ -72,7 +81,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
this.stringArrayStorage = stringArrayStorage;
this.stringArrayScopeCallsWrapperDataStorage = stringArrayScopeCallsWrapperDataStorage;
this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
}
@@ -114,18 +124,20 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
public transformNode (
lexicalScopeBodyNode: TNodeWithLexicalScopeStatements
): TNodeWithLexicalScopeStatements {
const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData | null =
this.stringArrayScopeCallsWrapperDataStorage.get(lexicalScopeBodyNode) ?? null;
const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null =
this.stringArrayScopeCallsWrapperNamesDataStorage.get(lexicalScopeBodyNode) ?? null;
const stringArrayScopeCallsWrapperNamesLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(lexicalScopeBodyNode) ?? null;
if (!stringArrayScopeCallsWrapperData) {
if (!stringArrayScopeCallsWrapperNamesDataByEncoding || !stringArrayScopeCallsWrapperNamesLexicalScopeData) {
return lexicalScopeBodyNode;
}
const indexShift: number = this.options.stringArrayWrappersChainedCalls
? stringArrayScopeCallsWrapperData.scopeIndexShift
: stringArrayScopeCallsWrapperData.globalIndexShift;
const stringArrayScopeCallsWrapperNamesDataList: (IStringArrayScopeCallsWrapperNamesData | undefined)[] =
Object.values(stringArrayScopeCallsWrapperData.names);
Object.values(stringArrayScopeCallsWrapperNamesDataByEncoding);
const stringArrayScopeCallsWrapperShiftedIndex: number = this.options.stringArrayWrappersChainedCalls
? stringArrayScopeCallsWrapperNamesLexicalScopeData.scopeShiftedIndex
: stringArrayScopeCallsWrapperNamesLexicalScopeData.resultShiftedIndex;
// iterates over data for each encoding type
for (const stringArrayScopeCallsWrapperNamesData of stringArrayScopeCallsWrapperNamesDataList) {
@@ -147,7 +159,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
const stringArrayScopeCallsWrapperNode: TStatement[] = this.getStringArrayScopeCallsWrapperNode(
stringArrayScopeCallsWrapperName,
upperStringArrayCallsWrapperName,
indexShift
stringArrayScopeCallsWrapperShiftedIndex
);
NodeAppender.prepend(
@@ -186,9 +198,9 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
return rootStringArrayCallsWrapperName;
}
const parentLexicalScopeData: IStringArrayScopeCallsWrapperData | null = this.stringArrayScopeCallsWrapperDataStorage
const parentLexicalScopeNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null = this.stringArrayScopeCallsWrapperNamesDataStorage
.get(parentLexicalScopeBodyNode) ?? null;
const parentLexicalScopeNames: string[] | null = parentLexicalScopeData?.names[encoding]?.names ?? null;
const parentLexicalScopeNames: string[] | null = parentLexicalScopeNamesDataByEncoding?.[encoding]?.names ?? null;
return parentLexicalScopeNames?.length
? this.randomGenerator
@@ -200,20 +212,20 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
/**
* @param {string} stringArrayScopeCallsWrapperName
* @param {string} upperStringArrayCallsWrapperName
* @param {number} indexShift
* @param {number} stringArrayScopeCallsWrapperShiftedIndex
* @returns {TStatement[]}
*/
private getStringArrayScopeCallsWrapperNode (
stringArrayScopeCallsWrapperName: string,
upperStringArrayCallsWrapperName: string,
indexShift: number
stringArrayScopeCallsWrapperShiftedIndex: number
): TStatement[] {
switch (this.options.stringArrayWrappersType) {
case StringArrayWrappersType.Function:
return this.getStringArrayScopeCallsWrapperFunctionNode(
stringArrayScopeCallsWrapperName,
upperStringArrayCallsWrapperName,
indexShift
stringArrayScopeCallsWrapperShiftedIndex
);
case StringArrayWrappersType.Variable:
@@ -250,13 +262,13 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
/**
* @param {string} stringArrayScopeCallsWrapperName
* @param {string} upperStringArrayCallsWrapperName
* @param {number} indexShift
* @param {number} stringArrayScopeCallsWrapperShiftedIndex
* @returns {TStatement[]}
*/
private getStringArrayScopeCallsWrapperFunctionNode (
stringArrayScopeCallsWrapperName: string,
upperStringArrayCallsWrapperName: string,
indexShift: number
stringArrayScopeCallsWrapperShiftedIndex: number
): TStatement[] {
const stringArrayScopeCallsWrapperFunctionNode: ICustomNode<TInitialData<StringArrayScopeCallsWrapperFunctionNode>> =
this.stringArrayTransformerCustomNodeFactory(
@@ -266,7 +278,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
stringArrayScopeCallsWrapperFunctionNode.initialize(
stringArrayScopeCallsWrapperName,
upperStringArrayCallsWrapperName,
indexShift
stringArrayScopeCallsWrapperShiftedIndex
);
return stringArrayScopeCallsWrapperFunctionNode.getNode();
@@ -3,21 +3,22 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
import * as ESTree from 'estree';
import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory';
import { TInitialData } from '../../types/TInitialData';
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
import { TStatement } from '../../types/node/TStatement';
import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
import { TStringArrayTransformerCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayTransformerCustomNodeFactory';
import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
import { IEscapeSequenceEncoder } from '../../interfaces/utils/IEscapeSequenceEncoder';
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 { IOptions } from '../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
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 { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
import { IStringArrayStorageItemData } from '../../interfaces/storages/string-array-transformers/IStringArrayStorageItem';
@@ -74,9 +75,14 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
private readonly stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer;
/**
* @type {IStringArrayScopeCallsWrapperDataStorage}
* @type {IStringArrayScopeCallsWrapperLexicalScopeDataStorage}
*/
private readonly stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage;
private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
/**
* @type {IStringArrayScopeCallsWrapperNamesDataStorage}
*/
private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
/**
* @type {TStringArrayTransformerCustomNodeFactory}
@@ -95,7 +101,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
* @param {ILiteralNodesCacheStorage} literalNodesCacheStorage
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
* @param {IStringArrayStorage} stringArrayStorage
* @param {IStringArrayScopeCallsWrapperDataStorage} stringArrayScopeCallsWrapperDataStorage
* @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
* @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
* @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
* @param {TStringArrayTransformerCustomNodeFactory} stringArrayTransformerCustomNodeFactory
@@ -107,7 +114,10 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
@inject(ServiceIdentifiers.ILiteralNodesCacheStorage) literalNodesCacheStorage: ILiteralNodesCacheStorage,
@inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
@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.Factory__IIdentifierNamesGenerator)
identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
@@ -120,7 +130,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
this.literalNodesCacheStorage = literalNodesCacheStorage;
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
this.stringArrayStorage = stringArrayStorage;
this.stringArrayScopeCallsWrapperDataStorage = stringArrayScopeCallsWrapperDataStorage;
this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer;
this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
@@ -219,23 +230,13 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
* @returns {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;
// todo: refactor this
const lastElement: TNodeWithLexicalScopeStatements | null =
this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData | null = lastElement
? this.stringArrayScopeCallsWrapperDataStorage.get(lastElement) ?? null
: null;
const resultIndex: number = stringArrayScopeCallsWrapperData
? stringArrayScopeCallsWrapperData.globalIndexShift + index
: index;
const stringArrayCallCustomNode: ICustomNode<TInitialData<StringArrayCallNode>> =
this.stringArrayTransformerCustomNodeFactory(StringArrayTransformerCustomNode.StringArrayCallNode);
stringArrayCallCustomNode.initialize(stringArrayCallsWrapperName, resultIndex, decodeKey);
stringArrayCallCustomNode.initialize(stringArrayCallsWrapperName, index, decodeKey);
const statementNode: TStatement = stringArrayCallCustomNode.getNode()[0];
@@ -248,30 +249,41 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
/**
* @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
? 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 {
private getUpperStringArrayCallsWrapperData (
stringArrayStorageItemData: IStringArrayStorageItemData
): [name: string, index: number] {
const {encoding, index} = stringArrayStorageItemData;
const currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
const parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
@@ -281,57 +293,115 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
throw new Error('Cannot find current lexical scope body node');
}
const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData =
this.stringArrayScopeCallsWrapperDataStorage.get(currentLexicalScopeBodyNode)
?? this.initializeStringArrayScopeCallsWrapperData(parentLexicalScopeBodyNode);
const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperData.names[encoding]?.names ?? [];
const isFilledScopeCallsWrapperNamesList: boolean = stringArrayScopeCallsWrapperNames.length === this.options.stringArrayWrappersCount;
if (!isFilledScopeCallsWrapperNamesList) {
const nextScopeCallsWrapperName: string = this.identifierNamesGenerator.generateNext();
stringArrayScopeCallsWrapperNames.push(nextScopeCallsWrapperName);
stringArrayScopeCallsWrapperData.names[encoding] = {
encoding,
names: stringArrayScopeCallsWrapperNames
};
this.stringArrayScopeCallsWrapperDataStorage.set(
const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
this.getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding(
currentLexicalScopeBodyNode,
stringArrayScopeCallsWrapperData
stringArrayStorageItemData
);
const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData =
this.getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData(
currentLexicalScopeBodyNode,
parentLexicalScopeBodyNode
);
}
return this.randomGenerator.getRandomGenerator().pickone(stringArrayScopeCallsWrapperNames);
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 | null} parentLexicalScopeBodyNode
* @returns {IStringArrayScopeCallsWrapperData}
* @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
* @returns {TStringArrayScopeCallsWrapperNamesDataByEncoding}
*/
private initializeStringArrayScopeCallsWrapperData (
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;
}
const nextScopeCallsWrapperName: string = this.identifierNamesGenerator.generateNext();
stringArrayScopeCallsWrapperNamesDataByEncoding[encoding] = {
encoding,
names: [
...stringArrayScopeCallsWrapperNames,
nextScopeCallsWrapperName
]
};
this.stringArrayScopeCallsWrapperNamesDataStorage.set(
currentLexicalScopeBodyNode,
stringArrayScopeCallsWrapperNamesDataByEncoding
);
return stringArrayScopeCallsWrapperNamesDataByEncoding;
}
/**
* @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
* @param {TNodeWithLexicalScopeStatements | null} parentLexicalScopeBodyNode
* @returns {IStringArrayScopeCallsWrapperLexicalScopeData}
* @private
*/
private getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData (
currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null
): IStringArrayScopeCallsWrapperData {
const parentStringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData | null = parentLexicalScopeBodyNode
? this.stringArrayScopeCallsWrapperDataStorage.get(parentLexicalScopeBodyNode) ?? null
): IStringArrayScopeCallsWrapperLexicalScopeData {
const storedLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(currentLexicalScopeBodyNode)
?? null;
if (storedLexicalScopeData) {
return storedLexicalScopeData;
}
const parentLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null = parentLexicalScopeBodyNode
? this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(parentLexicalScopeBodyNode) ?? null
: null;
const scopeIndexShift: number = this.options.stringArrayWrappersType === StringArrayWrappersType.Function
const scopeShiftedIndex: number = this.options.stringArrayWrappersType === StringArrayWrappersType.Function
? this.randomGenerator.getRandomInteger(
StringArrayTransformer.minShiftedIndexValue,
StringArrayTransformer.maxShiftedIndexValue
)
: 0;
const globalIndexShift: number = parentStringArrayScopeCallsWrapperData
? parentStringArrayScopeCallsWrapperData.globalIndexShift + scopeIndexShift
: scopeIndexShift;
const resultShiftedIndex: number = parentLexicalScopeData
? parentLexicalScopeData.resultShiftedIndex + scopeShiftedIndex
: scopeShiftedIndex;
return {
globalIndexShift,
scopeIndexShift,
names: {},
parentLexicalScopeNode: parentLexicalScopeBodyNode ?? null
const lexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData = {
parentLexicalScopeBodyNode,
resultShiftedIndex,
scopeShiftedIndex
};
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.set(
currentLexicalScopeBodyNode,
lexicalScopeData
);
return lexicalScopeData;
}
/**
@@ -0,0 +1,28 @@
import { inject, injectable } from 'inversify';
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
import { IOptions } from '../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
import { MapStorage } from '../MapStorage';
@injectable()
export class StringArrayScopeCallsWrapperLexicalScopeDataStorage extends MapStorage <
TNodeWithLexicalScopeStatements,
IStringArrayScopeCallsWrapperLexicalScopeData
> implements IStringArrayScopeCallsWrapperLexicalScopeDataStorage {
/**
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
public constructor (
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
@inject(ServiceIdentifiers.IOptions) options: IOptions
) {
super(randomGenerator, options);
}
}
@@ -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 { IOptions } from '../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
import { IStringArrayScopeCallsWrapperDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
import { MapStorage } from '../MapStorage';
@injectable()
export class StringArrayScopeCallsWrapperDataStorage extends MapStorage <
export class StringArrayScopeCallsWrapperNamesDataStorage extends MapStorage <
TNodeWithLexicalScopeStatements,
IStringArrayScopeCallsWrapperData
> implements IStringArrayScopeCallsWrapperDataStorage {
TStringArrayScopeCallsWrapperNamesDataByEncoding
> implements IStringArrayScopeCallsWrapperNamesDataStorage {
/**
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options