|
1 | 1 | import { |
| 2 | + ImplicitReceiver, |
2 | 3 | type KeyedRead, |
3 | 4 | type PropertyRead, |
4 | 5 | type SafeKeyedRead, |
@@ -42,53 +43,57 @@ const transformMemberExpression = |
42 | 43 | computed, |
43 | 44 | optional, |
44 | 45 | }: Visitor['options']) => |
45 | | - (node: Visitor['node'], transformer: Transformer) => { |
46 | | - const object = transformer.transformChild<babel.Expression>(node.receiver); |
| 46 | + ( |
| 47 | + node: Visitor['node'], |
| 48 | + transformer: Transformer, |
| 49 | + ): |
| 50 | + | babel.OptionalMemberExpression |
| 51 | + | babel.MemberExpression |
| 52 | + | babel.Identifier => { |
| 53 | + const { receiver } = node; |
47 | 54 |
|
48 | 55 | let property; |
49 | 56 | if (computed) { |
50 | 57 | const { key } = node as KeyedRead | SafeKeyedRead; |
51 | 58 | property = transformer.transformChild<babel.Expression>(key); |
52 | 59 | } else { |
| 60 | + const isImplicitReceiver = receiver instanceof ImplicitReceiver; |
53 | 61 | const { name, nameSpan } = node as PropertyRead | SafePropertyRead; |
54 | 62 | property = transformer.createNode<babel.Identifier>( |
55 | 63 | { type: 'Identifier', name: name }, |
56 | 64 | nameSpan, |
57 | | - object ? [] : transformer.ancestors, |
| 65 | + isImplicitReceiver ? transformer.ancestors : [], |
58 | 66 | ); |
59 | | - } |
60 | 67 |
|
61 | | - if (!object) { |
62 | | - return property; |
| 68 | + if (isImplicitReceiver) { |
| 69 | + return property; |
| 70 | + } |
63 | 71 | } |
64 | 72 |
|
| 73 | + const object = transformer.transformChild<babel.Expression>(receiver); |
| 74 | + |
65 | 75 | const isOptionalObject = isOptionalObjectOrCallee(object); |
66 | 76 |
|
67 | 77 | if (optional || isOptionalObject) { |
68 | | - return transformer.createNode<babel.OptionalMemberExpression>({ |
| 78 | + return { |
69 | 79 | type: 'OptionalMemberExpression', |
70 | 80 | optional: optional || !isOptionalObject, |
71 | 81 | computed, |
72 | 82 | property, |
73 | 83 | object, |
74 | | - }); |
| 84 | + }; |
75 | 85 | } |
76 | 86 |
|
77 | 87 | if (computed) { |
78 | | - return transformer.createNode<babel.MemberExpressionComputed>({ |
79 | | - type: 'MemberExpression', |
80 | | - property, |
81 | | - object, |
82 | | - computed: true, |
83 | | - }); |
| 88 | + return { type: 'MemberExpression', property, object, computed: true }; |
84 | 89 | } |
85 | 90 |
|
86 | | - return transformer.createNode<babel.MemberExpressionNonComputed>({ |
| 91 | + return { |
87 | 92 | type: 'MemberExpression', |
88 | 93 | object, |
89 | 94 | property: property as babel.MemberExpressionNonComputed['property'], |
90 | 95 | computed: false, |
91 | | - }); |
| 96 | + }; |
92 | 97 | }; |
93 | 98 |
|
94 | 99 | export const visitKeyedRead = |
|
0 commit comments