forked from microsoft/TypeScript
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathes2016.ts
More file actions
105 lines (98 loc) · 4.35 KB
/
es2016.ts
File metadata and controls
105 lines (98 loc) · 4.35 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
/*@internal*/
namespace ts {
export function transformES2016(context: TransformationContext) {
const {
factory,
hoistVariableDeclaration
} = context;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node: SourceFile) {
if (node.isDeclarationFile) {
return node;
}
return visitEachChild(node, visitor, context);
}
function visitor(node: Node): VisitResult<Node> {
if ((node.transformFlags & TransformFlags.ContainsES2016) === 0) {
return node;
}
switch (node.kind) {
case SyntaxKind.BinaryExpression:
return visitBinaryExpression(node as BinaryExpression);
default:
return visitEachChild(node, visitor, context);
}
}
function visitBinaryExpression(node: BinaryExpression): Expression {
switch (node.operatorToken.kind) {
case SyntaxKind.AsteriskAsteriskEqualsToken:
return visitExponentiationAssignmentExpression(node);
case SyntaxKind.AsteriskAsteriskToken:
return visitExponentiationExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitExponentiationAssignmentExpression(node: BinaryExpression) {
let target: Expression;
let value: Expression;
const left = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, visitor, isExpression);
if (isElementAccessExpression(left)) {
// Transforms `a[x] **= b` into `(_a = a)[_x = x] = Math.pow(_a[_x], b)`
const expressionTemp = factory.createTempVariable(hoistVariableDeclaration);
const argumentExpressionTemp = factory.createTempVariable(hoistVariableDeclaration);
target = setTextRange(
factory.createElementAccessExpression(
setTextRange(factory.createAssignment(expressionTemp, left.expression), left.expression),
setTextRange(factory.createAssignment(argumentExpressionTemp, left.argumentExpression), left.argumentExpression)
),
left
);
value = setTextRange(
factory.createElementAccessExpression(
expressionTemp,
argumentExpressionTemp
),
left
);
}
else if (isPropertyAccessExpression(left)) {
// Transforms `a.x **= b` into `(_a = a).x = Math.pow(_a.x, b)`
const expressionTemp = factory.createTempVariable(hoistVariableDeclaration);
target = setTextRange(
factory.createPropertyAccessExpression(
setTextRange(factory.createAssignment(expressionTemp, left.expression), left.expression),
left.name
),
left
);
value = setTextRange(
factory.createPropertyAccessExpression(
expressionTemp,
left.name
),
left
);
}
else {
// Transforms `a **= b` into `a = Math.pow(a, b)`
target = left;
value = left;
}
return setTextRange(
factory.createAssignment(
target,
setTextRange(factory.createGlobalMethodCall("Math", "pow", [value, right]), node)
),
node
);
}
function visitExponentiationExpression(node: BinaryExpression) {
// Transforms `a ** b` into `Math.pow(a, b)`
const left = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, visitor, isExpression);
return setTextRange(factory.createGlobalMethodCall("Math", "pow", [left, right]), node);
}
}
}