Chromium Code Reviews| Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart |
| diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
| index ce888fc1bb6ebea62bbc9b59415c627ad6f56699..b413c60fdb6bbf6b6b0e91113158bf3c35aa1037 100644 |
| --- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
| +++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
| @@ -5664,6 +5664,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| useExtension = baseType != null && |
| _extensionTypes.hasNativeSubtype(baseType) && |
|
Jennifer Messerly
2017/03/13 17:20:10
you might want to fold this check into isForwarded
vsm
2017/03/13 20:55:26
Done.
|
| + !isForwardedNativeMember(baseType, name) && |
| !isObjectMember(name); |
| } |
| @@ -5672,6 +5673,35 @@ class CodeGenerator extends GeneralizingAstVisitor |
| : result; |
| } |
| + bool isForwardedNativeMember(DartType type, String name) { |
| + // Don't call extension members that just forward to the underlying |
|
Jennifer Messerly
2017/03/13 17:20:10
this might be nicer as a doc comment?
vsm
2017/03/13 20:55:26
Done - see below.
|
| + // native member. We limit this to non-renamed members as the receiver |
| + // may be a mock type. |
| + |
| + // Note, this is an underlying assumption here that, if another native type |
| + // subtypes this one, it also forwards this member to its underlying native |
| + // one without renaming. |
| + if (type is InterfaceType) { |
|
Jennifer Messerly
2017/03/13 17:20:11
this check could be moved to line 5665: `useExtens
vsm
2017/03/13 20:55:26
Done.
|
| + var element = type.element; |
| + if (_extensionTypes.isNativeClass(element)) { |
| + var member = element.lookUpMethod(name, currentLibrary) ?? |
|
Jennifer Messerly
2017/03/13 17:20:11
this is a pretty slow lookup. it'll linear scan th
vsm
2017/03/13 20:55:26
Done.
|
| + element.lookUpGetter(name, currentLibrary) ?? |
| + element.lookUpSetter(name, currentLibrary); |
| + |
| + // Fields on a native class are implicitly native. |
| + // Methods/getters/setters are marked external/native. |
| + if (member != null) { |
| + member = (member.isSynthetic && member is PropertyAccessorElement) ? member.variable : member; |
|
Jennifer Messerly
2017/03/13 17:20:10
long line
vsm
2017/03/13 20:55:26
Done.
|
| + if (member is FieldElement || member.isExternal) { |
| + var jsName = getAnnotationName(member, isJsName); |
| + return jsName == null || jsName == name; |
| + } |
| + } |
| + } |
| + } |
| + return false; |
| + } |
| + |
| JS.TemporaryId _emitPrivateNameSymbol(LibraryElement library, String name) { |
| return _privateNames |
| .putIfAbsent(library, () => new HashMap()) |