summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorC. Sean Young <csyoung@google.com>2015-05-20 12:50:00 -0500
committerC. Sean Young <csyoung@google.com>2015-05-20 12:59:29 -0500
commitc47ef0928fa9036c2e9db25a093baa3bcdf72e9c (patch)
tree3ac0a0e011cf905876f5273a06ae762ac47abac0
parent13f355933840a395d671afcc548e2ae4020d92ef (diff)
parentc10f7ae0cbb6f1152556ba619b6b756586ae9074 (diff)
downloadandroid_external_doclava-c47ef0928fa9036c2e9db25a093baa3bcdf72e9c.tar.gz
android_external_doclava-c47ef0928fa9036c2e9db25a093baa3bcdf72e9c.tar.bz2
android_external_doclava-c47ef0928fa9036c2e9db25a093baa3bcdf72e9c.zip
resolved conflicts for merge of c10f7ae0 to mnc-dev
Change-Id: I33ed09c2b635fbe83694bc1ad03e027419aa007e
-rw-r--r--src/com/google/doclava/PackageInfo.java27
-rw-r--r--src/com/google/doclava/apicheck/ApiCheck.java24
-rw-r--r--src/com/google/doclava/apicheck/ApiInfo.java33
3 files changed, 79 insertions, 5 deletions
diff --git a/src/com/google/doclava/PackageInfo.java b/src/com/google/doclava/PackageInfo.java
index 12f18b3..46b5b8f 100644
--- a/src/com/google/doclava/PackageInfo.java
+++ b/src/com/google/doclava/PackageInfo.java
@@ -455,11 +455,34 @@ public class PackageInfo extends DocInfo implements ContainerInfo {
* @return
*/
public boolean isConsistent(PackageInfo pInfo, List<ClassInfo> clsInfoDiff) {
+ return isConsistent(pInfo, clsInfoDiff, null);
+ }
+
+ /**
+ * Check if packages are consistent, also record class deltas.
+ * <p>
+ * <ul>class deltas are:
+ * <li>brand new classes that are not present in current package
+ * <li>stripped existing classes stripped where only newly added methods are kept
+ * @param pInfo
+ * @param clsInfoDiff
+ * @param ignoredClasses
+ * @return
+ */
+ public boolean isConsistent(PackageInfo pInfo, List<ClassInfo> clsInfoDiff,
+ Collection<String> ignoredClasses) {
boolean consistent = true;
boolean diffMode = clsInfoDiff != null;
for (ClassInfo cInfo : mClasses.values()) {
ArrayList<MethodInfo> newClsApis = null;
ArrayList<MethodInfo> newClsCtors = null;
+
+ // TODO: Add support for matching inner classes (e.g, something like
+ // example.Type.* should match example.Type.InnerType)
+ if (ignoredClasses != null && ignoredClasses.contains(cInfo.qualifiedName())) {
+ // TODO: Log skipping this?
+ continue;
+ }
if (pInfo.mClasses.containsKey(cInfo.name())) {
if (diffMode) {
newClsApis = new ArrayList<>();
@@ -481,6 +504,10 @@ public class PackageInfo extends DocInfo implements ContainerInfo {
}
}
for (ClassInfo cInfo : pInfo.mClasses.values()) {
+ if (ignoredClasses != null && ignoredClasses.contains(cInfo.qualifiedName())) {
+ // TODO: Log skipping this?
+ continue;
+ }
if (!mClasses.containsKey(cInfo.name())) {
Errors.error(Errors.ADDED_CLASS, cInfo.position(), "Added class " + cInfo.name()
+ " to package " + pInfo.name());
diff --git a/src/com/google/doclava/apicheck/ApiCheck.java b/src/com/google/doclava/apicheck/ApiCheck.java
index 521ac52..47a8b5e 100644
--- a/src/com/google/doclava/apicheck/ApiCheck.java
+++ b/src/com/google/doclava/apicheck/ApiCheck.java
@@ -24,6 +24,7 @@ import java.io.PrintStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
+import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
@@ -41,7 +42,8 @@ public class ApiCheck {
for (i = 0; i < allArgs.size(); i++) {
// flags with one value attached
String flag = allArgs.get(i);
- if (flag.equals("-error") || flag.equals("-warning") || flag.equals("-hide")) {
+ if (flag.equals("-error") || flag.equals("-warning") || flag.equals("-hide")
+ || flag.equals("-ignoreClass") || flag.equals("-ignorePackage")) {
String[] arg = new String[2];
arg[0] = flag;
arg[1] = allArgs.get(++i);
@@ -66,6 +68,7 @@ public class ApiCheck {
System.exit(convertToXml(originalArgs[1], originalArgs[2]));
} else if (originalArgs.length == 4 && "-new_api".equals(originalArgs[0])) {
// command syntax: -new_api oldapi.txt newapi.txt diff.xml
+ // TODO: Support reading in other options for new_api, such as ignored classes/packages.
System.exit(newApi(originalArgs[1], originalArgs[2], originalArgs[3]));
} else {
ApiCheck acheck = new ApiCheck();
@@ -86,6 +89,11 @@ public class ApiCheck {
args.add(a);
}
+ // Not having having any classes or packages ignored is the common case.
+ // Avoid a hashCode call in a common loop by not passing in a HashSet in this case.
+ Set<String> ignoredPackages = null;
+ Set<String> ignoredClasses = null;
+
ArrayList<String[]> flags = ApiCheck.parseFlags(args);
for (String[] a : flags) {
if (a[0].equals("-error") || a[0].equals("-warning") || a[0].equals("-hide")) {
@@ -103,6 +111,16 @@ public class ApiCheck {
System.err.println("Bad argument: " + a[0] + " " + a[1]);
return new Report(2, Errors.getErrors());
}
+ } else if (a[0].equals("-ignoreClass")) {
+ if (ignoredClasses == null) {
+ ignoredClasses = new HashSet<String>();
+ }
+ ignoredClasses.add(a[1]);
+ } else if (a[0].equals("-ignorePackage")) {
+ if (ignoredPackages == null) {
+ ignoredPackages = new HashSet<String>();
+ }
+ ignoredPackages.add(a[1]);
}
}
@@ -126,11 +144,11 @@ public class ApiCheck {
// only run the consistency check if we haven't had XML parse errors
if (!Errors.hadError) {
- oldApi.isConsistent(newApi);
+ oldApi.isConsistent(newApi, null, ignoredPackages, ignoredClasses);
}
if (!Errors.hadError) {
- oldRemovedApi.isConsistent(newRemovedApi);
+ oldRemovedApi.isConsistent(newRemovedApi, null, ignoredPackages, ignoredClasses);
}
return new Report(Errors.hadError ? 1 : 0, Errors.getErrors());
diff --git a/src/com/google/doclava/apicheck/ApiInfo.java b/src/com/google/doclava/apicheck/ApiInfo.java
index 148da35..fa51e8b 100644
--- a/src/com/google/doclava/apicheck/ApiInfo.java
+++ b/src/com/google/doclava/apicheck/ApiInfo.java
@@ -21,6 +21,7 @@ import com.google.doclava.Errors;
import com.google.doclava.PackageInfo;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -67,21 +68,45 @@ public class ApiInfo {
}
public boolean isConsistent(ApiInfo otherApi, List<PackageInfo> pkgInfoDiff) {
+ return isConsistent(otherApi, pkgInfoDiff, null, null);
+ }
+
+ /**
+ * Checks to see if this api is consistent with a newer version.
+ *
+ * @param otherApi the other api to test consistency against
+ * @param pkgInfoDiff
+ * @param ignoredPackages packages to skip consistency checks (will match by exact name)
+ * @param ignoredClasses classes to skip consistency checks (will match by exact fully qualified
+ * name)
+ */
+ public boolean isConsistent(ApiInfo otherApi, List<PackageInfo> pkgInfoDiff,
+ Collection<String> ignoredPackages, Collection<String> ignoredClasses) {
boolean consistent = true;
boolean diffMode = pkgInfoDiff != null;
for (PackageInfo pInfo : mPackages.values()) {
List<ClassInfo> newClsApis = null;
+
+ // TODO: Add support for matching subpackages (e.g, something like
+ // test.example.* should match test.example.subpackage, and
+ // test.example.** should match the above AND test.example.subpackage.more)
+ if (ignoredPackages != null && ignoredPackages.contains(pInfo.name())) {
+ // TODO: Log skipping this?
+ continue;
+ }
if (otherApi.getPackages().containsKey(pInfo.name())) {
if (diffMode) {
newClsApis = new ArrayList<>();
}
- if (!pInfo.isConsistent(otherApi.getPackages().get(pInfo.name()), newClsApis)) {
+ if (!pInfo.isConsistent(otherApi.getPackages().get(pInfo.name()), newClsApis, ignoredClasses)) {
consistent = false;
}
if (diffMode && !newClsApis.isEmpty()) {
PackageInfo info = new PackageInfo(pInfo.name(), pInfo.position());
for (ClassInfo cInfo : newClsApis) {
- info.addClass(cInfo);
+ if (ignoredClasses == null || !ignoredClasses.contains(cInfo.qualifiedName())) {
+ info.addClass(cInfo);
+ }
}
pkgInfoDiff.add(info);
}
@@ -91,6 +116,10 @@ public class ApiInfo {
}
}
for (PackageInfo pInfo : otherApi.mPackages.values()) {
+ if (ignoredPackages != null && ignoredPackages.contains(pInfo.name())) {
+ // TODO: Log skipping this?
+ continue;
+ }
if (!mPackages.containsKey(pInfo.name())) {
Errors.error(Errors.ADDED_PACKAGE, pInfo.position(), "Added package " + pInfo.name());
consistent = false;