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

Reply via email to