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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/js_backend/namer.dart

Issue 62373009: Field property naming fix - issues 14096, 14806 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review changes Created 7 years, 1 month 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 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of js_backend; 5 part of js_backend;
6 6
7 /** 7 /**
8 * Assigns JavaScript identifiers to Dart variables, class-names and members. 8 * Assigns JavaScript identifiers to Dart variables, class-names and members.
9 */ 9 */
10 class Namer implements ClosureNamer { 10 class Namer implements ClosureNamer {
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 } 433 }
434 } 434 }
435 } 435 }
436 436
437 /** 437 /**
438 * Returns the internal name used for an invocation mirror of this selector. 438 * Returns the internal name used for an invocation mirror of this selector.
439 */ 439 */
440 String invocationMirrorInternalName(Selector selector) 440 String invocationMirrorInternalName(Selector selector)
441 => invocationName(selector); 441 => invocationName(selector);
442 442
443 String instanceFieldName(Element element) { 443 /**
444 * Returns name of accessor (root to getter and setter) for a static or
445 * instance field.
446 */
447 String fieldAccessorName(Element element) {
448 return element.isInstanceMember()
449 ? instanceFieldAccessorName(element)
450 : getNameOfField(element);
451 }
452
453 /**
454 * Returns name of the JavaScript property used to store a static or instance
455 * field.
456 */
457 String fieldPropertyName(Element element) {
458 return element.isInstanceMember()
459 ? instanceFieldPropertyName(element)
460 : getNameOfField(element);
461 }
462
463 /**
464 * Returns name of accessor (root to getter and setter) for an instance field.
465 */
466 String instanceFieldAccessorName(Element element) {
444 String proposedName = privateName(element.getLibrary(), element.name); 467 String proposedName = privateName(element.getLibrary(), element.name);
445 return getMappedInstanceName(proposedName); 468 return getMappedInstanceName(proposedName);
446 } 469 }
447 470
448 // Construct a new name for the element based on the library and class it is 471 /**
449 // in. The name here is not important, we just need to make sure it is 472 * Returns name of the JavaScript property used to store an instance field.
450 // unique. If we are minifying, we actually construct the name from the 473 */
451 // minified versions of the class and instance names, but the result is 474 String instanceFieldPropertyName(Element element) {
452 // minified once again, so that is not visible in the end result. 475 if (element.hasFixedBackendName()) {
453 String shadowedFieldName(Element fieldElement) { 476 return element.fixedBackendName();
454 // Check for following situation: Native field ${fieldElement.name} has 477 }
455 // fixed JSName ${fieldElement.nativeName()}, but a subclass shadows this 478 // If a class is used anywhere as a mixin, we must make the name unique so
456 // name. We normally handle that by renaming the superclass field, but we 479 // that it does not accidentally shadow. Also, the mixin name must be
457 // can't do that because native fields have fixed JavaScript names. 480 // constant over all mixins.
458 // In practice this can't happen because we can't inherit from native 481 if (compiler.world.isUsedAsMixin(element.getEnclosingClass()) ||
459 // classes. 482 shadowingAnotherField(element)) {
460 assert (!fieldElement.hasFixedBackendName()); 483 // Construct a new name for the element based on the library and class it
484 // is in. The name here is not important, we just need to make sure it is
485 // unique. If we are minifying, we actually construct the name from the
486 // minified version of the class name, but the result is minified once
487 // again, so that is not visible in the end result.
488 String libraryName = getNameOfLibrary(element.getLibrary());
489 String className = getNameOfClass(element.getEnclosingClass());
490 String instanceName = privateName(element.getLibrary(), element.name);
491 return getMappedInstanceName('$libraryName\$$className\$$instanceName');
492 }
461 493
462 String libraryName = getNameOfLibrary(fieldElement.getLibrary()); 494 String proposedName = privateName(element.getLibrary(), element.name);
463 String className = getNameOfClass(fieldElement.getEnclosingClass()); 495 return getMappedInstanceName(proposedName);
464 String instanceName = instanceFieldName(fieldElement); 496 }
465 return getMappedInstanceName('$libraryName\$$className\$$instanceName'); 497
498
499 bool shadowingAnotherField(Element element) {
500 return element.getEnclosingClass().hasFieldShadowedBy(element);
466 } 501 }
467 502
468 String setterName(Element element) { 503 String setterName(Element element) {
469 // We dynamically create setters from the field-name. The setter name must 504 // We dynamically create setters from the field-name. The setter name must
470 // therefore be derived from the instance field-name. 505 // therefore be derived from the instance field-name.
471 LibraryElement library = element.getLibrary(); 506 LibraryElement library = element.getLibrary();
472 String name = getMappedInstanceName(privateName(library, element.name)); 507 String name = getMappedInstanceName(privateName(library, element.name));
473 return '$setterPrefix$name'; 508 return '$setterPrefix$name';
474 } 509 }
475 510
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 String getNameX(Element element) { 746 String getNameX(Element element) {
712 if (element.isInstanceMember()) { 747 if (element.isInstanceMember()) {
713 if (element.kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY 748 if (element.kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY
714 || element.kind == ElementKind.FUNCTION) { 749 || element.kind == ElementKind.FUNCTION) {
715 return instanceMethodName(element); 750 return instanceMethodName(element);
716 } else if (element.kind == ElementKind.GETTER) { 751 } else if (element.kind == ElementKind.GETTER) {
717 return getterName(element); 752 return getterName(element);
718 } else if (element.kind == ElementKind.SETTER) { 753 } else if (element.kind == ElementKind.SETTER) {
719 return setterName(element); 754 return setterName(element);
720 } else if (element.kind == ElementKind.FIELD) { 755 } else if (element.kind == ElementKind.FIELD) {
721 return instanceFieldName(element); 756 compiler.internalError(
757 'use instanceFieldPropertyName or instanceFieldAccessorName',
758 node: element.parseNode(compiler));
722 } else { 759 } else {
723 compiler.internalError('getName for bad kind: ${element.kind}', 760 compiler.internalError('getName for bad kind: ${element.kind}',
724 node: element.parseNode(compiler)); 761 node: element.parseNode(compiler));
725 } 762 }
726 } else { 763 } else {
727 // Use declaration element to ensure invariant on [globals]. 764 // Use declaration element to ensure invariant on [globals].
728 element = element.declaration; 765 element = element.declaration;
729 // Dealing with a top-level or static element. 766 // Dealing with a top-level or static element.
730 String cached = globals[element]; 767 String cached = globals[element];
731 if (cached != null) return cached; 768 if (cached != null) return cached;
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 if (!first) { 1375 if (!first) {
1339 sb.write('_'); 1376 sb.write('_');
1340 } 1377 }
1341 sb.write('_'); 1378 sb.write('_');
1342 visit(link.head); 1379 visit(link.head);
1343 first = true; 1380 first = true;
1344 } 1381 }
1345 } 1382 }
1346 } 1383 }
1347 } 1384 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698