| Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
|
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
|
| index 2302aec5576d8b4dd92cbe738a3cf234332b6724..7c07ce10eb507bdd475166689632ead7479b03a7 100644
|
| --- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
|
| +++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
|
| @@ -1220,7 +1220,7 @@ class CodeEmitterTask extends CompilerTask {
|
| bool fieldNeedsGetter(VariableElement field) {
|
| assert(field.isField());
|
| if (fieldAccessNeverThrows(field)) return false;
|
| - return backend.retainGetter(field)
|
| + return backend.shouldRetainGetter(field)
|
| || compiler.codegenWorld.hasInvokedGetter(field, compiler);
|
| }
|
|
|
| @@ -1228,7 +1228,7 @@ class CodeEmitterTask extends CompilerTask {
|
| assert(field.isField());
|
| if (fieldAccessNeverThrows(field)) return false;
|
| return (!field.modifiers.isFinalOrConst())
|
| - && (backend.retainSetter(field)
|
| + && (backend.shouldRetainSetter(field)
|
| || compiler.codegenWorld.hasInvokedSetter(field, compiler));
|
| }
|
|
|
| @@ -1288,8 +1288,25 @@ class CodeEmitterTask extends CompilerTask {
|
| emitExtraAccessors(member, builder);
|
| }
|
|
|
| + /// Returns the "reflection name" of an [Element] or [Selector].
|
| + /// The reflection name of a getter 'foo' is 'foo'.
|
| + /// The reflection name of a setter 'foo' is 'foo='.
|
| + /// The reflection name of a method 'foo' is 'foo:N:M:O', where N is the
|
| + /// number of required arguments, M is the number of optional arguments, and
|
| + /// O is the named arguments.
|
| + /// The reflection name of a constructor is similar to a regular method but
|
| + /// starts with 'new '.
|
| + /// This is used by js_mirrors.dart.
|
| String getReflectionName(elementOrSelector, String mangledName) {
|
| - if (!backend.retainName(elementOrSelector.name)) return null;
|
| + SourceString name = elementOrSelector.name;
|
| + if (!backend.shouldRetainName(name)) {
|
| + if (name == const SourceString('') && elementOrSelector is Element) {
|
| + // Make sure to retain names of unnamed constructors.
|
| + if (!backend.isNeededForReflection(elementOrSelector)) return null;
|
| + } else {
|
| + return null;
|
| + }
|
| + }
|
| // TODO(ahe): Enable the next line when I can tell the difference between
|
| // an instance method and a global. They may have the same mangled name.
|
| // if (recordedMangledNames.contains(mangledName)) return null;
|
| @@ -1701,7 +1718,7 @@ class CodeEmitterTask extends CompilerTask {
|
| void recordMangledField(Element member,
|
| String accessorName,
|
| String memberName) {
|
| - if (!backend.retainGetter(member)) return;
|
| + if (!backend.shouldRetainGetter(member)) return;
|
| String previousName;
|
| if (member.isInstanceMember()) {
|
| previousName = mangledFieldNames.putIfAbsent(
|
| @@ -1959,8 +1976,9 @@ class CodeEmitterTask extends CompilerTask {
|
| }
|
| buffer.write('$className:$_');
|
| buffer.write(jsAst.prettyPrint(builder.toObjectInitializer(), compiler));
|
| - if (backend.retainName(classElement.name)) {
|
| + if (backend.shouldRetainName(classElement.name)) {
|
| buffer.write(',$n$n"+${classElement.name.slowToString()}": 0');
|
| + recordedMangledNames.add(className);
|
| }
|
| }
|
|
|
|
|