Index: frog/library.dart |
diff --git a/frog/library.dart b/frog/library.dart |
index dbe1217b4252a9e1e974839fab9b8a7975c4d2ed..e5b3ed09da5369a36d70ef9082de6a78f8230f06 100644 |
--- a/frog/library.dart |
+++ b/frog/library.dart |
@@ -94,29 +94,45 @@ class Library extends Element { |
if (member.declaringType.isTop) { |
world._addTopName(member); |
} |
- return; |
- } |
- |
- var mset = _privateMembers[member.name]; |
- if (mset == null) { |
- // TODO(jimhug): Make this lazier! |
- for (var lib in world.libraries.getValues()) { |
- if (lib._privateMembers.containsKey(member.jsname)) { |
- member._jsname = '_$jsname${member.jsname}'; |
- break; |
- } |
- } |
- |
- mset = new MemberSet(member, isVar:true); |
- _privateMembers[member.name] = mset; |
} else { |
- mset.members.add(member); |
+ var members = _privateMembers[member.name]; |
+ if (members == null) { |
+ members = new MemberSet(member, isVar: true); |
+ _privateMembers[member.name] = members; |
+ } else { |
+ members.add(member); |
+ } |
+ _makePrivateMembersUnique(member, members); |
} |
} else { |
world._addMember(member); |
} |
} |
+ void _makePrivateMembersUnique(Member member, MemberSet members) { |
+ // If the JS name in the member set is already unique, we simply |
+ // copy the name to the new member. |
+ if (members.jsnameUnique) { |
+ member._jsname = members.jsname; |
+ return; |
+ } |
+ |
+ // Run through the other libraries in the world and check if any |
+ // of them has a clashing private member. If so, we rewrite this |
+ // one and all other members in the set. |
+ String name = members.name; |
+ for (var lib in world.libraries.getValues()) { |
+ if (lib !== this && lib._privateMembers.containsKey(name)) { |
+ String uniqueName = '_${this.jsname}${members.jsname}'; |
+ members.jsname = uniqueName; |
+ members.jsnameUnique = true; |
+ members.members.forEach((each) { each._jsname = uniqueName; }); |
+ assert(member.jsname == members.jsname); |
+ return; |
+ } |
+ } |
+ } |
+ |
// TODO(jimhug): Cache and share the types as interfaces! |
Type getOrAddFunctionType(Element enclosingElement, String name, |
FunctionDefinition func, MethodData data) { |