Extend lint script to emit API statistics.

Bug: 77588754
Test: manual
Change-Id: I240dba5fae1a8635a4265a1af903517f00dec54c
(cherry picked from commit daa7cf3a36)
This commit is contained in:
Jeff Sharkey
2018-04-20 11:26:16 -06:00
committed by Adrian Roos
parent 20f1e0ca1d
commit fe5ee6e74b
2 changed files with 64 additions and 7 deletions

View File

@@ -1334,18 +1334,25 @@ def verify_clone(clazz):
error(clazz, m, None, "Provide an explicit copy constructor instead of implementing clone()")
def is_interesting(clazz):
"""Test if given class is interesting from an Android PoV."""
if clazz.pkg.name.startswith("java"): return False
if clazz.pkg.name.startswith("junit"): return False
if clazz.pkg.name.startswith("org.apache"): return False
if clazz.pkg.name.startswith("org.xml"): return False
if clazz.pkg.name.startswith("org.json"): return False
if clazz.pkg.name.startswith("org.w3c"): return False
if clazz.pkg.name.startswith("android.icu."): return False
return True
def examine_clazz(clazz):
"""Find all style issues in the given class."""
notice(clazz)
if clazz.pkg.name.startswith("java"): return
if clazz.pkg.name.startswith("junit"): return
if clazz.pkg.name.startswith("org.apache"): return
if clazz.pkg.name.startswith("org.xml"): return
if clazz.pkg.name.startswith("org.json"): return
if clazz.pkg.name.startswith("org.w3c"): return
if clazz.pkg.name.startswith("android.icu."): return
if not is_interesting(clazz): return
verify_constants(clazz)
verify_enums(clazz)
@@ -1479,6 +1486,7 @@ def show_deprecations_at_birth(cur, prev):
# Remove all existing things so we're left with new
for prev_clazz in prev.values():
cur_clazz = cur[prev_clazz.fullname]
if not is_interesting(cur_clazz): continue
sigs = { i.ident: i for i in prev_clazz.ctors }
cur_clazz.ctors = [ i for i in cur_clazz.ctors if i.ident not in sigs ]
@@ -1506,6 +1514,38 @@ def show_deprecations_at_birth(cur, prev):
print
def show_stats(cur, prev):
"""Show API stats."""
stats = collections.defaultdict(int)
for cur_clazz in cur.values():
if not is_interesting(cur_clazz): continue
if cur_clazz.fullname not in prev:
stats['new_classes'] += 1
stats['new_ctors'] += len(cur_clazz.ctors)
stats['new_methods'] += len(cur_clazz.methods)
stats['new_fields'] += len(cur_clazz.fields)
else:
prev_clazz = prev[cur_clazz.fullname]
sigs = { i.ident: i for i in prev_clazz.ctors }
ctors = len([ i for i in cur_clazz.ctors if i.ident not in sigs ])
sigs = { i.ident: i for i in prev_clazz.methods }
methods = len([ i for i in cur_clazz.methods if i.ident not in sigs ])
sigs = { i.ident: i for i in prev_clazz.fields }
fields = len([ i for i in cur_clazz.fields if i.ident not in sigs ])
if ctors + methods + fields > 0:
stats['extend_classes'] += 1
stats['extend_ctors'] += ctors
stats['extend_methods'] += methods
stats['extend_fields'] += fields
print "#", "".join([ k.ljust(20) for k in sorted(stats.keys()) ])
print " ", "".join([ str(stats[k]).ljust(20) for k in sorted(stats.keys()) ])
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Enforces common Android public API design \
patterns. It ignores lint messages from a previous API level, if provided.")
@@ -1520,6 +1560,8 @@ if __name__ == "__main__":
help="Show API changes noticed")
parser.add_argument("--show-deprecations-at-birth", action='store_const', const=True,
help="Show API deprecations at birth")
parser.add_argument("--show-stats", action='store_const', const=True,
help="Show API stats")
args = vars(parser.parse_args())
if args['no_color']:
@@ -1539,6 +1581,14 @@ if __name__ == "__main__":
show_deprecations_at_birth(cur, prev)
sys.exit()
if args['show_stats']:
with current_file as f:
cur = _parse_stream(f)
with previous_file as f:
prev = _parse_stream(f)
show_stats(cur, prev)
sys.exit()
with current_file as f:
cur_fail, cur_noticed = examine_stream(f)
if not previous_file is None:

7
tools/apilint/apilint_stats.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
API=28
while [ $API -gt 14 ]; do
echo "# Changes in API $((API))"
python tools/apilint/apilint.py --show-stats ../../prebuilts/sdk/$((API))/public/api/android.txt ../../prebuilts/sdk/$((API-1))/public/api/android.txt
let API=API-1
done