Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/Context.java

Issue 12208101: Getter and setter methods can share name. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012, the Dart project authors. 2 * Copyright (c) 2012, the Dart project authors.
3 * 3 *
4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except
5 * in compliance with the License. You may obtain a copy of the License at 5 * in compliance with the License. You may obtain a copy of the License at
6 * 6 *
7 * http://www.eclipse.org/legal/epl-v10.html 7 * http://www.eclipse.org/legal/epl-v10.html
8 * 8 *
9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License 9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 currentVariableName = oldVariableName; 244 currentVariableName = oldVariableName;
245 } 245 }
246 return null; 246 return null;
247 } 247 }
248 }); 248 });
249 } 249 }
250 250
251 public void ensureUniqueClassMemberNames(CompilationUnit unit) { 251 public void ensureUniqueClassMemberNames(CompilationUnit unit) {
252 unit.accept(new RecursiveASTVisitor<Void>() { 252 unit.accept(new RecursiveASTVisitor<Void>() {
253 private final Set<ClassMember> untouchableMethods = Sets.newHashSet(); 253 private final Set<ClassMember> untouchableMethods = Sets.newHashSet();
254 private final Set<String> usedClassMemberNames = Sets.newHashSet(); 254 private final Map<String, ClassMember> usedClassMembers = Maps.newHashMap( );
255 255
256 @Override 256 @Override
257 public Void visitClassDeclaration(ClassDeclaration node) { 257 public Void visitClassDeclaration(ClassDeclaration node) {
258 usedClassMemberNames.clear(); 258 usedClassMembers.clear();
259 // fill "static" methods from super classes 259 // fill "static" methods from super classes
260 { 260 {
261 org.eclipse.jdt.core.dom.ITypeBinding binding = getNodeTypeBinding(nod e); 261 org.eclipse.jdt.core.dom.ITypeBinding binding = getNodeTypeBinding(nod e);
262 if (binding != null) { 262 if (binding != null) {
263 binding = binding.getSuperclass(); 263 binding = binding.getSuperclass();
264 while (binding != null) { 264 while (binding != null) {
265 for (org.eclipse.jdt.core.dom.IMethodBinding method : binding.getD eclaredMethods()) { 265 for (org.eclipse.jdt.core.dom.IMethodBinding method : binding.getD eclaredMethods()) {
266 if (org.eclipse.jdt.core.dom.Modifier.isStatic(method.getModifie rs())) { 266 if (org.eclipse.jdt.core.dom.Modifier.isStatic(method.getModifie rs())) {
267 usedClassMemberNames.add(method.getName()); 267 usedClassMembers.put(method.getName(), null);
268 } 268 }
269 } 269 }
270 binding = binding.getSuperclass(); 270 binding = binding.getSuperclass();
271 } 271 }
272 } 272 }
273 } 273 }
274 // fill "untouchable" methods 274 // fill "untouchable" methods
275 for (ClassMember member : node.getMembers()) { 275 for (ClassMember member : node.getMembers()) {
276 if (member instanceof MethodDeclaration) { 276 if (member instanceof MethodDeclaration) {
277 MethodDeclaration methodDeclaration = (MethodDeclaration) member; 277 MethodDeclaration methodDeclaration = (MethodDeclaration) member;
278 Object binding = nodeToBinding.get(member); 278 Object binding = nodeToBinding.get(member);
279 if (JavaUtils.isMethodDeclaredInClass(binding, "java.lang.Object")) { 279 if (JavaUtils.isMethodDeclaredInClass(binding, "java.lang.Object")) {
280 untouchableMethods.add(member); 280 untouchableMethods.add(member);
281 usedClassMemberNames.add(methodDeclaration.getName().getName()); 281 usedClassMembers.put(methodDeclaration.getName().getName(), null);
282 } 282 }
283 } 283 }
284 } 284 }
285 // ensure unique method names (and prefer to keep method name over field name) 285 // ensure unique method names (and prefer to keep method name over field name)
286 for (ClassMember member : node.getMembers()) { 286 for (ClassMember member : node.getMembers()) {
287 if (member instanceof MethodDeclaration) { 287 if (member instanceof MethodDeclaration) {
288 MethodDeclaration methodDeclaration = (MethodDeclaration) member; 288 MethodDeclaration method = (MethodDeclaration) member;
289 if (untouchableMethods.contains(methodDeclaration)) { 289 // untouchable
290 if (untouchableMethods.contains(method)) {
290 continue; 291 continue;
291 } 292 }
292 ensureUniqueName(methodDeclaration.getName()); 293 // getter/setter can share name
294 {
295 ClassMember otherMember = usedClassMembers.get(method.getName().ge tName());
296 if (otherMember instanceof MethodDeclaration) {
297 MethodDeclaration otherMethod = (MethodDeclaration) otherMember;
298 if (method.isGetter() && otherMethod.isSetter() || method.isSett er()
299 && otherMethod.isGetter()) {
300 continue;
301 }
302 }
303 }
304 // ensure unique name
305 ensureUniqueName(method.getName(), method);
293 } 306 }
294 } 307 }
295 // ensure unique field names (if name is already used be method) 308 // ensure unique field names (if name is already used be method)
296 for (ClassMember member : node.getMembers()) { 309 for (ClassMember member : node.getMembers()) {
297 if (member instanceof FieldDeclaration) { 310 if (member instanceof FieldDeclaration) {
298 FieldDeclaration fieldDeclaration = (FieldDeclaration) member; 311 FieldDeclaration fieldDeclaration = (FieldDeclaration) member;
299 for (VariableDeclaration field : fieldDeclaration.getFields().getVar iables()) { 312 for (VariableDeclaration field : fieldDeclaration.getFields().getVar iables()) {
300 ensureUniqueName(field.getName()); 313 ensureUniqueName(field.getName(), fieldDeclaration);
301 } 314 }
302 } 315 }
303 } 316 }
304 // no recursion 317 // no recursion
305 return null; 318 return null;
306 } 319 }
307 320
308 private void ensureUniqueName(Identifier declarationName) { 321 private void ensureUniqueName(Identifier declarationName, ClassMember memb er) {
309 if (declarationName instanceof SimpleIdentifier) { 322 if (declarationName instanceof SimpleIdentifier) {
310 SimpleIdentifier declarationIdentifier = (SimpleIdentifier) declaratio nName; 323 SimpleIdentifier declarationIdentifier = (SimpleIdentifier) declaratio nName;
311 String name = declarationIdentifier.getName(); 324 String name = declarationIdentifier.getName();
312 if (forbiddenNames.contains(name) || usedClassMemberNames.contains(nam e)) { 325 if (!isUniqueClassMemberName(name)) {
313 String newName = generateUniqueName(name); 326 String newName = generateUniqueName(name);
314 // rename binding 327 // rename binding
315 if (!newName.equals(name)) { 328 if (!newName.equals(name)) {
316 renameIdentifier(declarationIdentifier, newName); 329 renameIdentifier(declarationIdentifier, newName);
317 name = newName; 330 name = newName;
318 } 331 }
319 } 332 }
320 // remember that name is used 333 // remember that name is used
321 usedClassMemberNames.add(name); 334 usedClassMembers.put(name, member);
322 } 335 }
323 } 336 }
337
338 private String generateUniqueName(String name) {
339 if (!isGloballyUniqueClassMemberName(name)) {
340 int index = 2;
341 while (true) {
342 String newName = name + index;
343 if (isGloballyUniqueClassMemberName(newName)) {
344 usedNames.add(newName);
345 return newName;
346 }
347 index++;
348 }
349 }
350 return name;
351 }
352
353 private boolean isGloballyUniqueClassMemberName(String name) {
354 return isUniqueClassMemberName(name) && !usedNames.contains(name);
355 }
356
357 private boolean isUniqueClassMemberName(String name) {
358 return !forbiddenNames.contains(name) && !usedClassMembers.containsKey(n ame);
359 }
324 }); 360 });
325 } 361 }
326 362
327 /** 363 /**
328 * @return the artificial {@link ClassDeclaration}created for Java creation of anonymous class 364 * @return the artificial {@link ClassDeclaration}created for Java creation of anonymous class
329 * declaration. 365 * declaration.
330 */ 366 */
331 public ClassDeclaration getAnonymousDeclaration(InstanceCreationExpression cre ation) { 367 public ClassDeclaration getAnonymousDeclaration(InstanceCreationExpression cre ation) {
332 return anonymousDeclarations.get(creation); 368 return anonymousDeclarations.get(creation);
333 } 369 }
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 } 901 }
866 } 902 }
867 } 903 }
868 } 904 }
869 } 905 }
870 return super.visitMethodInvocation(node); 906 return super.visitMethodInvocation(node);
871 } 907 }
872 }); 908 });
873 } 909 }
874 } 910 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698