Commit Graph

56 Commits

Author SHA1 Message Date
Joe Onorato
680d4fcd84 Apilint updates
- Make apilint not print in color when added to file.
  - Make apilint able to filter for classes or packages
  - Add frameworks/base/tools/apilint/apilint script that
    has convenient commandline interface for the main
    common use cases.

Bug: 132198274
Test: apilint_test.py
Test: manual
Change-Id: I78341f42b0fdf4b73a724423b14545b1861a3293
2019-05-08 13:31:07 -07:00
Michael Wright
42dcfb8f57 Handle removed classes when looking for deprecated at birth APIs.
Removed APIs cause a KeyError when looking them up in the current API
surface. Instead, check if they're there first and if not just move on
since they no longer exist.

Bug: 129975435
Test: looked for new and deprecated system APIs
Change-Id: I46daa83ec8376190112418720f848afdf7cd7df2
2019-04-29 22:37:00 +01:00
Jeff Sharkey
b4e3d691d1 Also need to filter second pass.
Bug: 116802409
Test: manual
Change-Id: I874cea7987684a8f7dca5c4d03d226568f355d8d
2019-03-26 09:59:52 -06:00
Adrian Roos
3478239c56 apilint: Lint unhidden @IntDef and @LongDef
@IntDefs and @LongDefs cannot be stored in a .class file, because the constant
names are lost. Instead, they are packaged out-of-band.

Therefore, they should never be in the API.

Test: python tools/apilint/apilint.py api/current.txt
Change-Id: If22e0cf7db0bb90dae6174bf546f2ec8be4e5458
2019-03-06 13:40:03 +01:00
Adrian Roos
26968d81f8 Merge "Apilint: No longer flag interface callbacks" 2019-03-05 18:15:44 +00:00
Adrian Roos
cdb8167051 Apilint: No longer flag interface callbacks
With default interfaces, this is no longer necessary.

Test: python apilint_test.py
Change-Id: Ifa9ba24511a82797089934009d9096c3a589e7f6
2019-03-05 18:13:42 +00:00
Adrian Roos
93bafc4495 apilint: decorator-based verifier registration
Registers verifiers via a decorator to avoid error-prone registration
elsewhere.

Test: Run apilint before and after the change, verify identical output
Change-Id: I77ae47a2f3f1a486bb78d3167f8439ade6fc28ab
2019-03-05 18:31:37 +01:00
Adrian Roos
56ff784385 Apilint: lint for URL/URI
Test: python apilint_test.py
Change-Id: Iebe3b48df7ed69e0b5f5ff372b72f68ca9f8efec
2019-03-05 17:57:56 +01:00
Adrian Roos
02e18ddf13 Apilint: report all implemented interfaces and fix false positives
Test: python apilint_test.py
2019-02-28 12:46:23 +01:00
Adrian Roos
d9871b14df Apilint: properly parse packages with numbers
Test: python apilint_tests.py
Change-Id: Ib0ad635e3994bbcbfecefddbd4899c3551ab65cf
2019-02-28 12:46:23 +01:00
Adrian Roos
80545ef56d Apilint: Lint missing nullability annotations
Also adds support for limited range blame parsing.

Bug: 124882145
Test: python apilint_test.py
Change-Id: Idbc7f67eeff27902c37ec482278f5888781c6e78
2019-02-28 12:46:04 +01:00
Adrian Roos
deb0ff2bf4 Apilint: Enforce final builders
Test: run apilint
Bug: 124883027
Change-Id: I7f2866e46bc40be60487846b2af9f8fd7edb7623
2019-02-28 09:54:08 +00:00
Adrian Roos
57b5479a6b Merge "apilint: Correctly parse packages with annotations" 2019-02-27 15:50:21 +00:00
Adrian Roos
b1faa0bf5b apilint: Correctly parse packages with annotations
Test: python apilint_test.py
Change-Id: Ifce9fe3836b2bb46b0d0a255b912fd8bf0195621
2019-02-26 11:54:40 +01:00
Adrian Roos
cf82e04400 apilint: Allow parsing 3.0 signature files
Test: python apilint_test.py
Change-Id: I59df950229c05329afde93f94efc13adb4640ad7
2019-01-29 15:01:28 +01:00
Adrian Roos
258c572d5e apilint: correctly parse enum_constant
Change-Id: I1a243caa3a01837ff989d21926478f20d70372ae
Fixes: 120132045
Test: python apilint_test.py
(cherry picked from commit 373df11baa)
2019-01-22 11:42:39 +01:00
Adrian Roos
d1e3892119 ApiLint: Add operator keyword and property parsing
Also fix up some issues with expression parsing, type use annotations, etc.

Test: python tools/apilint/apilint_test.py
Change-Id: I38145a51470ce6c3e5813a546d681489fd87fc19
(cherry picked from commit 403c8e35d8)
2019-01-22 11:36:38 +01:00
Adrian Roos
5cdfb69429 ApiLint: Add Kotlin-style type support
Test: tools/apilint/apilint_sha.sh HEAD && python tools/apilint/apilint_test.py
Change-Id: Iac1fdabcbeffe57c8288d73b2359e8ce0b2bc3eb
(cherry picked from commit 7884d6b909)
2019-01-22 11:36:37 +01:00
Adrian Roos
1f1b6a8464 ApiLint: Performance improvements for verification
Test: tools/apilint/apilint_sha.sh HEAD
Test: python tools/apilint/apilint_test.py
Change-Id: I90f18181cd0d3c43f176d7c9d1b198f6f5172390
(cherry picked from commit 7f8886a993)
2019-01-22 11:36:37 +01:00
Adrian Roos
e5eeae7c23 ApiLint: Performance improvements for 2.0 signature format parsing
Test: tools/apilint/apilint_sha.sh HEAD
Test: python tools/apilint/apilint_test.py
Change-Id: I76b979dd81702afce6468ac377230e589a25e08f
(cherry picked from commit a30d062775)
2019-01-22 11:36:37 +01:00
Adrian Roos
b787c183a2 ApiLint: Allow parsing 2.0 API signature files
Test: tools/apilint/apilint_sha.sh HEAD
Test: python tools/apilint/apilint_test.py
Change-Id: Id2e1792392b3626746f1ec99f481d0cb27e523a1
(cherry picked from commit d170961b02)
2019-01-22 11:36:37 +01:00
Adrian Roos
038a02992a apilint: Fix API lint issues 2/2
Fixes false positives that occur when a class in current.txt is faulty, and an
entry for that class is then added to system-current.txt.

This was so because when parsing the previous revison's system-current.txt, we
did not know about the class and thus didn't look for it in current.txt, and
thus never recorded that the error is preexisting.

To avoid that, we track all classes in system-current.txt with a matching entry
in current.txt in the current revision, and later use that to look up all classes we
may have missed when examining the previous revision.

Test: python tools/apilint/apilint_test.py
Change-Id: Ibe09f1159e351e56b35b8816ce0db760de4ef791
(cherry picked from commit 61e3730bc0)
2019-01-22 11:36:36 +01:00
Adrian Roos
5ed42b6a2e apilint: Fix API lint issues
Fixes a bug where only the name instead of the fully qualified name was
considered when looking for a class, which lead to faulty results for inner
classes.

Test: python tools/apilint/apilint_test.py
Change-Id: Ib015669ed3faef21d2bdd16f1e27bc55c8669d70
(cherry picked from commit 2c5cacfd36)
2019-01-22 11:36:36 +01:00
Adrian Roos
6eb57b0f4a API Lint: Add support for base current.txt
Allows specifying a base current.txt and previous.txt file when linting
system-current.txt and test-current.txt to avoid false positive error
messages due to public API members not being duplicated in the respective
non-public APIs

Test: python tools/apilint/apilint.py --base-current=api/current.txt api/system-current.txt
Change-Id: I306a99b1423584ef3fcdc9272a83cb5eacc37227
(cherry picked from commit 7690d0d4ee)
2019-01-22 11:36:36 +01:00
Jeff Sharkey
a8e5df06a0 Guide towards Context.createPackageContextAsUser().
It's a better alternative that should be used instead of adding
new "ForUser" or "AsUser" methods.

Bug: 115654727
Test: manual
Change-Id: I8742c2ef42d743ef69f8f7a91378f498fdc81e43
(cherry picked from commit 86445841ac)
2019-01-22 11:36:36 +01:00
Jeff Sharkey
eff9e228c1 Moar lint rulez!
Bug: 37534642, 116675691, 116798271, 72059458, 111790177
Test: manual
Change-Id: Ib079ae580a827f225be08f90dbdddeee7d341c48
(cherry picked from commit daac37f229)
2019-01-22 11:36:35 +01:00
Siyamed Sinir
0a2e15dd6e Update lint rules for graphics/text package layering
Test: N/A
Bug: 77347886
Change-Id: I907d99b4a1dee0c69b914e55a033d3d9c4eebe56
(cherry picked from commit e23aeb8024)
2019-01-22 11:36:35 +01:00
Jeff Sharkey
40d67f4b6d Handle new current.txt format.
We're starting to see "@interface" show up, so handle them like any
other interface.  We're also seeing more details argument lists
with names and annotations; ignore them for now, since all our
existing lint checks work on the "real" data type.

Verified that it handles new support library current.txt files
without causing any regressions against existing framework
current.txt files.

Test: manual inspection
Bug: 111555356
Change-Id: Id11c3561edd317e4ba1a9b43993fd96d8243e00d
(cherry picked from commit bd26119169)
2019-01-22 11:36:34 +01:00
Jeff Sharkey
fe5ee6e74b Extend lint script to emit API statistics.
Bug: 77588754
Test: manual
Change-Id: I240dba5fae1a8635a4265a1af903517f00dec54c
(cherry picked from commit daa7cf3a36)
2019-01-22 11:36:34 +01:00
Jeff Sharkey
8b141b9db0 Lint to identify "deprecated at birth" APIs.
When API council requests changes, teams regularly perform the
requested refactoring, but simply mark the old APIs as @Deprecated
without @removed, due to internal users.

As part of finalizing an SDK, we should ensure that no new APIs are
marked @Deprecated, since they're typically cleanup that someone
forgot to finish.  This extension to the lint script makes it easy
to identify these cases.

$ python tools/apilint/apilint.py --show-deprecations-at-birth \
        api/current.txt ../../prebuilts/sdk/api/28.txt

$ python tools/apilint/apilint.py --show-deprecations-at-birth \
        api/system-current.txt ../../prebuilts/sdk/system-api/28.txt

Bug: 77588754
Test: manual inspection
Change-Id: Ie9658006bb08f780bee0e503481d3bafec1038a1
2018-04-11 10:43:16 -06:00
Jeff Sharkey
ee21f695b6 Recommend ICU replacements, no clone, no Impl.
When ICU has a better replacement class, recommend that APIs use
that instead.

Yell if someone implements clone(), and point them towards a copy
constructor instead.

Yell if someone exposes "Impl" classes.

Test: manual
Bug: 73392214, 71906588, 62627348
Change-Id: I75dcba2c4ab7ca426057eefb0335c935c3ced79a
2018-02-16 13:29:32 -07:00
Jeff Sharkey
336dd0bf63 Add another pass of commont lint rules.
-- Parcelables should be inflated through CREATOR
-- Methods with no arguments should throw ISE
-- Examine constructors for Executors
-- Listeners should always be last for lambdas
-- Verify naming of UserHandle methods
-- Verify naming of Params objects
-- Verify naming of Context service constants
-- Verify tense of enabled methods

Better exception tracking.

Test: manual inspection
Bug: 37784434, 37749454, 37705832
Bug: 37705176, 37536230, 37533040, 71866617
Change-Id: If2f19784c46a4d99f54577a7365babfd357ca3f7
2018-01-12 12:12:29 -07:00
Jeff Sharkey
bedb3fcf1d Executors instead of Handlers; collections.
New API council guidance is to have developers provide an Executor
instead of a Handler for specifying where a callback should be
dispatched.

Recommend that raw arrays be switched to Collections<> instead.

Disable overload checking, since it's far too noisy.

Test: sanity-checked linter output
Bug: 37893784, 34192159
Change-Id: Ifc9a69bfed1a1004c6604e12987a606d1d3fd6af
2017-12-05 09:42:31 -07:00
Jeff Sharkey
c6c6c349f9 Collect set of "changed" classes.
Generate hash of each class to quickly identify which classes have
been touched between two API files.

Test: manually verified
Bug: 69115817
Change-Id: I0be92ec8a4e9ef6ca603e70c8164e10a2eaf4161
2017-11-20 13:48:45 -07:00
Jason Monk
53b2a73c37 Add api lint to upload checks
Currently will never block upload, only considered a warning, but
will print out any lint issues discovered.

Test: do an upload
Bug: 69115822
Change-Id: I69b8e5a3f92ac28ee3c954408e88a1056c33af65
2017-11-13 13:25:05 -05:00
Jake Wharton
9e6738f101 Add checks for Kotlin keywords and operator functions.
Test: Ran against current.txt and observed warnings.
Change-Id: I071d564885be3a0c97bca77d93c9a107ecde583c
2017-08-23 14:22:31 -04:00
Joe LaPenna
4538000dca Stop deprecated parcelables triggering Error FW8
Test: Ran against system-current with and without the cl.

Change-Id: I492e211701b16e660bbc57913220a93df1ed31ac
2017-05-04 16:25:39 +00:00
Jeff Sharkey
24bda1d6c8 Bunch of new API lint rules.
Test: manual verification
Fixes: 34709091
Fixes: 36699437
Fixes: 36737455
Fixes: 36737419
Fixes: 37279778
Fixes: 37283667
Fixes: 37473581
Fixes: 37505566
Fixes: 37509300
Change-Id: Ie5dbcc2932313225e5cbc1f4aa6961e4db2f3d45
2017-04-19 16:40:54 -06:00
Jeff Sharkey
40d623e676 Tighter equals/hashCode method checking.
Test: false-positive no longer triggered
Bug: 32721082
Change-Id: I49b6225a7282d0bb84b0dfb4cabe56e9f68186a9
2016-12-21 13:58:42 -07:00
Jeff Sharkey
26c8090647 Detect non-static abstract inner classes.
Test: script detects issue
Bug: 32982018
Change-Id: I4e3521bf603f6272bfe5583e3d4977dd5b59afe8
2016-12-21 13:42:03 -07:00
Filip Pavlis
db234ef0ac Adds keyword "default" to the API-linter.
This will fix issue when linting Java 8 default methods on interfaces,
e.g. Ie46a876dcb14b46b8b2584735c106c25655ec6cf.

Test: Manualy tried that the linter no longer gives the error.

Change-Id: I68ade6ba6401439667408076a5454caef77ef72d
2016-11-29 19:21:21 +00:00
Jeff Sharkey
70168dde6e Make Parcelable classes final, API cleanup.
Remove some Context methods that leaked through.  Add lint rule to
recommend using List<? extends Parcelable> instead of Parcelable[].

Bug: 27932224, 27930145, 27932911
Change-Id: Ia302de46cdb0c5101fa175a09316df91aeefcf0d
2016-03-30 23:31:39 -06:00
Jeff Sharkey
331279b239 More lint checks.
-- Error if Parcelable classes aren't final.
-- Warn that MIN_/MAX_ constants that should be dynamic.
-- Error if throwing raw RemoteException.
-- Warn if methods accept File without stream variants.
-- Ignore upstream ICU project.

Bug: 27410989
Change-Id: I12d843e63078dc696c1798a20e088608f1ba9ed1
2016-02-29 16:19:46 -07:00
Adam Powell
539ea12810 Relax apilint FW1 error to a warning
This rule was catching simple getters ("getIntent") as errors even if
the method is a true property get method. Relax to warning until we
can make this a bit more clever.

Change-Id: If183ad5bdc076ce2252399d4abcc8a3a6cbb55c3
2015-04-10 13:07:52 -07:00
Adam Metcalf
1c7e70aaf8 Add support for GmsCore to apilint.py
Add flag to allow references to google.
Refactor argument parsing to use argparse.

Change-Id: I5fd3b6628a00113b9644dcae2919632db056909d
2015-03-27 16:17:23 -07:00
Jeff Sharkey
047d7f0c6d Relax Handler lint check slightly.
This way we avoid yelling at support library APIs.

Change-Id: I20bab887fe8b1c7f4d197273ddedbcda48c5a429
2015-02-25 12:06:40 -08:00
Jeff Sharkey
a18a2e3428 Switch to incremental API parsing.
Incremental API parsing works on a single class at a time, which
greatly reduces memory pressure.  For example, linting a typical
current.txt would use ~100MB before; now it only uses about ~15MB!

Change-Id: Id084b3dd2f6513d0e919790d5a5d629f80637ce8
2015-02-22 16:00:19 -08:00
Jeff Sharkey
90b547bb50 Even more lint tests.
Updated boolean set/get tests to handle isFoo() and hasFoo() style
methods.

When listeners are passed as method argument, they should come near
the end of the argument list.

Verify that resources are named consistently.

Slightly clearer message wording overall.

Change-Id: Id22947bd932d82222ce3e6c6e2012dade348fb56
2015-02-18 16:45:58 -08:00
Jeff Sharkey
b46a9690d5 More lint tests.
When overloading methods, verify that common arguments always come
first and have consistent ordering.

When methods register listeners or callbacks (outside of the UI
toolkit), verify that an overload exists that takes a Handler to
deliver events through.

When a method accepts a Context argument, it must be the first
argument.

Change-Id: I6a6f94a3a0a8c48987835e47eb87564e569db2af
2015-02-17 17:19:45 -08:00
Jeff Sharkey
9f64d5c6c4 Reference lint rule numbers, more rules.
When reporting lint errors/warnings, reference the relevant
underlying rule.  Also adds a few more lint rules, and removes a few
aggressive checks.

Change-Id: I1bdadf5fd4df9cd28bb7dfe1c7bb1f9055398315
2015-02-14 17:06:06 -08:00