Browse Source

transformers as visitor: refactoring

sanex3339 8 years ago
parent
commit
f953680ab4

+ 5 - 1
dist/index.js

@@ -2568,7 +2568,11 @@ var Obfuscator = Obfuscator_1 = function () {
                     for (var _iterator = (0, _getIterator3.default)(visitors), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
                         var visitor = _step.value;
 
-                        var visitorResult = visitor[direction](node, parentNode);
+                        var visitorFunction = visitor[direction];
+                        if (!visitorFunction) {
+                            continue;
+                        }
+                        var visitorResult = visitorFunction(node, parentNode);
                         if (!visitorResult) {
                             continue;
                         }

+ 9 - 5
src/Obfuscator.ts

@@ -6,6 +6,7 @@ import * as ESTree from 'estree';
 
 import { TNodeTransformersFactory } from './types/container/TNodeTransformersFactory';
 import { TVisitorDirection } from './types/TVisitorDirection';
+import { TVisitorFunction } from './types/TVisitorFunction';
 
 import { ICustomNodeGroup } from './interfaces/custom-nodes/ICustomNodeGroup';
 import { IObfuscationEventEmitter } from './interfaces/event-emitters/IObfuscationEventEmitter';
@@ -183,17 +184,20 @@ export class Obfuscator implements IObfuscator {
      * @param direction
      * @return {estraverse.Visitor | null}
      */
-    private mergeVisitorsForDirection (
-        visitors: estraverse.Visitor[],
-        direction: TVisitorDirection
-    ): estraverse.Visitor | null {
+    private mergeVisitorsForDirection (visitors: estraverse.Visitor[], direction: TVisitorDirection): TVisitorFunction | null {
         if (!visitors.length) {
             return null;
         }
 
         return (node: ESTree.Node, parentNode: ESTree.Node) => {
             for (const visitor of visitors) {
-                const visitorResult: estraverse.VisitorOption | ESTree.Node | void = visitor[direction]!(node, parentNode);
+                const visitorFunction: TVisitorFunction | undefined = visitor[direction];
+
+                if (!visitorFunction) {
+                    continue;
+                }
+
+                const visitorResult: estraverse.VisitorOption | ESTree.Node | void = visitorFunction(node, parentNode);
 
                 if (!visitorResult) {
                     continue;

+ 8 - 0
src/interfaces/node-transformers/INodeTransformer.d.ts

@@ -1,8 +1,16 @@
 import * as estraverse from 'estraverse';
+import * as ESTree from 'estree';
 
 export interface INodeTransformer {
     /**
      * @returns {estraverse.Visitor}
      */
     getVisitor (): estraverse.Visitor;
+
+    /**
+     * @param node
+     * @param parentNode
+     * @returns {ESTree.Node}
+     */
+    transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node;
 }

+ 8 - 0
src/node-transformers/AbstractNodeTransformer.ts

@@ -2,6 +2,7 @@ import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
 
 import * as estraverse from 'estraverse';
+import * as ESTree from 'estree';
 
 import { INodeTransformer } from '../interfaces/node-transformers/INodeTransformer';
 import { IOptions } from '../interfaces/options/IOptions';
@@ -33,4 +34,11 @@ export abstract class AbstractNodeTransformer implements INodeTransformer {
      * @returns {estraverse.Visitor}
      */
     public abstract getVisitor (): estraverse.Visitor;
+
+    /**
+     * @param node
+     * @param parentNode
+     * @returns {ESTree.Node}
+     */
+    public abstract transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node;
 }

+ 1 - 1
src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts

@@ -68,7 +68,7 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (blockStatementNode: ESTree.BlockStatement, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (blockStatementNode: ESTree.BlockStatement, parentNode: ESTree.Node): ESTree.Node {
         if (
             RandomGeneratorUtils.getRandomFloat(0, 1) > this.options.controlFlowFlatteningThreshold ||
             BlockStatementControlFlowTransformer.blockStatementHasProhibitedStatements(blockStatementNode)

+ 1 - 1
src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts

@@ -130,7 +130,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (functionNode: ESTree.Function, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (functionNode: ESTree.Function, parentNode: ESTree.Node): ESTree.Node {
         if (Node.isArrowFunctionExpressionNode(functionNode)) {
             return functionNode;
         }

+ 1 - 1
src/node-transformers/converting-transformers/MemberExpressionTransformer.ts

@@ -51,7 +51,7 @@ export class MemberExpressionTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (memberExpressionNode: ESTree.MemberExpression, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (memberExpressionNode: ESTree.MemberExpression, parentNode: ESTree.Node): ESTree.Node {
         if (Node.isIdentifierNode(memberExpressionNode.property)) {
             if (memberExpressionNode.computed) {
                 return memberExpressionNode;

+ 1 - 1
src/node-transformers/converting-transformers/MethodDefinitionTransformer.ts

@@ -64,7 +64,7 @@ export class MethodDefinitionTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (methodDefinitionNode: ESTree.MethodDefinition, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (methodDefinitionNode: ESTree.MethodDefinition, parentNode: ESTree.Node): ESTree.Node {
         if (
             Node.isIdentifierNode(methodDefinitionNode.key) &&
             !MethodDefinitionTransformer.ignoredNames.includes(methodDefinitionNode.key.name) &&

+ 1 - 1
src/node-transformers/converting-transformers/TemplateLiteralTransformer.ts

@@ -51,7 +51,7 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (templateLiteralNode: ESTree.TemplateLiteral, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (templateLiteralNode: ESTree.TemplateLiteral, parentNode: ESTree.Node): ESTree.Node {
         const templateLiteralExpressions: ESTree.Expression[] = templateLiteralNode.expressions;
 
         let nodes: (ESTree.Literal | ESTree.Expression)[] = [];

+ 1 - 1
src/node-transformers/obfuscating-transformers/CatchClauseTransformer.ts

@@ -59,7 +59,7 @@ export class CatchClauseTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (catchClauseNode: ESTree.CatchClause, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (catchClauseNode: ESTree.CatchClause, parentNode: ESTree.Node): ESTree.Node {
         const nodeIdentifier: number = this.nodeIdentifier++;
 
         this.storeCatchClauseParam(catchClauseNode, nodeIdentifier);

+ 1 - 1
src/node-transformers/obfuscating-transformers/FunctionDeclarationTransformer.ts

@@ -69,7 +69,7 @@ export class FunctionDeclarationTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (functionDeclarationNode: ESTree.FunctionDeclaration, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (functionDeclarationNode: ESTree.FunctionDeclaration, parentNode: ESTree.Node): ESTree.Node {
         const nodeIdentifier: number = this.nodeIdentifier++;
         const blockScopeOfFunctionDeclarationNode: TNodeWithBlockStatement = NodeUtils
             .getBlockScopesOfNode(functionDeclarationNode)[0];

+ 1 - 1
src/node-transformers/obfuscating-transformers/FunctionTransformer.ts

@@ -63,7 +63,7 @@ export class FunctionTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (functionNode: ESTree.Function, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (functionNode: ESTree.Function, parentNode: ESTree.Node): ESTree.Node {
         const nodeIdentifier: number = this.nodeIdentifier++;
 
         this.storeFunctionParams(functionNode, nodeIdentifier);

+ 1 - 1
src/node-transformers/obfuscating-transformers/LabeledStatementTransformer.ts

@@ -67,7 +67,7 @@ export class LabeledStatementTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (labeledStatementNode: ESTree.LabeledStatement, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (labeledStatementNode: ESTree.LabeledStatement, parentNode: ESTree.Node): ESTree.Node {
         const nodeIdentifier: number = this.nodeIdentifier++;
 
         this.storeLabeledStatementName(labeledStatementNode, nodeIdentifier);

+ 1 - 1
src/node-transformers/obfuscating-transformers/LiteralTransformer.ts

@@ -51,7 +51,7 @@ export class LiteralTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (literalNode: ESTree.Literal, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (literalNode: ESTree.Literal, parentNode: ESTree.Node): ESTree.Node {
         if (Node.isPropertyNode(parentNode) && parentNode.key === literalNode) {
             return literalNode;
         }

+ 1 - 1
src/node-transformers/obfuscating-transformers/ObjectExpressionTransformer.ts

@@ -83,7 +83,7 @@ export class ObjectExpressionTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (objectExpressionNode: ESTree.ObjectExpression, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (objectExpressionNode: ESTree.ObjectExpression, parentNode: ESTree.Node): ESTree.Node {
         objectExpressionNode.properties
             .forEach((property: ESTree.Property) => {
                 if (property.shorthand) {

+ 1 - 1
src/node-transformers/obfuscating-transformers/VariableDeclarationTransformer.ts

@@ -70,7 +70,7 @@ export class VariableDeclarationTransformer extends AbstractNodeTransformer {
      * @param parentNode
      * @returns {ESTree.Node}
      */
-    private transformNode (variableDeclarationNode: ESTree.VariableDeclaration, parentNode: ESTree.Node): ESTree.Node {
+    public transformNode (variableDeclarationNode: ESTree.VariableDeclaration, parentNode: ESTree.Node): ESTree.Node {
         const blockScopeOfVariableDeclarationNode: TNodeWithBlockStatement = NodeUtils
             .getBlockScopesOfNode(variableDeclarationNode)[0];
 

+ 4 - 0
src/types/TVisitorFunction.d.ts

@@ -0,0 +1,4 @@
+import * as estraverse from 'estraverse';
+import * as ESTree from 'estree';
+
+export type TVisitorFunction = (node: ESTree.Node, parentNode: ESTree.Node | null) => estraverse.VisitorOption | ESTree.Node | void;