Simplify renaming and setting of KmType.

Bug: 70169921
Change-Id: I4f248cfb998cc5afa4a1e8339c4ddf5b74dbbcf6
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
index 81324e5..88a1d8c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
 import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
@@ -27,6 +28,7 @@
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import java.util.List;
+import java.util.function.Consumer;
 import kotlinx.metadata.KmConstructor;
 import kotlinx.metadata.KmFunction;
 import kotlinx.metadata.KmProperty;
@@ -185,6 +187,19 @@
     }
   }
 
+  private static KmType setRenamedKmType(
+      DexType type,
+      TypeSignature signature,
+      AppView<AppInfoWithLiveness> appView,
+      NamingLens lens,
+      Consumer<KmType> consumer) {
+    KmType renamedKmType = toRenamedKmType(type, signature, appView, lens);
+    if (renamedKmType != null) {
+      consumer.accept(renamedKmType);
+    }
+    return renamedKmType;
+  }
+
   static KmConstructor toRenamedKmConstructor(
       DexEncodedMethod method,
       AppView<AppInfoWithLiveness> appView,
@@ -233,7 +248,8 @@
     //  corresponding backend definitions, like DexAnnotation (DEX) or Signature attribute (CF).
     MethodTypeSignature signature = GenericSignature.Parser.toMethodTypeSignature(method, appView);
 
-    DexType returnType = method.method.proto.returnType;
+    DexProto proto = method.method.proto;
+    DexType returnType = proto.returnType;
     TypeSignature returnSignature = signature.returnType();
     KmType kmReturnType = toRenamedKmType(returnType, returnSignature, appView, lens);
     if (kmReturnType == null) {
@@ -242,9 +258,9 @@
     kmFunction.setReturnType(kmReturnType);
 
     if (method.isKotlinExtensionFunction()) {
-      assert method.method.proto.parameters.values.length > 0
+      assert proto.parameters.values.length > 0
           : method.method.toSourceString();
-      DexType receiverType = method.method.proto.parameters.values[0];
+      DexType receiverType = proto.parameters.values[0];
       TypeSignature receiverSignature = signature.getParameterTypeSignature(0);
       KmType kmReceiverType = toRenamedKmType(receiverType, receiverSignature, appView, lens);
       if (kmReceiverType == null) {
@@ -297,14 +313,14 @@
       String candidateParameterName,
       AppView<AppInfoWithLiveness> appView,
       NamingLens lens) {
-    KmType kmParamType = toRenamedKmType(parameterType, parameterTypeSignature, appView, lens);
-    if (kmParamType == null) {
-      return null;
-    }
     int flag = valueParameterInfo != null ? valueParameterInfo.flag : flagsOf();
     String name = valueParameterInfo != null ? valueParameterInfo.name : candidateParameterName;
     KmValueParameter kmValueParameter = new KmValueParameter(flag, name);
-    kmValueParameter.setType(kmParamType);
+    KmType kmParamType = setRenamedKmType(
+        parameterType, parameterTypeSignature, appView, lens, kmValueParameter::setType);
+    if (kmParamType == null) {
+      return null;
+    }
 
     if (valueParameterInfo != null && valueParameterInfo.isVararg) {
       if (!parameterType.isArrayType()) {
@@ -314,11 +330,11 @@
       TypeSignature elementSignature =
           parameterTypeSignature != null
               ? parameterTypeSignature.toArrayElementTypeSignature(appView) : null;
-      KmType kmElementType = toRenamedKmType(elementType, elementSignature, appView, lens);
+      KmType kmElementType = setRenamedKmType(
+          elementType, elementSignature, appView, lens, kmValueParameter::setVarargElementType);
       if (kmElementType == null) {
         return null;
       }
-      kmValueParameter.setVarargElementType(kmElementType);
     }
 
     return kmValueParameter;
@@ -471,10 +487,8 @@
         }
         FieldTypeSignature signature =
             GenericSignature.Parser.toFieldTypeSignature(field, appView);
-        kmPropertyType = toRenamedKmType(field.field.type, signature, appView, lens);
-        if (kmPropertyType != null) {
-          kmProperty.setReturnType(kmPropertyType);
-        }
+        kmPropertyType =
+            setRenamedKmType(field.field.type, signature, appView, lens, kmProperty::setReturnType);
         JvmExtensionsKt.setFieldSignature(kmProperty, toJvmFieldSignature(renamedField));
       }
 
@@ -484,29 +498,27 @@
       }
 
       if (criteria == GetterSetterCriteria.MET) {
-        assert getter != null
+        assert getter != null && getter.method.proto.parameters.size() == (isExtension ? 1 : 0)
             : "checkGetterCriteria: " + this.toString();
         MethodTypeSignature signature =
             GenericSignature.Parser.toMethodTypeSignature(getter, appView);
         if (isExtension) {
-          assert getter.method.proto.parameters.size() == 1
-              : "checkGetterCriteria: " + this.toString();
           TypeSignature receiverSignature = signature.getParameterTypeSignature(0);
-          kmReceiverType = toRenamedKmType(
-              getter.method.proto.parameters.values[0], receiverSignature, appView, lens);
-          if (kmReceiverType != null) {
-            kmProperty.setReceiverParameterType(kmReceiverType);
-          }
+          kmReceiverType =
+              setRenamedKmType(
+                  getter.method.proto.parameters.values[0],
+                  receiverSignature,
+                  appView,
+                  lens,
+                  kmProperty::setReceiverParameterType);
         }
 
         DexType returnType = getter.method.proto.returnType;
         TypeSignature returnSignature = signature.returnType();
         if (kmPropertyType == null) {
           // The property type is not set yet.
-          kmPropertyType = toRenamedKmType(returnType, returnSignature, appView, lens);
-          if (kmPropertyType != null) {
-            kmProperty.setReturnType(kmPropertyType);
-          }
+          kmPropertyType = setRenamedKmType(
+              returnType, returnSignature, appView, lens, kmProperty::setReturnType);
         } else {
           // If property type is set already (via backing field), make sure it's consistent.
           KmType kmPropertyTypeFromGetter =
@@ -535,20 +547,21 @@
       }
 
       if (criteria == GetterSetterCriteria.MET) {
-        assert setter != null && setter.method.proto.parameters.size() >= 1
+        assert setter != null && setter.method.proto.parameters.size() == (isExtension ? 2 : 1)
             : "checkSetterCriteria: " + this.toString();
         MethodTypeSignature signature =
             GenericSignature.Parser.toMethodTypeSignature(setter, appView);
         if (isExtension) {
-          assert setter.method.proto.parameters.size() == 2
-              : "checkSetterCriteria: " + this.toString();
           DexType receiverType = setter.method.proto.parameters.values[0];
           TypeSignature receiverSignature = signature.getParameterTypeSignature(0);
           if (kmReceiverType == null) {
-            kmReceiverType = toRenamedKmType(receiverType, receiverSignature, appView, lens);
-            if (kmReceiverType != null) {
-              kmProperty.setReceiverParameterType(kmReceiverType);
-            }
+            kmReceiverType =
+                setRenamedKmType(
+                    receiverType,
+                    receiverSignature,
+                    appView,
+                    lens,
+                    kmProperty::setReceiverParameterType);
           } else {
             // If the receiver type for the extension property is set already (via getter),
             // make sure it's consistent.
@@ -566,10 +579,8 @@
         TypeSignature valueSignature = signature.getParameterTypeSignature(valueIndex);
         if (kmPropertyType == null) {
           // The property type is not set yet.
-          kmPropertyType = toRenamedKmType(valueType, valueSignature, appView, lens);
-          if (kmPropertyType != null) {
-            kmProperty.setReturnType(kmPropertyType);
-          }
+          kmPropertyType =
+              setRenamedKmType(valueType, valueSignature, appView, lens, kmProperty::setReturnType);
         } else {
           // If property type is set already (via either backing field or getter),
           // make sure it's consistent.
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
index 562fdbb..390de2e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
@@ -15,4 +15,12 @@
 
   static final String PKG = KotlinMetadataTestBase.class.getPackage().getName();
   static final String PKG_PREFIX = DescriptorUtils.getBinaryNameFromJavaType(PKG);
+
+  static final String KT_ARRAY = "Lkotlin/Array;";
+  static final String KT_CHAR_SEQUENCE = "Lkotlin/CharSequence;";
+  static final String KT_STRING = "Lkotlin/String;";
+  static final String KT_LONG = "Lkotlin/Long;";
+  static final String KT_LONG_ARRAY = "Lkotlin/LongArray;";
+  static final String KT_MAP = "Lkotlin/collections/Map;";
+  static final String KT_UNIT = "Lkotlin/Unit;";
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
index 1f8fee7..a358113 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
@@ -190,16 +190,16 @@
     kmFunction = kmPackage.kmFunctionExtensionWithUniqueName("csHash");
     assertThat(kmFunction, isExtensionFunction());
     kmTypeSubject = kmFunction.receiverParameterType();
-    assertEquals("Lkotlin/CharSequence;", kmTypeSubject.descriptor());
+    assertEquals(KT_CHAR_SEQUENCE, kmTypeSubject.descriptor());
     kmTypeSubject = kmFunction.returnType();
-    assertEquals("Lkotlin/Long;", kmTypeSubject.descriptor());
+    assertEquals(KT_LONG, kmTypeSubject.descriptor());
 
     kmFunction = kmPackage.kmFunctionExtensionWithUniqueName("longArrayHash");
     assertThat(kmFunction, isExtensionFunction());
     kmTypeSubject = kmFunction.receiverParameterType();
-    assertEquals("Lkotlin/LongArray;", kmTypeSubject.descriptor());
+    assertEquals(KT_LONG_ARRAY, kmTypeSubject.descriptor());
     kmTypeSubject = kmFunction.returnType();
-    assertEquals("Lkotlin/Long;", kmTypeSubject.descriptor());
+    assertEquals(KT_LONG, kmTypeSubject.descriptor());
 
     kmFunction = kmPackage.kmFunctionExtensionWithUniqueName("myApply");
     assertThat(kmFunction, isExtensionFunction());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
index f5d26ae..b100f44 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
@@ -122,16 +122,16 @@
 
     KmValueParameterSubject valueParameter = valueParameters.get(0);
     assertFalse(valueParameter.declaresDefaultValue());
-    assertEquals("Lkotlin/collections/Map;", valueParameter.type().descriptor());
+    assertEquals(KT_MAP, valueParameter.type().descriptor());
     List<KmTypeProjectionSubject> typeArguments = valueParameter.type().typeArguments();
     assertEquals(2, typeArguments.size());
     KmTypeSubject typeArgument = typeArguments.get(0).type();
-    assertEquals("Lkotlin/String;", typeArgument.descriptor());
+    assertEquals(KT_STRING, typeArgument.descriptor());
     typeArgument = typeArguments.get(1).type();
-    assertEquals("Lkotlin/String;", typeArgument.descriptor());
+    assertEquals(KT_STRING, typeArgument.descriptor());
 
     valueParameter = valueParameters.get(1);
     assertTrue(valueParameter.declaresDefaultValue());
-    assertEquals("Lkotlin/String;", valueParameter.type().descriptor());
+    assertEquals(KT_STRING, valueParameter.type().descriptor());
   }
 }
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
index ea12b9e..e3b0952 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
@@ -128,13 +128,13 @@
 
     KmValueParameterSubject valueParameter = valueParameters.get(0);
     assertTrue(valueParameter.isVararg());
-    assertEquals("Lkotlin/String;", valueParameter.varargElementType().descriptor());
+    assertEquals(KT_STRING, valueParameter.varargElementType().descriptor());
 
-    assertEquals("Lkotlin/Array;", valueParameter.type().descriptor());
+    assertEquals(KT_ARRAY, valueParameter.type().descriptor());
     List<KmTypeProjectionSubject> typeArguments = valueParameter.type().typeArguments();
     assertEquals(1, typeArguments.size());
     KmTypeSubject typeArgument = typeArguments.get(0).type();
-    assertEquals("Lkotlin/String;", typeArgument.descriptor());
+    assertEquals(KT_STRING, typeArgument.descriptor());
 
     valueParameter = valueParameters.get(1);
     assertFalse(valueParameter.isVararg());
@@ -144,8 +144,8 @@
     typeArgument = typeArguments.get(0).type();
     assertEquals(cls.getFinalDescriptor(), typeArgument.descriptor());
     typeArgument = typeArguments.get(1).type();
-    assertEquals("Lkotlin/String;", typeArgument.descriptor());
+    assertEquals(KT_STRING, typeArgument.descriptor());
     typeArgument = typeArguments.get(2).type();
-    assertEquals("Lkotlin/Unit;", typeArgument.descriptor());
+    assertEquals(KT_UNIT, typeArgument.descriptor());
   }
 }