From: <cg...@us...> - 2009-08-16 10:28:57
|
Revision: 6676 http://jython.svn.sourceforge.net/jython/?rev=6676&view=rev Author: cgroves Date: 2009-08-16 10:28:49 +0000 (Sun, 16 Aug 2009) Log Message: ----------- Continue looking for methods to merge up the inheritance chain if the non-public class being merged has a parent that's non-public as well. Fixes issue 1430. Modified Paths: -------------- trunk/jython/Lib/test/test_java_visibility.py trunk/jython/src/org/python/core/PyJavaType.java Added Paths: ----------- trunk/jython/tests/java/org/python/tests/multihidden/ trunk/jython/tests/java/org/python/tests/multihidden/BaseConnection.java trunk/jython/tests/java/org/python/tests/multihidden/SpecialConnection.java Modified: trunk/jython/Lib/test/test_java_visibility.py =================================================================== --- trunk/jython/Lib/test/test_java_visibility.py 2009-08-16 08:11:44 UTC (rev 6675) +++ trunk/jython/Lib/test/test_java_visibility.py 2009-08-16 10:28:49 UTC (rev 6676) @@ -10,6 +10,7 @@ from org.python.tests import VisibilityResults as Results from org.python.tests.RedundantInterfaceDeclarations import (Implementation, ExtraClass, ExtraString, ExtraStringAndClass, ExtraClassAndString) +from org.python.tests.multihidden import BaseConnection class VisibilityTest(unittest.TestCase): def test_invisible(self): @@ -167,6 +168,15 @@ self.assertEquals("int", instance.call(7)) self.assertEquals("Class", instance.call(LinkedList)) + def test_extending_multiple_hidden_classes(self): + '''Tests multiple levels of non-public classes overriding public methods from superclasses + + Bug #1430''' + conn = BaseConnection.newConnection() + self.assertEquals("wrapper close", conn.close()) + self.assertEquals("special close", conn.close(7)) + + class JavaClassTest(unittest.TestCase): def test_class_methods_visible(self): self.assertFalse(HashMap.isInterface(), Modified: trunk/jython/src/org/python/core/PyJavaType.java =================================================================== --- trunk/jython/src/org/python/core/PyJavaType.java 2009-08-16 08:11:44 UTC (rev 6675) +++ trunk/jython/src/org/python/core/PyJavaType.java 2009-08-16 10:28:49 UTC (rev 6676) @@ -592,6 +592,11 @@ } if (forClass.getSuperclass() != null) { mergeMethods(forClass.getSuperclass()); + if (!Modifier.isPublic(forClass.getSuperclass().getModifiers())) { + // If the superclass is also not public, it needs to get the same treatment as we + // can't call its methods either. + handleSuperMethodArgCollisions(forClass.getSuperclass()); + } } } Added: trunk/jython/tests/java/org/python/tests/multihidden/BaseConnection.java =================================================================== --- trunk/jython/tests/java/org/python/tests/multihidden/BaseConnection.java (rev 0) +++ trunk/jython/tests/java/org/python/tests/multihidden/BaseConnection.java 2009-08-16 10:28:49 UTC (rev 6676) @@ -0,0 +1,33 @@ +package org.python.tests.multihidden; + +/** + * Derived from the Oracle JDBC connection classes for use in test_extending_multiple_hidden_classes + * in test_java_visibility. + */ +public class BaseConnection { + public static Connection newConnection() { + return new Connection(); + } + + public String close() { + return "base close"; + } +} + +class Connection extends ConnectionWrapper implements SpecialConnection { + + public String close(int foo) { + return "special close"; + } +} + +class ConnectionWrapper extends BaseConnection { + +// This method, plus the fact that Connection implements an interface with a different +// close, causes BaseConnection.close to be hidden in Connection because +// ConnectionWrapper is not public + @Override + public String close() { + return "wrapper close"; + } +} Added: trunk/jython/tests/java/org/python/tests/multihidden/SpecialConnection.java =================================================================== --- trunk/jython/tests/java/org/python/tests/multihidden/SpecialConnection.java (rev 0) +++ trunk/jython/tests/java/org/python/tests/multihidden/SpecialConnection.java 2009-08-16 10:28:49 UTC (rev 6676) @@ -0,0 +1,5 @@ +package org.python.tests.multihidden; + +public interface SpecialConnection { + String close(int foo); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |