Revision: 8765
Author: [email protected]
Date: Mon Sep 13 10:29:13 2010
Log: JClassType.getOverridableMethods() could return methods overridden
as 'final'.
In AbstractMembers, final methods were simply ignored instead of being
treated
as possible overrides of already seenm ethods. A final method should
trigger the
removal of a method with the same signature from methodsBySignature.
http://gwt-code-reviews.appspot.com/839803/show
Fixes issues: 5270
Patch by: [email protected]
Review by: me, jat
http://code.google.com/p/google-web-toolkit/source/detail?r=8765
Modified:
/trunk/dev/core/src/com/google/gwt/core/ext/typeinfo/AbstractMembers.java
/trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/JClassTypeTest.java
/trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/JEnumTypeTest.java
/trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/test/CB.java
=======================================
---
/trunk/dev/core/src/com/google/gwt/core/ext/typeinfo/AbstractMembers.java
Wed Apr 1 12:13:09 2009
+++
/trunk/dev/core/src/com/google/gwt/core/ext/typeinfo/AbstractMembers.java
Mon Sep 13 10:29:13 2010
@@ -158,15 +158,22 @@
for (int i = 0; i < declaredMethods.length; i++) {
JMethod method = declaredMethods[i];
- // Ensure that this method is overridable.
- if (method.isFinal() || method.isPrivate() || method.isStatic()) {
- // We cannot override this method, so skip it.
+ // Ensure that this method is inherited.
+ if (method.isPrivate() || method.isStatic()) {
+ // We don't inherit this method, so skip it.
continue;
}
- // We can override this method, so record it.
String sig = computeInternalSignature(method);
- methodsBySignature.put(sig, method);
+
+ // Ensure that this method is overridable.
+ if (method.isFinal()) {
+ // We cannot override this method, but it might override another
method, so remove any possibly overridden method.
+ methodsBySignature.remove(sig);
+ } else {
+ // We can override this method, so record it.
+ methodsBySignature.put(sig, method);
+ }
}
}
=======================================
---
/trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/JClassTypeTest.java
Mon May 18 11:47:32 2009
+++
/trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/JClassTypeTest.java
Mon Sep 13 10:29:13 2010
@@ -201,6 +201,21 @@
// Check that we aren't including methods that aren't actually
overridable
// because they are final and/or private.
{
+ assertMethodOverridable(typeOracle,
+ "com.google.gwt.core.ext.typeinfo.test.IA",
+ "com.google.gwt.core.ext.typeinfo.test.CA", "foo",
+ noParams);
+
+ assertMethodNotOverridable(typeOracle,
+ "com.google.gwt.core.ext.typeinfo.test.CB",
+ "com.google.gwt.core.ext.typeinfo.test.CB", "foo",
+ noParams);
+
+ assertMethodNotOverridable(typeOracle,
+ "com.google.gwt.core.ext.typeinfo.test.CB",
+ "com.google.gwt.core.ext.typeinfo.test.CC", "foo",
+ noParams);
+
assertMethodNotOverridable(typeOracle,
"com.google.gwt.core.ext.typeinfo.test.CA",
"com.google.gwt.core.ext.typeinfo.test.CA", "caNotOverridableFinal",
=======================================
---
/trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/JEnumTypeTest.java
Tue Nov 10 08:12:08 2009
+++
/trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/JEnumTypeTest.java
Mon Sep 13 10:29:13 2010
@@ -148,12 +148,12 @@
assertEquals("A", annotation.value());
JClassType aClass = constants[0].getType().isClass();
JMethod[] methods = aClass.getOverridableMethods();
- assertEquals(7, methods.length);
+ assertEquals(4, methods.length);
// TODO(jat): verify getExtra is from A's anonymous subclass of
// EnumInterface when/if that is implemented.
boolean found = false;
for (JMethod method : methods) {
- if ("name".equals(method.getName())) {
+ if ("getExtra".equals(method.getName())) {
found = true;
// TODO(jat); any other verification here?
}
=======================================
--- /trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/test/CB.java Mon
May 28 21:53:34 2007
+++ /trunk/dev/core/test/com/google/gwt/core/ext/typeinfo/test/CB.java Mon
Sep 13 10:29:13 2010
@@ -1,7 +1,10 @@
package com.google.gwt.core.ext.typeinfo.test;
public abstract class CB extends CA implements IB {
-
+
+ public final void foo() {
+ }
+
public abstract void ic();
-
-}
+
+}
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors