[automerger] Add strings rewrite support into Jetifier. am: 77d16b08dd

Change-Id: I1e2d06c0a5c31a6e1cd75b76710e16ba39784241
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt
index 374e213..4e526c8 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt
@@ -33,7 +33,7 @@
 class MapGeneratorRemapper(private val config: Config) : CoreRemapper {
 
     companion object {
-        private const val TAG : String = "MapGeneratorRemapper"
+        private const val TAG: String = "MapGeneratorRemapper"
     }
 
     private val typesRewritesMap = hashMapOf<JavaType, JavaType>()
@@ -86,7 +86,7 @@
         return type
     }
 
-    override fun rewriteField(field : JavaField): JavaField {
+    override fun rewriteField(field: JavaField): JavaField {
         if (!isTypeSupported(field.owner)) {
             return field
         }
@@ -114,19 +114,24 @@
         return field
     }
 
-    fun createTypesMap() : TypesMap {
+    override fun rewriteString(value: String): String {
+        // We don't build map from strings
+        return value
+    }
+
+    fun createTypesMap(): TypesMap {
         return TypesMap(typesRewritesMap, fieldsRewritesMap)
     }
 
-    private fun isTypeSupported(type: JavaType) : Boolean {
-        return config.restrictToPackagePrefixes.any{ type.fullName.startsWith(it) }
+    private fun isTypeSupported(type: JavaType): Boolean {
+        return config.restrictToPackagePrefixes.any { type.fullName.startsWith(it) }
     }
 
-    private fun isTypeIgnored(type: JavaType) : Boolean {
+    private fun isTypeIgnored(type: JavaType): Boolean {
         return ignoredTypes.matcher(type.fullName).matches()
     }
 
-    private fun isFieldIgnored(field: JavaField) : Boolean {
+    private fun isFieldIgnored(field: JavaField): Boolean {
         return ignoredFields.matcher(field.name).matches()
     }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt
index 50f3b31..38ce393 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt
@@ -23,7 +23,9 @@
  * High-level re-mapping interface to provide only the refactorings needed by jetifier.
  */
 interface CoreRemapper {
-    fun rewriteType(type: JavaType) : JavaType
+    fun rewriteType(type: JavaType): JavaType
 
-    fun rewriteField(field: JavaField) : JavaField
+    fun rewriteField(field: JavaField): JavaField
+
+    fun rewriteString(value: String): String
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
index 486cc25..71c4e9e 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
@@ -41,12 +41,11 @@
     }
 
     override fun rewriteType(type: JavaType): JavaType {
-        val result = typesMap.types[type]
-
         if (!context.isEligibleForRewrite(type)) {
             return type
         }
 
+        val result = typesMap.types[type]
         if (result != null) {
             Log.i(TAG, "  map: %s -> %s", type, result)
             return result
@@ -57,13 +56,12 @@
         return type
     }
 
-    override fun rewriteField(field : JavaField): JavaField {
-        val result = typesMap.fields[field]
-
+    override fun rewriteField(field: JavaField): JavaField {
         if (!context.isEligibleForRewrite(field.owner)) {
             return field
         }
 
+        val result = typesMap.fields[field]
         if (result != null) {
             Log.i(TAG, "  map: %s -> %s", field, result)
             return result
@@ -74,5 +72,20 @@
         return field
     }
 
+    override fun rewriteString(value: String): String {
+        val type = JavaType.fromDotVersion(value)
+        if (!context.isEligibleForRewrite(type)) {
+            return value
+        }
+
+        val result = typesMap.types[type]
+        if (result != null) {
+            Log.i(TAG, "  map string: %s -> %s", type, result)
+            return result.toDotNotation()
+        }
+
+        // We do not treat string content mismatches as errors
+        return value
+    }
 }
 
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt
index 5debf70..aba4725 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt
@@ -24,14 +24,23 @@
 /**
  * Extends [Remapper] with a capability to rewrite field names together with their owner.
  */
-class CustomRemapper(val remapperImpl: CoreRemapper) : Remapper() {
+class CustomRemapper(private val remapper: CoreRemapper) : Remapper() {
 
     override fun map(typeName: String): String {
-        return remapperImpl.rewriteType(JavaType(typeName)).fullName
+        return remapper.rewriteType(JavaType(typeName)).fullName
+    }
+
+    override fun mapValue(value: Any?): Any? {
+        val stringMaybe = value as? String
+        if (stringMaybe == null) {
+            return super.mapValue(value)
+        }
+
+        return remapper.rewriteString(stringMaybe)
     }
 
     fun mapField(ownerName: String, fieldName: String): JavaField {
-        return remapperImpl.rewriteField(JavaField(ownerName, fieldName))
+        return remapper.rewriteField(JavaField(ownerName, fieldName))
     }
 
     override fun mapFieldName(owner: String?, name: String, desc: String?): String {