-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOPTIONAL_MEMBER_EXPR
More file actions
72 lines (45 loc) · 1.66 KB
/
OPTIONAL_MEMBER_EXPR
File metadata and controls
72 lines (45 loc) · 1.66 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
// OptionalMemberExpression: m.n.o?.p.q.r
// 1. collect nodes until optional node is found
nodes = [MemExpr(XX,r), Node(q), OptNode(XX,p)]
// 2. Handle Parent Node
pNode = nodes.pop()
parent$res = JS3OptionalMemberExpression(pNode, handleExpression(pNode.callee), CKE(pNode.prop))
// 3. Base Case 1: Optional node
if (nodes == []) return parent$res // Case return JS3OptionalMemberExpression
// 4. Base Case 2: Chain of length 1
else if (nodes.length === 1) {
let finNode = nodes.pop()
// 1. SPILL parent$res
// $> let parent$res$holder = ID?.p
// 2. SPILL JS3CheckedOptionalMemberExpression
// $> (parent$res$holder !== undefined) ? parent$res$holder[CKE(prop)] : undefined
}
// 4. Otherwise
else {
// 1. SPILL parent$res
// $> let parent$res$holder = ID?.p
// 2. SPILL context$res
// $> let context$res = parent$res$holder !== undefined
let N1 = nodes[1] // Second node, one minus the outermost
// Replace base case with ID
let temp = N1.callee
while(temp !== pNode) {
temp = N1.callee
}
temp.callee = parent$res$holder
// Transform nodes
// recursivelyTransformToNonOptional (OptionalCallExpression | OptionalMemberExpression) -> CallExpression | MemberExpression
// 3. if (context$res) {
// context$res = ...handleExpression(N1)
// }
// 4. SPILL JS3CheckedOptionalMemberExpression
// $> (parent$res$holder !== undefined) ? parent$res$holder[CKE(prop)] : undefined
}
let parentNodeRes = x?.p
let altContext = undefined
if (parentNodeRes) {
altContext = parentNodeRes.q
}
let b = (parentNodeRes !== undefined ? altContext.r() : undefined());
let m = { n: { get o() { console.log("o check") }, x: 10 } };
m.n.o?.();