forked from javascript-obfuscator/javascript-obfuscator
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNumericalExpressionDataToNodeConverter.ts
More file actions
155 lines (141 loc) · 6.31 KB
/
Copy pathNumericalExpressionDataToNodeConverter.ts
File metadata and controls
155 lines (141 loc) · 6.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import * as ESTree from 'estree';
import { TNumericalExpressionDataToNodeConverterLiteralNodeGetter } from '../types/node/TNumericalExpressionDataToNodeConverterLiteralNodeGetter';
import { TNumberNumericalExpressionData } from '../types/analyzers/number-numerical-expression-analyzer/TNumberNumericalExpressionData';
import { NodeFactory } from './NodeFactory';
import { NumberUtils } from '../utils/NumberUtils';
/**
* Converts NumberNumericalExpressionData to node
*/
export class NumericalExpressionDataToNodeConverter {
/**
* @param {TNumberNumericalExpressionData} numberNumericalExpressionData
* @param {TNumericalExpressionDataToNodeConverterLiteralNodeGetter} literalNodeGetter
* @returns {Expression}
*/
public static convertIntegerNumberData (
numberNumericalExpressionData: TNumberNumericalExpressionData,
literalNodeGetter: TNumericalExpressionDataToNodeConverterLiteralNodeGetter
): ESTree.Expression {
return NumericalExpressionDataToNodeConverter.convertNumericalExpressionDataToNode(
numberNumericalExpressionData,
literalNodeGetter
);
}
/**
* @param {TNumberNumericalExpressionData} integerNumberNumericalExpressionData
* @param {number} decimalPart
* @param {TNumericalExpressionDataToNodeConverterLiteralNodeGetter} literalNodeGetter
* @returns {Expression}
*/
public static convertFloatNumberData (
integerNumberNumericalExpressionData: TNumberNumericalExpressionData,
decimalPart: number,
literalNodeGetter: TNumericalExpressionDataToNodeConverterLiteralNodeGetter
): ESTree.Expression {
const integerNumberNumericalExpressionNode: ESTree.Expression = NumericalExpressionDataToNodeConverter
.convertNumericalExpressionDataToNode(
integerNumberNumericalExpressionData,
literalNodeGetter
);
return NodeFactory.binaryExpressionNode(
'+',
integerNumberNumericalExpressionNode,
NodeFactory.literalNode(decimalPart)
);
}
/**
* @param {TNumberNumericalExpressionData} numberNumericalExpressionData
* @param {TNumericalExpressionDataToNodeConverterLiteralNodeGetter} literalNodeGetter
* @param {BinaryOperator} operator
* @returns {Expression}
*/
private static convertNumericalExpressionDataToNode (
numberNumericalExpressionData: TNumberNumericalExpressionData,
literalNodeGetter: TNumericalExpressionDataToNodeConverterLiteralNodeGetter,
operator: ESTree.BinaryOperator = '+'
): ESTree.Expression {
const numberNumericalExpressionDataLength: number = numberNumericalExpressionData.length;
const leftParts: TNumberNumericalExpressionData = numberNumericalExpressionDataLength > 1
? numberNumericalExpressionData.slice(0, numberNumericalExpressionDataLength - 1)
: [numberNumericalExpressionData[0]];
const rightParts: TNumberNumericalExpressionData = numberNumericalExpressionDataLength > 1
? numberNumericalExpressionData.slice(-1)
: [];
// trailing iterations
if (rightParts.length) {
return NumericalExpressionDataToNodeConverter
.convertPartsToBinaryExpression(operator, leftParts, rightParts, literalNodeGetter);
}
const firstLeftPartOrNumber: number | number[] | null = leftParts[0] ?? null;
// last iteration when only single left part is left
return Array.isArray(firstLeftPartOrNumber)
? NumericalExpressionDataToNodeConverter.convertNumericalExpressionDataToNode(
firstLeftPartOrNumber,
literalNodeGetter,
'*'
)
: NumericalExpressionDataToNodeConverter.convertPartOrNumberToLiteralNode(
firstLeftPartOrNumber,
literalNodeGetter
);
}
/**
* @param {BinaryOperator} operator
* @param {TNumberNumericalExpressionData} leftParts
* @param {TNumberNumericalExpressionData} rightParts
* @param {TNumericalExpressionDataToNodeConverterLiteralNodeGetter} literalNodeGetter
* @returns {BinaryExpression}
*/
private static convertPartsToBinaryExpression (
operator: ESTree.BinaryOperator,
leftParts: TNumberNumericalExpressionData,
rightParts: TNumberNumericalExpressionData,
literalNodeGetter: TNumericalExpressionDataToNodeConverterLiteralNodeGetter
): ESTree.BinaryExpression {
const rightPartOrNumber: number | number[] = rightParts[0];
if (Array.isArray(rightPartOrNumber)) {
// right part is array with multiply numbers
return NodeFactory.binaryExpressionNode(
operator,
NumericalExpressionDataToNodeConverter.convertNumericalExpressionDataToNode(
leftParts,
literalNodeGetter
),
NumericalExpressionDataToNodeConverter.convertNumericalExpressionDataToNode(
rightPartOrNumber,
literalNodeGetter,
'*'
)
);
} else {
// right part is number
return NodeFactory.binaryExpressionNode(
operator,
NumericalExpressionDataToNodeConverter.convertNumericalExpressionDataToNode(
leftParts,
literalNodeGetter
),
this.convertPartOrNumberToLiteralNode(
rightPartOrNumber,
literalNodeGetter
)
);
}
}
/**
* @param {number | number[]} partOrNumber
* @param {TNumericalExpressionDataToNodeConverterLiteralNodeGetter} literalNodeGetter
* @returns {Expression}
*/
private static convertPartOrNumberToLiteralNode (
partOrNumber: number | number[],
literalNodeGetter: TNumericalExpressionDataToNodeConverterLiteralNodeGetter
): ESTree.Expression {
const number: number = Array.isArray(partOrNumber)
? partOrNumber[0]
: partOrNumber;
const isPositiveNumber: boolean = NumberUtils.isPositive(number);
const absoluteNumber: number = Math.abs(number);
return literalNodeGetter(absoluteNumber, isPositiveNumber);
}
}