Add an argument to be disable proguard code generating (#1353)

Co-authored-by: SeongUg Jung <seongug.jung@hanwha.com>
Co-authored-by: Zac Sweers <pandanomic@gmail.com>
This commit is contained in:
Steve SeongUg Jung
2021-07-16 10:24:31 +09:00
committed by GitHub
parent 3c108919ee
commit 72f464bbdc
3 changed files with 39 additions and 4 deletions

View File

@@ -59,6 +59,13 @@ public class JsonClassCodegenProcessor : AbstractProcessor() {
* * `"javax.annotation.Generated"` (JRE <9)
*/
public const val OPTION_GENERATED: String = "moshi.generated"
/**
* This annotation processing argument disables proguard rule generation.
* Normally, this is not recommended unless end-users build their own JsonAdapter look-up tool.
* This is enabled by default
*/
public const val OPTION_ENABLE_PROGUARD_RULE_GENERATION: String = "moshi.enabledProguardGenerated"
private val POSSIBLE_GENERATED_NAMES = arrayOf(
ClassName("javax.annotation.processing", "Generated"),
ClassName("javax.annotation", "Generated")
@@ -72,6 +79,7 @@ public class JsonClassCodegenProcessor : AbstractProcessor() {
private lateinit var cachedClassInspector: MoshiCachedClassInspector
private val annotation = JsonClass::class.java
private var generatedType: ClassName? = null
private var generateProguardRules: Boolean = true
override fun getSupportedAnnotationTypes(): Set<String> = setOf(annotation.canonicalName)
@@ -87,6 +95,9 @@ public class JsonClassCodegenProcessor : AbstractProcessor() {
"allowable values are $POSSIBLE_GENERATED_NAMES."
)
}
generateProguardRules = processingEnv.options[OPTION_ENABLE_PROGUARD_RULE_GENERATION]?.toBooleanStrictOrNull() ?: true
this.types = processingEnv.typeUtils
this.elements = processingEnv.elementUtils
this.filer = processingEnv.filer
@@ -113,7 +124,7 @@ public class JsonClassCodegenProcessor : AbstractProcessor() {
if (jsonClass.generateAdapter && jsonClass.generator.isEmpty()) {
val generator = adapterGenerator(type, cachedClassInspector) ?: continue
val preparedAdapter = generator
.prepare { spec ->
.prepare(generateProguardRules) { spec ->
spec.toBuilder()
.apply {
@Suppress("DEPRECATION") // This is a Java type
@@ -134,7 +145,9 @@ public class JsonClassCodegenProcessor : AbstractProcessor() {
}
preparedAdapter.spec.writeTo(filer)
preparedAdapter.proguardConfig?.writeTo(filer, type)
if (generateProguardRules) {
preparedAdapter.proguardConfig?.writeTo(filer, type)
}
}
}

View File

@@ -163,7 +163,7 @@ internal class AdapterGenerator(
.initializer("null")
.build()
fun prepare(typeHook: (TypeSpec) -> TypeSpec = { it }): PreparedAdapter {
fun prepare(generatedProguard: Boolean, typeHook: (TypeSpec) -> TypeSpec = { it }): PreparedAdapter {
val reservedSimpleNames = mutableSetOf<String>()
for (property in nonTransientProperties) {
// Allocate names for simple property types first to avoid collisions
@@ -181,7 +181,12 @@ internal class AdapterGenerator(
result.addComment("Code generated by moshi-kotlin-codegen. Do not edit.")
result.addAnnotation(COMMON_SUPPRESS)
result.addType(generatedAdapter)
return PreparedAdapter(result.build(), generatedAdapter.createProguardRule())
val proguardConfig = if (generatedProguard) {
generatedAdapter.createProguardRule()
} else {
null
}
return PreparedAdapter(result.build(), proguardConfig)
}
private fun TypeSpec.createProguardRule(): ProguardConfig {

View File

@@ -355,6 +355,23 @@ class JsonClassCodegenProcessorTest {
"Invalid option value for ${JsonClassCodegenProcessor.OPTION_GENERATED}"
)
}
@Test
fun disableProguardRulesGenerating() {
val result = prepareCompilation(
kotlin(
"source.kt",
"""
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class Foo(val a: Int)
"""
)
).apply {
kaptArgs[JsonClassCodegenProcessor.OPTION_ENABLE_PROGUARD_RULE_GENERATION] = "false"
}.compile()
assertThat(result.generatedFiles.filter { it.endsWith(".pro") }).isEmpty()
}
@Test
fun multipleErrors() {