From ef41e134feb15b33d59cd0d10ed43d214f6fe5fd Mon Sep 17 00:00:00 2001 From: "scheglov@google.com" Date: Tue, 25 Sep 2012 20:43:14 +0000 Subject: [PATCH] Issue 5255. Override setter-only field with instance variable http://code.google.com/p/dart/issues/detail?id=5255 R=brianwilkerson@google.com BUG= Review URL: https://codereview.chromium.org//10986033 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@12880 260f80e4-7a28-3924-810f-c04153c831b5 --- .../dart/compiler/type/TypeAnalyzer.java | 1 + .../type/TypeAnalyzerCompilerTest.java | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) 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();