18
18
19
19
import com .google .common .collect .Maps ;
20
20
import com .google .dart .compiler .backend .js .ast .JsExpression ;
21
- import com .google .dart .compiler .backend .js .ast .JsLiteral ;
22
21
import com .google .dart .compiler .backend .js .ast .JsName ;
23
- import com .google .dart .compiler .backend .js .ast .JsNameRef ;
24
22
import org .jetbrains .annotations .NotNull ;
25
23
import org .jetbrains .annotations .Nullable ;
26
- import org .jetbrains .jet .lang .descriptors .CallableDescriptor ;
27
- import org .jetbrains .jet .lang .descriptors .ClassOrNamespaceDescriptor ;
28
24
import org .jetbrains .jet .lang .descriptors .DeclarationDescriptor ;
29
25
import org .jetbrains .jet .lang .psi .JetExpression ;
30
- import org .jetbrains .jet .lang .resolve .calls .model .ResolvedCall ;
31
- import org .jetbrains .jet .lang .resolve .scopes .receivers .*;
32
- import org .jetbrains .jet .lang .resolve .scopes .receivers .ReceiverValue ;
33
- import org .jetbrains .jet .lang .resolve .scopes .receivers .ThisReceiver ;
34
26
35
- import java .util .Map ;
36
-
37
- import static org .jetbrains .k2js .translate .utils .JsDescriptorUtils .getDeclarationDescriptorForReceiver ;
38
- import static org .jetbrains .k2js .translate .utils .JsDescriptorUtils .getExpectedReceiverDescriptor ;
27
+ import java .util .*;
39
28
40
29
public class AliasingContext {
41
- private static final ThisAliasProvider EMPTY_THIS_ALIAS_PROVIDER = new ThisAliasProvider () {
42
- @ Nullable
30
+ private static final AliasingContext ROOT = new AliasingContext (null ) {
43
31
@ Override
44
- public JsNameRef get (@ NotNull DeclarationDescriptor descriptor ) {
45
- return null ;
46
- }
47
-
48
- @ Nullable
49
- @ Override
50
- public JsExpression get (@ NotNull ResolvedCall <?> call ) {
51
- ReceiverValue callThisObject = call .getThisObject ();
52
- return callThisObject .exists () && (callThisObject instanceof ClassReceiver || callThisObject instanceof ExtensionReceiver )
53
- ? JsLiteral .THIS
54
- : null ;
55
- }
56
- };
57
-
58
- private static final AliasingContext ROOT = new AliasingContext (null , EMPTY_THIS_ALIAS_PROVIDER ) {
59
- @ Override
60
- public JsName getAliasForDescriptor (@ NotNull DeclarationDescriptor descriptor ) {
32
+ public JsExpression getAliasForDescriptor (@ NotNull DeclarationDescriptor descriptor ) {
61
33
return null ;
62
34
}
63
35
@@ -68,114 +40,76 @@ public JsName getAliasForExpression(@NotNull JetExpression element) {
68
40
};
69
41
70
42
public static AliasingContext getCleanContext () {
71
- return new AliasingContext (ROOT , ROOT . thisAliasProvider );
43
+ return new AliasingContext (ROOT );
72
44
}
73
45
74
- @ NotNull
75
- private final Map <DeclarationDescriptor , JsName > aliasesForDescriptors = Maps . newHashMap () ;
46
+ @ Nullable
47
+ private Map <DeclarationDescriptor , JsExpression > aliasesForDescriptors ;
76
48
77
- @ NotNull
78
- final ThisAliasProvider thisAliasProvider ;
79
49
@ NotNull
80
50
private final Map <JetExpression , JsName > aliasesForExpressions = Maps .newHashMap ();
81
51
82
52
@ Nullable
83
53
private final AliasingContext parent ;
84
54
85
- private AliasingContext (@ Nullable AliasingContext parent , @ NotNull ThisAliasProvider thisAliasProvider ) {
86
- this .parent = parent ;
87
- this .thisAliasProvider = thisAliasProvider ;
88
- }
89
-
90
- public interface ThisAliasProvider {
91
- @ Nullable
92
- JsNameRef get (@ NotNull DeclarationDescriptor descriptor );
93
- @ Nullable
94
- JsExpression get (@ NotNull ResolvedCall <?> call );
95
- }
96
-
97
- public abstract static class AbstractThisAliasProvider implements ThisAliasProvider {
98
- @ NotNull
99
- protected static DeclarationDescriptor normalize (@ NotNull DeclarationDescriptor descriptor ) {
100
- if (descriptor instanceof ClassOrNamespaceDescriptor ) {
101
- return descriptor ;
102
- }
103
- else if (descriptor instanceof CallableDescriptor ) {
104
- DeclarationDescriptor receiverDescriptor = getExpectedReceiverDescriptor ((CallableDescriptor ) descriptor );
105
- assert receiverDescriptor != null ;
106
- return receiverDescriptor ;
107
- }
108
-
109
- return descriptor ;
110
- }
111
-
112
- @ Nullable
113
- @ Override
114
- public JsExpression get (@ NotNull ResolvedCall <?> call ) {
115
- ReceiverValue thisObject = call .getThisObject ();
116
- if (!thisObject .exists ()) {
117
- return null ;
118
- }
119
-
120
- if (thisObject instanceof ExtensionReceiver || thisObject instanceof ClassReceiver ) {
121
- JsNameRef ref = get (((ThisReceiver ) thisObject ).getDeclarationDescriptor ());
122
- if (ref != null ) {
123
- return ref ;
124
- }
125
- }
126
-
127
- JsNameRef ref = get (getDeclarationDescriptorForReceiver (thisObject ));
128
- return ref == null ? JsLiteral .THIS : ref ;
129
- }
55
+ private AliasingContext (@ Nullable AliasingContext parent ) {
56
+ this (parent , null );
130
57
}
131
58
132
- @ NotNull
133
- public AliasingContext inner ( @ NotNull ThisAliasProvider thisAliasProvider ) {
134
- return new AliasingContext ( this , thisAliasProvider ) ;
59
+ private AliasingContext ( @ Nullable AliasingContext parent , @ Nullable Map < DeclarationDescriptor , JsExpression > aliasesForDescriptors ) {
60
+ this . parent = parent ;
61
+ this . aliasesForDescriptors = aliasesForDescriptors ;
135
62
}
136
63
137
64
@ NotNull
138
- public AliasingContext inner (@ NotNull final DeclarationDescriptor correspondingDescriptor , @ NotNull final JsName alias ) {
139
- return inner (new AbstractThisAliasProvider () {
140
- @ Nullable
141
- @ Override
142
- public JsNameRef get (@ NotNull DeclarationDescriptor descriptor ) {
143
- return correspondingDescriptor == normalize (descriptor ) ? alias .makeRef () : null ;
144
- }
145
- });
65
+ public AliasingContext inner (@ NotNull DeclarationDescriptor descriptor , @ NotNull JsExpression alias ) {
66
+ return new AliasingContext (this , Collections .singletonMap (descriptor , alias ));
146
67
}
147
68
148
69
@ NotNull
149
70
public AliasingContext withAliasesForExpressions (@ NotNull Map <JetExpression , JsName > aliasesForExpressions ) {
150
- AliasingContext newContext = new AliasingContext (this , thisAliasProvider );
71
+ AliasingContext newContext = new AliasingContext (this );
151
72
newContext .aliasesForExpressions .putAll (aliasesForExpressions );
152
73
return newContext ;
153
74
}
154
75
155
76
@ NotNull
156
- public AliasingContext withDescriptorsAliased (@ NotNull Map <DeclarationDescriptor , JsName > aliases ) {
157
- AliasingContext newContext = new AliasingContext (this , thisAliasProvider );
158
- newContext .aliasesForDescriptors .putAll (aliases );
159
- return newContext ;
77
+ public AliasingContext withDescriptorsAliased (@ NotNull Map <DeclarationDescriptor , JsExpression > aliases ) {
78
+ return new AliasingContext (this , aliases );
160
79
}
161
80
162
81
@ Nullable
163
- public JsName getAliasForDescriptor (@ NotNull DeclarationDescriptor descriptor ) {
164
- JsName alias = aliasesForDescriptors .get (descriptor .getOriginal ());
82
+ public JsExpression getAliasForDescriptor (@ NotNull DeclarationDescriptor descriptor ) {
83
+ if (aliasesForDescriptors == null ) {
84
+ return null ;
85
+ }
86
+
87
+ JsExpression alias = aliasesForDescriptors .get (descriptor .getOriginal ());
165
88
if (alias != null ) {
166
89
return alias ;
167
90
}
168
- assert parent != null ;
91
+
169
92
return parent .getAliasForDescriptor (descriptor );
170
93
}
171
94
172
95
@ Nullable
173
96
public JsName getAliasForExpression (@ NotNull JetExpression element ) {
174
97
JsName alias = aliasesForExpressions .get (element );
175
- if (alias != null ) {
176
- return alias ;
98
+ return alias != null ? alias : parent .getAliasForExpression (element );
99
+ }
100
+
101
+ public void registerAlias (@ NotNull DeclarationDescriptor descriptor , @ NotNull JsExpression alias ) {
102
+ if (aliasesForDescriptors == null ) {
103
+ aliasesForDescriptors = Collections .singletonMap (descriptor , alias );
104
+ }
105
+ else {
106
+ if (aliasesForDescriptors .size () == 1 ) {
107
+ Map <DeclarationDescriptor , JsExpression > singletonMap = aliasesForDescriptors ;
108
+ aliasesForDescriptors = new HashMap <DeclarationDescriptor , JsExpression >();
109
+ aliasesForDescriptors .put (singletonMap .keySet ().iterator ().next (), singletonMap .values ().iterator ().next ());
110
+ }
111
+ JsExpression prev = aliasesForDescriptors .put (descriptor , alias );
112
+ assert prev == null ;
177
113
}
178
- assert parent != null ;
179
- return parent .getAliasForExpression (element );
180
114
}
181
115
}
0 commit comments