diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java index f19b5668108..8ad84c31ca1 100644 --- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java +++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java @@ -3133,6 +3133,7 @@ public class TypeAnalyzer implements DartCompilationPhase { overridden.addAll(superMembers.removeAll(name)); } else { overridden.addAll(superMembers.removeAll(name)); + overridden.addAll(superMembers.removeAll("setter " + name)); } // check override for (Element superElement : overridden) { diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java index 8f84309e99a..ff09c419263 100644 --- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java +++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java @@ -5110,6 +5110,43 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase { assertClassMembers(superElements, "field A.foo"); } } + + public void test_getOverridden_field_withGetter() throws Exception { + analyzeLibrary( + "// filler filler filler filler filler filler filler filler filler filler", + "class A {", + " var foo;", + "}", + "class B extends A {", + " get foo => 0;", + " set foo(x) {}", + "}", + ""); + // getter + { + DartMethodDefinition node = findNode(DartMethodDefinition.class, "get foo"); + Set superElements = node.getElement().getOverridden(); + assertClassMembers(superElements, "field A.foo"); + } + } + + public void test_getOverridden_field_withSetter() throws Exception { + analyzeLibrary( + "// filler filler filler filler filler filler filler filler filler filler", + "class A {", + " var foo;", + "}", + "class B extends A {", + " set foo(x) {}", + "}", + ""); + // setter + { + DartMethodDefinition node = findNode(DartMethodDefinition.class, "set foo"); + Set superElements = node.getElement().getOverridden(); + assertClassMembers(superElements, "field A.foo"); + } + } public void test_getOverridden_getterSetter_withField() throws Exception { analyzeLibrary( @@ -5126,6 +5163,51 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase { Set superElements = node.getElement().getOverridden(); assertClassMembers(superElements, "field A.foo"); } + + public void test_getOverridden_getter_withField() throws Exception { + analyzeLibrary( + "// filler filler filler filler filler filler filler filler filler filler", + "class A {", + " get foo => 0;", + "}", + "class B extends A {", + " var foo = 42;", + "}", + ""); + DartField node = findNode(DartField.class, "foo = 42"); + Set superElements = node.getElement().getOverridden(); + assertClassMembers(superElements, "field A.foo"); + } + + public void test_getOverridden_setter_withField() throws Exception { + analyzeLibrary( + "// filler filler filler filler filler filler filler filler filler filler", + "class A {", + " set foo(x) {}", + "}", + "class B extends A {", + " var foo = 42;", + "}", + ""); + DartField node = findNode(DartField.class, "foo = 42"); + Set superElements = node.getElement().getOverridden(); + assertClassMembers(superElements, "field A.setter foo"); + } + + public void test_getOverridden_setter_withSetter() throws Exception { + analyzeLibrary( + "// filler filler filler filler filler filler filler filler filler filler", + "class A {", + " set foo(x) {} // A", + "}", + "class B extends A {", + " set foo(x) {} // B", + "}", + ""); + DartField node = findNode(DartField.class, "set foo(x) {} // B"); + Set superElements = node.getElement().getOverridden(); + assertClassMembers(superElements, "field A.setter foo"); + } private static void assertClassMembers(Set superElements, String... expectedNames) { Set superNames = Sets.newHashSet();