Index: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
index b1a6d91a56c9d9eddd7a0467aa4acb40baa25aff..cd9238ec31dfa7962c2a750d0bd4a9ba905685e9 100644 |
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
@@ -2383,11 +2383,16 @@ public class TypeAnalyzer implements DartCompilationPhase { |
} |
// Do not visit the name, it may not have been resolved. |
String name = node.getPropertyName(); |
- InterfaceType.Member member = cls.lookupMember(name); |
- if (member == null || ASTNodes.inSetterContext(node)) { |
- InterfaceType.Member member2 = cls.lookupMember("setter " + name); |
- if (member2 != null && (member == null || member2.getHolder() == member.getHolder() || types.isSubtype(member2.getHolder(), member.getHolder()))) { |
- member = member2; |
+ InterfaceType.Member member; |
+ if (ASTNodes.inSetterContext(node)) { |
+ member = cls.lookupMember("setter " + name); |
+ if (member == null) { |
+ member = cls.lookupMember(name); |
+ } |
+ } else { |
+ member = cls.lookupMember(name); |
+ if (member == null) { |
+ member = cls.lookupMember("setter " + name); |
} |
} |
// is "receiver" is inferred, attempt to find member in one of the subtypes |
@@ -2436,55 +2441,40 @@ public class TypeAnalyzer implements DartCompilationPhase { |
case FIELD: |
FieldElement fieldElement = (FieldElement) element; |
Modifiers fieldModifiers = fieldElement.getModifiers(); |
- MethodElement getter = fieldElement.getGetter(); |
- MethodElement setter = fieldElement.getSetter(); |
+ |
+ // Prepare getter/setter members. |
+ Member getterMember; |
+ Member setterMember; |
+ { |
+ getterMember = cls.lookupMember(name); |
+ if (getterMember == null && TypeQuality.of(cls) == TypeQuality.INFERRED) { |
+ getterMember = cls.lookupSubTypeMember(name); |
+ } |
+ } |
+ { |
+ setterMember = cls.lookupMember("setter " + name); |
+ if (setterMember == null) { |
+ setterMember = cls.lookupMember(name); |
+ } |
+ } |
boolean inSetterContext = ASTNodes.inSetterContext(node); |
boolean inGetterContext = ASTNodes.inGetterContext(node); |
- ClassElement enclosingClass = null; |
- if (fieldElement.getEnclosingElement() instanceof ClassElement) { |
- enclosingClass = (ClassElement) fieldElement.getEnclosingElement(); |
- } |
// Implicit field declared as "final". |
if (!fieldModifiers.isAbstractField() && fieldModifiers.isFinal() && inSetterContext) { |
return typeError(node.getName(), TypeErrorCode.FIELD_IS_FINAL, node.getName()); |
} |
- // Check for cases when property has no setter or getter. |
- if (fieldModifiers.isAbstractField() && enclosingClass != null) { |
- // Check for using field without setter in some assignment variant. |
- if (inSetterContext) { |
- if (setter == null) { |
- setter = Elements.lookupFieldElementSetter(enclosingClass, name); |
- if (setter == null) { |
- setter = Elements.lookupFieldElementSetter(enclosingClass, "setter " + name); |
- } |
- if (setter == null) { |
- return typeError(node.getName(), TypeErrorCode.FIELD_HAS_NO_SETTER, node.getName()); |
- } |
- } |
- } |
- // Check for using field without getter in other operation that assignment. |
- if (inGetterContext) { |
- if (getter == null) { |
- getter = Elements.lookupFieldElementGetter(enclosingClass, name); |
- if (getter == null) { |
- return typeError(node.getName(), TypeErrorCode.FIELD_HAS_NO_GETTER, node.getName()); |
- } |
- } |
- } |
- } |
- |
Type result = member.getType(); |
if (fieldModifiers.isAbstractField()) { |
if (inSetterContext) { |
- result = member.getSetterType(); |
+ result = setterMember != null ? setterMember.getSetterType() : null; |
if (result == null) { |
return typeError(node.getName(), TypeErrorCode.FIELD_HAS_NO_SETTER, node.getName()); |
} |
} |
if (inGetterContext) { |
- result = member.getGetterType(); |
+ result = getterMember != null ? getterMember.getGetterType() : null; |
if (result == null) { |
return typeError(node.getName(), TypeErrorCode.FIELD_HAS_NO_GETTER, node.getName()); |
} |