summaryrefslogtreecommitdiff
path: root/tools/processors
diff options
context:
space:
mode:
authorEugene Susla <eugenesusla@google.com>2019-07-25 14:05:12 -0700
committerEugene Susla <eugenesusla@google.com>2019-08-05 16:54:41 -0700
commit3156a4ce21cb4de46f84b8c7264a3dc31dd8db8b (patch)
treecf2a361a56d6f45de239da3ff5f4fa58e1d59431 /tools/processors
parent2eaec69928b0394b7e6979c71a707d1b2418365c (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.kt50
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)
}