Skip to content

Commit 12d19dd

Browse files
develarbashor
authored andcommitted
JS backend: added wraping to object the local vars which captured in closure.
Moved local functions and function literals to class/namespace definition. (cherry picked from commit 36c954b)
1 parent e292034 commit 12d19dd

31 files changed

+565
-552
lines changed

js/js.translator/src/org/jetbrains/k2js/translate/context/AliasingContext.java

Lines changed: 38 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -18,46 +18,18 @@
1818

1919
import com.google.common.collect.Maps;
2020
import com.google.dart.compiler.backend.js.ast.JsExpression;
21-
import com.google.dart.compiler.backend.js.ast.JsLiteral;
2221
import com.google.dart.compiler.backend.js.ast.JsName;
23-
import com.google.dart.compiler.backend.js.ast.JsNameRef;
2422
import org.jetbrains.annotations.NotNull;
2523
import org.jetbrains.annotations.Nullable;
26-
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
27-
import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor;
2824
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
2925
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;
3426

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.*;
3928

4029
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) {
4331
@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) {
6133
return null;
6234
}
6335

@@ -68,114 +40,76 @@ public JsName getAliasForExpression(@NotNull JetExpression element) {
6840
};
6941

7042
public static AliasingContext getCleanContext() {
71-
return new AliasingContext(ROOT, ROOT.thisAliasProvider);
43+
return new AliasingContext(ROOT);
7244
}
7345

74-
@NotNull
75-
private final Map<DeclarationDescriptor, JsName> aliasesForDescriptors = Maps.newHashMap();
46+
@Nullable
47+
private Map<DeclarationDescriptor, JsExpression> aliasesForDescriptors;
7648

77-
@NotNull
78-
final ThisAliasProvider thisAliasProvider;
7949
@NotNull
8050
private final Map<JetExpression, JsName> aliasesForExpressions = Maps.newHashMap();
8151

8252
@Nullable
8353
private final AliasingContext parent;
8454

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);
13057
}
13158

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;
13562
}
13663

13764
@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));
14667
}
14768

14869
@NotNull
14970
public AliasingContext withAliasesForExpressions(@NotNull Map<JetExpression, JsName> aliasesForExpressions) {
150-
AliasingContext newContext = new AliasingContext(this, thisAliasProvider);
71+
AliasingContext newContext = new AliasingContext(this);
15172
newContext.aliasesForExpressions.putAll(aliasesForExpressions);
15273
return newContext;
15374
}
15475

15576
@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);
16079
}
16180

16281
@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());
16588
if (alias != null) {
16689
return alias;
16790
}
168-
assert parent != null;
91+
16992
return parent.getAliasForDescriptor(descriptor);
17093
}
17194

17295
@Nullable
17396
public JsName getAliasForExpression(@NotNull JetExpression element) {
17497
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;
177113
}
178-
assert parent != null;
179-
return parent.getAliasForExpression(element);
180114
}
181115
}

js/js.translator/src/org/jetbrains/k2js/translate/context/TraceableThisAliasProvider.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

0 commit comments

Comments
 (0)