* stringArrayWrappersType: 'function' now appends FunctionDeclaration functions instead of FunctionExpression functions. This allows to append these wrappers at random positions inside each scope

This commit is contained in:
sanex
2021-07-15 21:24:44 +03:00
parent 985cb7e0ba
commit 3a71c78304
10 changed files with 243 additions and 121 deletions
@@ -165,8 +165,9 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
decodeKeyIdentifierNode
);
// stage 3: function expression node
const functionExpressionNode: ESTree.FunctionExpression = NodeFactory.functionExpressionNode(
// stage 3: function declaration node
const functionDeclarationNode: ESTree.FunctionDeclaration = NodeFactory.functionDeclarationNode(
this.stringArrayScopeCallsWrapperName,
parameters,
NodeFactory.blockStatementNode([
NodeFactory.returnStatementNode(
@@ -178,22 +179,14 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
])
);
const structure: TStatement = NodeFactory.variableDeclarationNode(
[
NodeFactory.variableDeclaratorNode(
NodeFactory.identifierNode(this.stringArrayScopeCallsWrapperName),
functionExpressionNode
)
],
'const',
);
const structure: TStatement = functionDeclarationNode;
NodeUtils.parentizeAst(structure);
// stage 4: rename
// have to generate names for both parameter and call identifiers
for (const parameter of parameters) {
parameter.name = this.identifierNamesGenerator.generateForLexicalScope(functionExpressionNode);
parameter.name = this.identifierNamesGenerator.generateForLexicalScope(functionDeclarationNode);
}
return [structure];
@@ -172,17 +172,13 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
stringArrayScopeCallsWrapperLexicalScopeData,
);
const stringArrayScopeCallsWrapperNode: TStatement[] = this.getStringArrayScopeCallsWrapperNode(
this.getAndAppendStringArrayScopeCallsWrapperNode(
lexicalScopeBodyNode,
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
upperStringArrayCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperShiftedIndex
);
NodeAppender.prepend(
lexicalScopeBodyNode,
stringArrayScopeCallsWrapperNode
upperStringArrayCallsWrapperShiftedIndex,
);
}
}
@@ -263,23 +259,31 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
}
/**
* @param {TNodeWithLexicalScopeStatements} lexicalScopeBodyNode
* @param {string} stringArrayScopeCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexes
* @param {string} upperStringArrayCallsWrapperName
* @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexes
* @param {number} stringArrayScopeCallsWrapperShiftedIndex
* @returns {TStatement[]}
*/
private getStringArrayScopeCallsWrapperNode (
private getAndAppendStringArrayScopeCallsWrapperNode (
lexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
stringArrayScopeCallsWrapperName: string,
stringArrayScopeCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
upperStringArrayCallsWrapperName: string,
upperStringArrayCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
stringArrayScopeCallsWrapperShiftedIndex: number
): TStatement[] {
): void {
let stringArrayScopeCallsWrapperNode: TStatement[];
switch (this.options.stringArrayWrappersType) {
case StringArrayWrappersType.Function:
return this.getStringArrayScopeCallsWrapperFunctionNode(
case StringArrayWrappersType.Function: {
const randomIndex: number = this.randomGenerator.getRandomInteger(
0,
lexicalScopeBodyNode.body.length - 1
);
stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperFunctionNode(
stringArrayScopeCallsWrapperName,
stringArrayScopeCallsWrapperParameterIndexes,
upperStringArrayCallsWrapperName,
@@ -287,12 +291,27 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
stringArrayScopeCallsWrapperShiftedIndex
);
NodeAppender.insertAtIndex(
lexicalScopeBodyNode,
stringArrayScopeCallsWrapperNode,
randomIndex
);
break;
}
case StringArrayWrappersType.Variable:
default:
return this.getStringArrayScopeCallsWrapperVariableNode(
default: {
stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperVariableNode(
stringArrayScopeCallsWrapperName,
upperStringArrayCallsWrapperName
);
NodeAppender.prepend(
lexicalScopeBodyNode,
stringArrayScopeCallsWrapperNode
);
}
}
}