diff options
author | Eugene Susla <eugenesusla@google.com> | 2019-07-25 14:05:12 -0700 |
---|---|---|
committer | Eugene Susla <eugenesusla@google.com> | 2019-08-05 16:54:41 -0700 |
commit | 3156a4ce21cb4de46f84b8c7264a3dc31dd8db8b (patch) | |
tree | cf2a361a56d6f45de239da3ff5f4fa58e1d59431 /tools/processors | |
parent | 2eaec69928b0394b7e6979c71a707d1b2418365c (diff) |
Addresses further review comments from ag/8000041
Including:
- An API to opt out of Int/StringDefs generation on per-field basis
- A way to customize Builder
- Non-optional fields are passed in Builder constructor
- Various adjustments to SampleDataclass examples, as requested
Test: . $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/runTest.sh
Change-Id: I32d2eec52f05d505ff07779d923e4793d3036579
Diffstat (limited to 'tools/processors')
-rw-r--r-- | tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt b/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt index e5ec17a1d18d..26b15aecbe33 100644 --- a/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt +++ b/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt @@ -17,6 +17,8 @@ package android.processor.staledataclass +import com.android.codegen.BASE_BUILDER_CLASS +import com.android.codegen.CANONICAL_BUILDER_CLASS import com.android.codegen.CODEGEN_NAME import com.android.codegen.CODEGEN_VERSION import com.sun.tools.javac.code.Symbol @@ -29,6 +31,7 @@ import javax.annotation.processing.SupportedAnnotationTypes import javax.lang.model.SourceVersion import javax.lang.model.element.AnnotationMirror import javax.lang.model.element.Element +import javax.lang.model.element.ElementKind import javax.lang.model.element.TypeElement import javax.tools.Diagnostic @@ -107,20 +110,30 @@ class StaleDataclassProcessor: AbstractProcessor() { private fun processSingleFile(elementAnnotatedWithGenerated: Element) { - val inputSignatures = elementAnnotatedWithGenerated - .enclosingElement - .enclosedElements - .filterNot { - it.annotationMirrors.any { "Generated" in it.annotationType.toString() } - }.map { - elemToString(it) - }.toSet() + val classElement = elementAnnotatedWithGenerated.enclosingElement + + val inputSignatures = computeSignaturesForClass(classElement) + .plus(computeSignaturesForClass(classElement.enclosedElements.find { + it.kind == ElementKind.CLASS + && !isGenerated(it) + && it.simpleName.toString() == BASE_BUILDER_CLASS + })) + .plus(computeSignaturesForClass(classElement.enclosedElements.find { + it.kind == ElementKind.CLASS + && !isGenerated(it) + && it.simpleName.toString() == CANONICAL_BUILDER_CLASS + })) + .plus(classElement + .annotationMirrors + .find { it.annotationType.toString() == DATACLASS_ANNOTATION_NAME } + .toString()) + .toSet() val annotationParams = elementAnnotatedWithGenerated .annotationMirrors .find { ann -> isGeneratedAnnotation(ann) }!! .elementValues - .map { (k, v) -> k.getSimpleName().toString() to v.getValue() } + .map { (k, v) -> k.simpleName.toString() to v.value } .toMap() val lastGenerated = annotationParams["time"] as Long @@ -140,7 +153,7 @@ class StaleDataclassProcessor: AbstractProcessor() { } val source = repoRoot!!.resolve(sourceRelative) - val clazz = elementAnnotatedWithGenerated.enclosingElement.toString() + val clazz = classElement.toString() if (inputSignatures != lastGenInputSignatures) { error(buildString { @@ -157,6 +170,23 @@ class StaleDataclassProcessor: AbstractProcessor() { } } + private fun computeSignaturesForClass(classElement: Element?): List<String> { + if (classElement == null) return emptyList() + val type = classElement as TypeElement + return classElement + .enclosedElements + .filterNot { + it.kind == ElementKind.CLASS + || it.kind == ElementKind.CONSTRUCTOR + || isGenerated(it) + }.map { + elemToString(it) + } + "class ${classElement.simpleName} extends ${type.superclass} implements [${type.interfaces.joinToString(", ")}]" + } + + private fun isGenerated(it: Element) = + it.annotationMirrors.any { "Generated" in it.annotationType.toString() } + private fun error(msg: String) { processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, msg) } |