diff options
author | Mathieu <mathieu.a.chartier@gmail.com> | 2013-06-05 20:35:37 -0500 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2013-06-06 12:19:58 -0700 |
commit | ffecf3c5c207d0275d480970fd025cb9526b1905 (patch) | |
tree | 78c59722131533478b08a83dbba655fdc6fff200 | |
parent | 3ee7bb80f19079ea5a3ce303ea60e825aa65a3a2 (diff) | |
download | android_external_doclava-ffecf3c5c207d0275d480970fd025cb9526b1905.tar.gz android_external_doclava-ffecf3c5c207d0275d480970fd025cb9526b1905.tar.bz2 android_external_doclava-ffecf3c5c207d0275d480970fd025cb9526b1905.zip |
Check superclasses recursively for changed superclasses.
We now check superclasses recursively instead of just doing a string comparison.
This means that we no longer treat cases where the new superclass extends the old
superclass as an error.
Fixes https://android-review.googlesource.com/#/c/58400/1
Change-Id: I77ebb7312d0de83faed7dce0195682848256af73
-rw-r--r-- | src/com/google/doclava/ClassInfo.java | 21 | ||||
-rw-r--r-- | test/api/inserted-super-1.xml | 8 | ||||
-rw-r--r-- | test/api/inserted-super-2.xml | 8 | ||||
-rw-r--r-- | test/doclava/ApiCheckTest.java | 9 |
4 files changed, 39 insertions, 7 deletions
diff --git a/src/com/google/doclava/ClassInfo.java b/src/com/google/doclava/ClassInfo.java index 927b240..68bf9e6 100644 --- a/src/com/google/doclava/ClassInfo.java +++ b/src/com/google/doclava/ClassInfo.java @@ -1502,6 +1502,19 @@ public class ClassInfo extends DocInfo implements ContainerInfo, Comparable, Sco return false; } + /** + * Returns true if {@code cl} extends the class {@code ext}. + */ + private boolean extendsClass(ClassInfo cl, String ext) { + if (cl.qualifiedName().equals(ext)) { + return true; + } + if (cl.mSuperclass != null && extendsClass(cl.mSuperclass, ext)) { + return true; + } + return false; + } + public void addInterface(ClassInfo iface) { mRealInterfaces.add(iface); } @@ -1718,16 +1731,12 @@ public class ClassInfo extends DocInfo implements ContainerInfo, Comparable, Sco + " has changed deprecation state"); } - if (superclassName() != null) { - if (cl.superclassName() == null || !superclassName().equals(cl.superclassName())) { + if (superclassName() != null) { // java.lang.Object can't have a superclass. + if (!extendsClass(cl, superclassName())) { consistent = false; Errors.error(Errors.CHANGED_SUPERCLASS, cl.position(), "Class " + qualifiedName() + " superclass changed from " + superclassName() + " to " + cl.superclassName()); } - } else if (cl.superclassName() != null) { - consistent = false; - Errors.error(Errors.CHANGED_SUPERCLASS, cl.position(), "Class " + qualifiedName() - + " superclass changed from " + "null to " + cl.superclassName()); } return consistent; diff --git a/test/api/inserted-super-1.xml b/test/api/inserted-super-1.xml new file mode 100644 index 0000000..bbe0f48 --- /dev/null +++ b/test/api/inserted-super-1.xml @@ -0,0 +1,8 @@ +<api> +<package name="test" > +<class name="A" extends="java.lang.Object" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +<class name="B" extends="test.A" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +<class name="C1" extends="java.lang.Object" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +<class name="C2" extends="test.A" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +</package> +</api> diff --git a/test/api/inserted-super-2.xml b/test/api/inserted-super-2.xml new file mode 100644 index 0000000..6434fff --- /dev/null +++ b/test/api/inserted-super-2.xml @@ -0,0 +1,8 @@ +<api> +<package name="test" > +<class name="A" extends="java.lang.Object" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +<class name="B" extends="test.A" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +<class name="C1" extends="test.B" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +<class name="C2" extends="test.B" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public" /> +</package> +</api> diff --git a/test/doclava/ApiCheckTest.java b/test/doclava/ApiCheckTest.java index af4918d..76ab864 100644 --- a/test/doclava/ApiCheckTest.java +++ b/test/doclava/ApiCheckTest.java @@ -103,6 +103,13 @@ public class ApiCheckTest extends TestCase { assertEquals(Errors.CHANGED_SUPERCLASS, report.errors().iterator().next().error()); } + public void testInsertedSuper() { + String[] args = { "test/api/inserted-super-1.xml", "test/api/inserted-super-2.xml" }; + ApiCheck apiCheck = new ApiCheck(); + Report report = apiCheck.checkApi(args); + assertEquals(0, report.errors().size()); + } + public void testAddedInterface() { String[] args = { "test/api/removed-interface.xml", "test/api/medium.xml" }; ApiCheck apiCheck = new ApiCheck(); @@ -406,4 +413,4 @@ public class ApiCheckTest extends TestCase { assertEquals(1, report.errors().size()); assertEquals(Errors.CHANGED_CLASS, report.errors().iterator().next().error()); } -}
\ No newline at end of file +} |