Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
index b2175c53090a95f4f25ac2adb7729698fd04cc82..5084f28b8404e1f8e397d74fa90f1d0e75dd90a8 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
@@ -1395,17 +1395,21 @@ class JavaScriptBackend extends Backend { |
/// Called when [:const Symbol(name):] is seen. |
void registerConstSymbol(String name, TreeElements elements) { |
+ symbolsUsed.add(name); |
} |
/// Called when [:new Symbol(...):] is seen. |
void registerNewSymbol(TreeElements elements) { |
} |
- bool retainGetter(Element element) => isTreeShakingDisabled; |
+ bool retainGetter(Element element) => isNeededForReflection(element); |
Johnni Winther
2013/08/07 10:47:34
Rename these three to shouldRetainX, isXRetained o
ahe
2013/08/07 14:03:17
Done.
|
- bool retainSetter(Element element) => isTreeShakingDisabled; |
+ bool retainSetter(Element element) => isNeededForReflection(element); |
- bool retainName(SourceString name) => mustPreserveNames; |
+ bool retainName(SourceString name) { |
+ if (name == const SourceString('')) return false; |
+ return symbolsUsed.contains(name.slowToString()); |
+ } |
bool get rememberLazies => isTreeShakingDisabled; |
@@ -1475,12 +1479,20 @@ class JavaScriptBackend extends Backend { |
if (metaTargets != null) metaTargetsUsed.addAll(metaTargets); |
} |
+ bool rememberNameOf(Element element) { |
Johnni Winther
2013/08/07 10:47:34
Ditto.
ahe
2013/08/07 14:03:17
Done.
|
+ symbolsUsed.add(element.name.slowToString()); |
+ if (element.isConstructor()) { |
+ symbolsUsed.add(element.getEnclosingClass().name.slowToString()); |
+ } |
+ return true; |
+ } |
+ |
bool isNeededForReflection(Element element) { |
// TODO(ahe): Implement this. |
- if (!metaTargetsUsed.isEmpty) return true; |
+ if (!metaTargetsUsed.isEmpty) return rememberNameOf(element); |
if (!targetsUsed.isEmpty) { |
for (Element e = element; e != null; e = e.enclosingElement) { |
- if (targetsUsed.contains(e)) return true; |
+ if (targetsUsed.contains(e)) return rememberNameOf(element); |
} |
} |
return false; |