Merge "[HostStubGen] Now method descriptor is optional in policy files" into main
diff --git a/ravenwood/texts/ravenwood-common-policies.txt b/ravenwood/texts/ravenwood-common-policies.txt
index 08f53977..83c3151 100644
--- a/ravenwood/texts/ravenwood-common-policies.txt
+++ b/ravenwood/texts/ravenwood-common-policies.txt
@@ -14,7 +14,7 @@
 
 # Support APIs not available in standard JRE
 class java.io.FileDescriptor keep
-    method getInt$ ()I @com.android.ravenwood.RavenwoodJdkPatch.getInt$
-    method setInt$ (I)V @com.android.ravenwood.RavenwoodJdkPatch.setInt$
+    method getInt$ @com.android.ravenwood.RavenwoodJdkPatch.getInt$
+    method setInt$ @com.android.ravenwood.RavenwoodJdkPatch.setInt$
 class java.util.LinkedHashMap keep
-    method eldest ()Ljava/util/Map$Entry; @com.android.ravenwood.RavenwoodJdkPatch.eldest
+    method eldest @com.android.ravenwood.RavenwoodJdkPatch.eldest
diff --git a/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/InMemoryOutputFilter.kt b/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/InMemoryOutputFilter.kt
index 59fa464..fc885d6 100644
--- a/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/InMemoryOutputFilter.kt
+++ b/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/InMemoryOutputFilter.kt
@@ -66,6 +66,9 @@
         methodName: String,
         descriptor: String
     ) {
+        if (descriptor == "*") {
+            return
+        }
         if (classes.findMethod(className, methodName, descriptor) == null) {
             log.w("Unknown method $className.$methodName$descriptor")
         }
@@ -92,7 +95,8 @@
             descriptor: String,
             ): FilterPolicyWithReason {
         return mPolicies[getMethodKey(className, methodName, descriptor)]
-                ?: super.getPolicyForMethod(className, methodName, descriptor)
+            ?: mPolicies[getMethodKey(className, methodName, "*")]
+            ?: super.getPolicyForMethod(className, methodName, descriptor)
     }
 
     fun setPolicyForMethod(
@@ -107,7 +111,8 @@
 
     override fun getRenameTo(className: String, methodName: String, descriptor: String): String? {
         return mRenames[getMethodKey(className, methodName, descriptor)]
-                ?: super.getRenameTo(className, methodName, descriptor)
+            ?: mRenames[getMethodKey(className, methodName, "*")]
+            ?: super.getRenameTo(className, methodName, descriptor)
     }
 
     fun setRenameTo(className: String, methodName: String, descriptor: String, toName: String) {
diff --git a/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFileFilterPolicyParser.kt b/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFileFilterPolicyParser.kt
index caf80eb..7462a8c 100644
--- a/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFileFilterPolicyParser.kt
+++ b/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFileFilterPolicyParser.kt
@@ -303,12 +303,21 @@
     }
 
     private fun parseMethod(fields: Array<String>) {
-        if (fields.size < 4) {
-            throw ParseException("Method ('m') expects 3 fields.")
+        if (fields.size < 3 || fields.size > 4) {
+            throw ParseException("Method ('m') expects 3 or 4 fields.")
         }
         val name = fields[1]
-        val signature = fields[2]
-        val policy = parsePolicy(fields[3])
+        val signature: String
+        val policyStr: String
+        if (fields.size <= 3) {
+            signature = "*"
+            policyStr = fields[2]
+        } else {
+            signature = fields[2]
+            policyStr = fields[3]
+        }
+
+        val policy = parsePolicy(policyStr)
 
         if (!policy.isUsableWithMethods) {
             throw ParseException("Method can't have policy '$policy'")
@@ -321,7 +330,7 @@
             policy.withReason(FILTER_REASON)
         )
         if (policy == FilterPolicy.Substitute) {
-            val fromName = fields[3].substring(1)
+            val fromName = policyStr.substring(1)
 
             if (fromName == name) {
                 throw ParseException(
diff --git a/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFilePolicyMethodReplaceFilter.kt b/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFilePolicyMethodReplaceFilter.kt
index d45f414..a3f934c 100644
--- a/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFilePolicyMethodReplaceFilter.kt
+++ b/ravenwood/tools/hoststubgen/src/com/android/hoststubgen/filters/TextFilePolicyMethodReplaceFilter.kt
@@ -48,10 +48,11 @@
         // Maybe use 'Tri' if we end up having too many replacements.
         spec.forEach {
             if (className == it.fromClass &&
-                methodName == it.fromMethod &&
-                descriptor == it.fromDescriptor
+                methodName == it.fromMethod
                 ) {
-                return MethodReplaceTarget(it.toClass, it.toMethod)
+                if (it.fromDescriptor == "*" || descriptor == it.fromDescriptor) {
+                    return MethodReplaceTarget(it.toClass, it.toMethod)
+                }
             }
         }
         return null
diff --git a/ravenwood/tools/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt b/ravenwood/tools/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt
index 3c138d2..2f35d35 100644
--- a/ravenwood/tools/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt
+++ b/ravenwood/tools/hoststubgen/test-tiny-framework/policy-override-tiny-framework.txt
@@ -3,11 +3,11 @@
   # field remove	remove # Implicitly remove
   method <init>	()V	            keep
   method addOne	(I)I	        keep
-  method addOneInner	(I)I	keep
+  method addOneInner	keep
   method toBeRemoved	(Ljava/lang/String;)V	remove
   method addTwo	(I)I	        @addTwo_host
   # method addTwo_host	(I)I	# used as a substitute
-  method nativeAddThree	(I)I	@addThree_host
+  method nativeAddThree	        @addThree_host
   # method addThree_host	(I)I	# used as a substitute
   method unsupportedMethod	()Ljava/lang/String;	throw
   method visibleButUsesUnsupportedMethod	()Ljava/lang/String;	keep