Add strings rewrite support into Jetifier.

This is at least some way to rewrite simple reflection references
into the support library. Obvisouly this will not work for strings
concatenation but still better than nothing.

Bug: b/64833662
Test: Tested locally (integration tests)
Change-Id: Idcbb2eefb28569d41902d46bf91bb23430ab2d27
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 {