Index: editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/Context.java |
diff --git a/editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/Context.java b/editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/Context.java |
index e12566c4e06900c5b543c6a444efa518c6f25fad..6b817913df53072587c7acae3016b36f98c69f3d 100644 |
--- a/editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/Context.java |
+++ b/editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/Context.java |
@@ -251,11 +251,11 @@ public class Context { |
public void ensureUniqueClassMemberNames(CompilationUnit unit) { |
unit.accept(new RecursiveASTVisitor<Void>() { |
private final Set<ClassMember> untouchableMethods = Sets.newHashSet(); |
- private final Set<String> usedClassMemberNames = Sets.newHashSet(); |
+ private final Map<String, ClassMember> usedClassMembers = Maps.newHashMap(); |
@Override |
public Void visitClassDeclaration(ClassDeclaration node) { |
- usedClassMemberNames.clear(); |
+ usedClassMembers.clear(); |
// fill "static" methods from super classes |
{ |
org.eclipse.jdt.core.dom.ITypeBinding binding = getNodeTypeBinding(node); |
@@ -264,7 +264,7 @@ public class Context { |
while (binding != null) { |
for (org.eclipse.jdt.core.dom.IMethodBinding method : binding.getDeclaredMethods()) { |
if (org.eclipse.jdt.core.dom.Modifier.isStatic(method.getModifiers())) { |
- usedClassMemberNames.add(method.getName()); |
+ usedClassMembers.put(method.getName(), null); |
} |
} |
binding = binding.getSuperclass(); |
@@ -278,18 +278,31 @@ public class Context { |
Object binding = nodeToBinding.get(member); |
if (JavaUtils.isMethodDeclaredInClass(binding, "java.lang.Object")) { |
untouchableMethods.add(member); |
- usedClassMemberNames.add(methodDeclaration.getName().getName()); |
+ usedClassMembers.put(methodDeclaration.getName().getName(), null); |
} |
} |
} |
// ensure unique method names (and prefer to keep method name over field name) |
for (ClassMember member : node.getMembers()) { |
if (member instanceof MethodDeclaration) { |
- MethodDeclaration methodDeclaration = (MethodDeclaration) member; |
- if (untouchableMethods.contains(methodDeclaration)) { |
+ MethodDeclaration method = (MethodDeclaration) member; |
+ // untouchable |
+ if (untouchableMethods.contains(method)) { |
continue; |
} |
- ensureUniqueName(methodDeclaration.getName()); |
+ // getter/setter can share name |
+ { |
+ ClassMember otherMember = usedClassMembers.get(method.getName().getName()); |
+ if (otherMember instanceof MethodDeclaration) { |
+ MethodDeclaration otherMethod = (MethodDeclaration) otherMember; |
+ if (method.isGetter() && otherMethod.isSetter() || method.isSetter() |
+ && otherMethod.isGetter()) { |
+ continue; |
+ } |
+ } |
+ } |
+ // ensure unique name |
+ ensureUniqueName(method.getName(), method); |
} |
} |
// ensure unique field names (if name is already used be method) |
@@ -297,7 +310,7 @@ public class Context { |
if (member instanceof FieldDeclaration) { |
FieldDeclaration fieldDeclaration = (FieldDeclaration) member; |
for (VariableDeclaration field : fieldDeclaration.getFields().getVariables()) { |
- ensureUniqueName(field.getName()); |
+ ensureUniqueName(field.getName(), fieldDeclaration); |
} |
} |
} |
@@ -305,11 +318,11 @@ public class Context { |
return null; |
} |
- private void ensureUniqueName(Identifier declarationName) { |
+ private void ensureUniqueName(Identifier declarationName, ClassMember member) { |
if (declarationName instanceof SimpleIdentifier) { |
SimpleIdentifier declarationIdentifier = (SimpleIdentifier) declarationName; |
String name = declarationIdentifier.getName(); |
- if (forbiddenNames.contains(name) || usedClassMemberNames.contains(name)) { |
+ if (!isUniqueClassMemberName(name)) { |
String newName = generateUniqueName(name); |
// rename binding |
if (!newName.equals(name)) { |
@@ -318,9 +331,32 @@ public class Context { |
} |
} |
// remember that name is used |
- usedClassMemberNames.add(name); |
+ usedClassMembers.put(name, member); |
} |
} |
+ |
+ private String generateUniqueName(String name) { |
+ if (!isGloballyUniqueClassMemberName(name)) { |
+ int index = 2; |
+ while (true) { |
+ String newName = name + index; |
+ if (isGloballyUniqueClassMemberName(newName)) { |
+ usedNames.add(newName); |
+ return newName; |
+ } |
+ index++; |
+ } |
+ } |
+ return name; |
+ } |
+ |
+ private boolean isGloballyUniqueClassMemberName(String name) { |
+ return isUniqueClassMemberName(name) && !usedNames.contains(name); |
+ } |
+ |
+ private boolean isUniqueClassMemberName(String name) { |
+ return !forbiddenNames.contains(name) && !usedClassMembers.containsKey(name); |
+ } |
}); |
} |