Index: frog/world.dart |
diff --git a/frog/world.dart b/frog/world.dart |
index 67e7e191069c2c9ee73a9c77701e935e4209d314..bb77aa16aee0bd957c1b641aaa49a12dcd0311a3 100644 |
--- a/frog/world.dart |
+++ b/frog/world.dart |
@@ -410,6 +410,7 @@ class World { |
void runCompilationPhases() { |
final lib = withTiming('first pass', () => processDartScript()); |
withTiming('resolve top level', resolveAll); |
+ withTiming('privatization', () { makePrivateMembersUnique(lib); }); |
if (experimentalAwaitPhase != null) { |
withTiming('await translation', experimentalAwaitPhase); |
} |
@@ -488,6 +489,36 @@ class World { |
} |
} |
+ makePrivateMembersUnique(Library rootLib) { |
+ var usedNames = new Set<String>(); |
+ process(lib) { |
+ for (var name in lib._privateMembers.getKeys()) { |
+ if (usedNames.contains(name)) { |
+ var members = lib._privateMembers[name]; |
+ String uniqueName = '_${lib.jsname}${members.jsname}'; |
+ members.jsname = uniqueName; |
+ for (var member in members.members) { |
+ member._jsname = uniqueName; |
+ } |
+ } else { |
+ usedNames.add(name); |
+ } |
+ } |
+ } |
+ |
+ // Visit libraries in pre-order of imports. |
+ var visited = new Set<Library>(); |
+ visit(lib) { |
+ if (visited.contains(lib)) return; |
+ visited.add(lib); |
+ process(lib); |
+ for (var import in lib.imports) { |
+ visit(import.library); |
+ } |
+ } |
+ visit(rootLib); |
+ } |
+ |
findMainMethod(Library lib) { |
var main = lib.lookup('main', lib.span); |
if (main == null) { |