diff options
author | C. Sean Young <csyoung@google.com> | 2015-05-20 12:50:00 -0500 |
---|---|---|
committer | C. Sean Young <csyoung@google.com> | 2015-05-20 12:59:29 -0500 |
commit | c47ef0928fa9036c2e9db25a093baa3bcdf72e9c (patch) | |
tree | 3ac0a0e011cf905876f5273a06ae762ac47abac0 | |
parent | 13f355933840a395d671afcc548e2ae4020d92ef (diff) | |
parent | c10f7ae0cbb6f1152556ba619b6b756586ae9074 (diff) | |
download | android_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.java | 27 | ||||
-rw-r--r-- | src/com/google/doclava/apicheck/ApiCheck.java | 24 | ||||
-rw-r--r-- | src/com/google/doclava/apicheck/ApiInfo.java | 33 |
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; |