diff options
author | Jeff Sharkey <jsharkey@android.com> | 2019-02-15 13:16:35 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2019-02-15 13:47:51 -0700 |
commit | 176e9f57be142ec55556e0f4ab781df6e393c0ee (patch) | |
tree | 839de8622f1089905b4a33128751f7e821fcf4ce | |
parent | 759e89fc1067031c3c3c8c4d74e1144a2a2ee5b3 (diff) | |
download | platform_external_doclava-176e9f57be142ec55556e0f4ab781df6e393c0ee.tar.gz platform_external_doclava-176e9f57be142ec55556e0f4ab781df6e393c0ee.tar.bz2 platform_external_doclava-176e9f57be142ec55556e0f4ab781df6e393c0ee.zip |
Automatic documentation for "@Column" annotation.
We have various "contract" classes across the OS which describe the
columns that are available for insert(), update(), and query() when
working with ContentProviders.
To help ensure that the underlying providers fully support the API
contracts being made, this change defines a new "@Column" annotation
which describes the underlying data type.
These annotations can then be used by the ContentProvider
implementations internally to ensure that they're fully meeting the
API contracts being made.
Bug: 120429729
Test: manual
Change-Id: Iffeb5fce4a1186e0b4aa3424ecb69a34f6607c21
-rw-r--r-- | res/assets/templates-sdk/macros_override.cs | 12 | ||||
-rw-r--r-- | src/com/google/doclava/AndroidAuxSource.java | 40 |
2 files changed, 52 insertions, 0 deletions
diff --git a/res/assets/templates-sdk/macros_override.cs b/res/assets/templates-sdk/macros_override.cs index 8ef81cf..5c0c482 100644 --- a/res/assets/templates-sdk/macros_override.cs +++ b/res/assets/templates-sdk/macros_override.cs @@ -68,6 +68,7 @@ def:aux_tag_list(tags) ?><?cs elif:tag.kind == "@permission" ?><?cs call:dump_permission(tag) ?><?cs elif:tag.kind == "@service" ?><?cs call:dump_service(tag) ?><?cs elif:tag.kind == "@feature" ?><?cs call:dump_feature(tag) ?><?cs + elif:tag.kind == "@column" ?><?cs call:dump_column(tag) ?><?cs /if ?><?cs /each ?></p><?cs /def ?><?cs @@ -143,3 +144,14 @@ def:dump_feature(tag) ?>Requires the <?cs call:tag_list(tag.values[0].commentTags) ?> feature which can be detected using <?cs call:tag_list(tag.values[1].commentTags) ?>.<?cs /def ?> + +# Print output for @column tags ?><?cs +def:dump_column(tag) ?>This constant represents a column name that can be used with a <?cs + call:tag_list(tag.values[0].commentTags) ?> through a <?cs + call:tag_list(tag.values[1].commentTags) ?> or <?cs + call:tag_list(tag.values[2].commentTags) ?> object. The values stored in this column are <?cs + call:tag_list(tag.values[3].commentTags) ?><?cs + if tag.readOnly ?>, and are read-only and cannot be mutated<?cs + else ?><?cs + /if ?>.<?cs +/def ?> diff --git a/src/com/google/doclava/AndroidAuxSource.java b/src/com/google/doclava/AndroidAuxSource.java index 1c97b18..ca1fbd0 100644 --- a/src/com/google/doclava/AndroidAuxSource.java +++ b/src/com/google/doclava/AndroidAuxSource.java @@ -219,6 +219,46 @@ public class AndroidAuxSource implements AuxSource { valueTags.toArray(TagInfo.getArray(valueTags.size())))); } + // Document provider columns + if ((type == TYPE_FIELD) && annotation.type().qualifiedNameMatches("android", "Column")) { + String value = null; + boolean readOnly = false; + for (AnnotationValueInfo val : annotation.elementValues()) { + switch (val.element().name()) { + case "value": + value = String.valueOf(val.value()); + break; + case "readOnly": + readOnly = Boolean.parseBoolean(String.valueOf(val.value())); + break; + } + } + + ArrayList<TagInfo> valueTags = new ArrayList<>(); + valueTags.add(new ParsedTagInfo("", "", + "{@link android.content.ContentProvider}", null, SourcePositionInfo.UNKNOWN)); + valueTags.add(new ParsedTagInfo("", "", + "{@link android.content.ContentValues}", null, SourcePositionInfo.UNKNOWN)); + valueTags.add(new ParsedTagInfo("", "", + "{@link android.database.Cursor}", null, SourcePositionInfo.UNKNOWN)); + + ClassInfo cursorClass = annotation.type().findClass("android.database.Cursor"); + for (FieldInfo field : cursorClass.fields()) { + if (field.isHiddenOrRemoved()) continue; + if (String.valueOf(field.constantValue()).equals(value)) { + valueTags.add(new ParsedTagInfo("", "", + "{@link android.database.Cursor#" + field.name() + "}", + null, SourcePositionInfo.UNKNOWN)); + } + } + if (valueTags.size() < 4) continue; + + Map<String, String> args = new HashMap<>(); + if (readOnly) args.put("readOnly", "true"); + tags.add(new AuxTagInfo("@column", "@column", SourcePositionInfo.UNKNOWN, args, + valueTags.toArray(TagInfo.getArray(valueTags.size())))); + } + // The remaining annotations below always appear on return docs, and // should not be included in the method body if (type == TYPE_METHOD) continue; |