| Index: sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| index 0a3b141791e79d26aac3b2b85613e227b0fb94de..8e9bf312151ad629658b80ebcdb76d50a272ddfa 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| @@ -1530,7 +1530,7 @@ abstract class BaseClassElementX extends ElementX implements ClassElement {
|
| Element lookupSuperSelector(Selector selector) {
|
| return internalLookupSelector(selector, true);
|
| }
|
| -
|
| +
|
| Element internalLookupSelector(Selector selector, bool isSuperLookup) {
|
| SourceString name = selector.name;
|
| bool isPrivate = name.isPrivate();
|
| @@ -1583,24 +1583,25 @@ abstract class BaseClassElementX extends ElementX implements ClassElement {
|
| */
|
| bool isShadowedByField(Element fieldMember) {
|
| assert(fieldMember.isField());
|
| - // Note that we cannot use [lookupMember] or [lookupSuperMember] since it
|
| - // will not do the right thing for private elements.
|
| - ClassElement lookupClass = this;
|
| + SourceString fieldName = fieldMember.name;
|
| + bool isPrivate = fieldName.isPrivate();
|
| LibraryElement memberLibrary = fieldMember.getLibrary();
|
| - if (fieldMember.name.isPrivate()) {
|
| - // We find a super class in the same library as the field. This way the
|
| - // lookupMember will work.
|
| - while (lookupClass.getLibrary() != memberLibrary) {
|
| - lookupClass = lookupClass.superclass;
|
| + ClassElement lookupClass = this;
|
| + while (lookupClass != null) {
|
| + Element foundMember = lookupClass.lookupLocalMember(fieldName);
|
| + if (foundMember != null) {
|
| + if (foundMember == fieldMember) return false;
|
| + if (foundMember.isField()) {
|
| + if (!isPrivate || memberLibrary == foundMember.getLibrary()) {
|
| + // Private fields can only be shadowed by a field declared
|
| + // in the same library.
|
| + return true;
|
| + }
|
| + }
|
| }
|
| + lookupClass = lookupClass.superclass;
|
| }
|
| - SourceString fieldName = fieldMember.name;
|
| - while (true) {
|
| - Element foundMember = lookupClass.lookupMember(fieldName);
|
| - if (foundMember == fieldMember) return false;
|
| - if (foundMember.isField()) return true;
|
| - lookupClass = foundMember.getEnclosingClass().superclass;
|
| - }
|
| + return false;
|
| }
|
|
|
| Element validateConstructorLookupResults(Selector selector,
|
|
|