/
computed-property-get.ts
61 lines (46 loc) · 2.07 KB
/
computed-property-get.ts
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
// -------------------------------------------------------------
// WARNING: this file is used by both the client and the server.
// Do not use any browser or node-specific API!
// -------------------------------------------------------------
import { MemberExpression, Expression } from 'estree';
import { Transformer } from './index';
import { createComputedPropertyGetWrapper } from '../node-builder';
import { Syntax } from 'esotope-hammerhead';
import { shouldInstrumentProperty } from '../instrumented';
// Transform:
// obj[prop] -->
// __get$(obj, prop)
const transformer: Transformer<MemberExpression> = {
nodeReplacementRequireTransform: true,
nodeTypes: Syntax.MemberExpression,
condition: (node, parent) => {
if (!node.computed || !parent)
return false;
if (node.property.type === Syntax.Literal && !shouldInstrumentProperty(node.property.value))
return false;
// super[prop]
if (node.object.type === Syntax.Super)
return false;
// object[prop] = value
if (parent.type === Syntax.AssignmentExpression && parent.left === node)
return false;
// delete object[prop]
if (parent.type === Syntax.UnaryExpression && parent.operator === 'delete')
return false;
// object[prop]++ || object[prop]-- || ++object[prop] || --object[prop]
if (parent.type === Syntax.UpdateExpression && (parent.operator === '++' || parent.operator === '--'))
return false;
// object[prop]()
if (parent.type === Syntax.CallExpression && parent.callee === node)
return false;
// new (object[prop])() || new (object[prop])
if (parent.type === Syntax.NewExpression && parent.callee === node)
return false;
// for(object[prop] in source)
if (parent.type === Syntax.ForInStatement && parent.left === node)
return false;
return true;
},
run: node => createComputedPropertyGetWrapper(node.property, node.object as Expression, node.optional)
};
export default transformer;