diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt index 6479ec5..8da6f44 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt @@ -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 = 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) + } } } diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt index 0cf63c0..d1b0497 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt @@ -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() 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 { diff --git a/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessorTest.kt b/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessorTest.kt index 51bb5bd..4a07c99 100644 --- a/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessorTest.kt +++ b/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessorTest.kt @@ -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() {