summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu <mathieu.a.chartier@gmail.com>2013-06-05 20:35:37 -0500
committerElliott Hughes <enh@google.com>2013-06-06 12:19:58 -0700
commitffecf3c5c207d0275d480970fd025cb9526b1905 (patch)
tree78c59722131533478b08a83dbba655fdc6fff200
parent3ee7bb80f19079ea5a3ce303ea60e825aa65a3a2 (diff)
downloadandroid_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.java21
-rw-r--r--test/api/inserted-super-1.xml8
-rw-r--r--test/api/inserted-super-2.xml8
-rw-r--r--test/doclava/ApiCheckTest.java9
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
+}