Merge "Add AbstractDecoysLowering and make all decoys lowerings extend it" into androidx-main
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/AbstractDecoysLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/AbstractDecoysLowering.kt
new file mode 100644
index 0000000..ca1fbb4
--- /dev/null
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/AbstractDecoysLowering.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.compiler.plugins.kotlin.lower.decoys
+
+import androidx.compose.compiler.plugins.kotlin.ModuleMetrics
+import androidx.compose.compiler.plugins.kotlin.lower.AbstractComposeLowering
+import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
+import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
+import org.jetbrains.kotlin.ir.declarations.IrFile
+import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
+import org.jetbrains.kotlin.resolve.BindingTrace
+
+abstract class AbstractDecoysLowering(
+    pluginContext: IrPluginContext,
+    symbolRemapper: DeepCopySymbolRemapper,
+    bindingTrace: BindingTrace,
+    metrics: ModuleMetrics,
+    override val signatureBuilder: IdSignatureSerializer,
+) : AbstractComposeLowering(
+    context = pluginContext,
+    symbolRemapper = symbolRemapper,
+    bindingTrace = bindingTrace,
+    metrics = metrics
+), DecoyTransformBase {
+
+    override fun visitFile(declaration: IrFile): IrFile {
+        var file: IrFile = declaration
+        // since kotlin 1.6.0-RC2 signatureBuilder needs to "know" fileSignature available within
+        // inFile scope. It's necessary to ensure signatures calc for private top level decoys.
+        signatureBuilder.inFile(file = declaration.symbol) {
+            file = super.visitFile(declaration)
+        }
+        return file
+    }
+}
\ No newline at end of file
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
index e966f24..a46b5ac 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
@@ -18,7 +18,6 @@
 
 import androidx.compose.compiler.plugins.kotlin.ComposeFqNames
 import androidx.compose.compiler.plugins.kotlin.ModuleMetrics
-import androidx.compose.compiler.plugins.kotlin.lower.AbstractComposeLowering
 import androidx.compose.compiler.plugins.kotlin.lower.ModuleLoweringPass
 import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
 import org.jetbrains.kotlin.backend.common.ir.addChild
@@ -92,16 +91,16 @@
     pluginContext: IrPluginContext,
     symbolRemapper: DeepCopySymbolRemapper,
     bindingTrace: BindingTrace,
-    override val signatureBuilder: IdSignatureSerializer,
+    signatureBuilder: IdSignatureSerializer,
     metrics: ModuleMetrics,
-) : AbstractComposeLowering(
-    context = pluginContext,
+) : AbstractDecoysLowering(
+    pluginContext = pluginContext,
     symbolRemapper = symbolRemapper,
     bindingTrace = bindingTrace,
-    metrics = metrics
-),
-    ModuleLoweringPass,
-    DecoyTransformBase {
+    metrics = metrics,
+    signatureBuilder = signatureBuilder
+), ModuleLoweringPass {
+
     private val originalFunctions: MutableMap<IrFunction, IrDeclarationParent> = mutableMapOf()
 
     private val decoyAnnotation by lazy {
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt
index b262d6f..2d67806 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt
@@ -70,7 +70,7 @@
             is IdSignature.LoweredDeclarationSignature -> TODO()
             is IdSignature.FileSignature -> TODO()
             is IdSignature.CommonSignature -> id!!
-            is IdSignature.CompositeSignature -> this.getSignatureId()
+            is IdSignature.CompositeSignature -> this.nearestPublicSig().getSignatureId()
             is IdSignature.LocalSignature -> this.getSignatureId()
         }
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt
index ab138c0..60d6519 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/RecordDecoySignaturesTransformer.kt
@@ -19,7 +19,6 @@
 package androidx.compose.compiler.plugins.kotlin.lower.decoys
 
 import androidx.compose.compiler.plugins.kotlin.ModuleMetrics
-import androidx.compose.compiler.plugins.kotlin.lower.AbstractComposeLowering
 import androidx.compose.compiler.plugins.kotlin.lower.ModuleLoweringPass
 import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
 import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
@@ -46,14 +45,13 @@
     override val signatureBuilder: IdSignatureSerializer,
     metrics: ModuleMetrics,
     val mangler: KotlinMangler.IrMangler
-) : AbstractComposeLowering(
-    context = pluginContext,
+) : AbstractDecoysLowering(
+    pluginContext = pluginContext,
     symbolRemapper = symbolRemapper,
     bindingTrace = bindingTrace,
     metrics = metrics,
-),
-    ModuleLoweringPass,
-    DecoyTransformBase {
+    signatureBuilder = signatureBuilder
+), ModuleLoweringPass {
 
     override fun lower(module: IrModuleFragment) {
         module.transformChildrenVoid()
@@ -67,19 +65,18 @@
         val decoyAnnotation = declaration.getAnnotation(DecoyFqNames.Decoy)!!
         val decoyFunction =
             symbolRemapper.getReferencedFunction(declaration.getComposableForDecoy())
-        val sig =
-            signatureBuilder.computeSignature(decoyFunction.owner)
-                as? IdSignature.CommonSignature
+        val sig: IdSignature = signatureBuilder.computeSignature(decoyFunction.owner)
+        val commonSignature: IdSignature.CommonSignature? = findNearestCommonSignature(sig)
 
-        if (sig != null) {
+        if (commonSignature != null) {
             decoyAnnotation.putValueArgument(
                 1,
                 irVarargString(
                     listOf(
-                        sig.packageFqName,
-                        sig.declarationFqName,
-                        sig.id.toString(),
-                        sig.mask.toString()
+                        commonSignature.packageFqName,
+                        commonSignature.declarationFqName,
+                        commonSignature.id.toString(),
+                        commonSignature.mask.toString()
                     )
                 )
             )
@@ -90,6 +87,16 @@
         return super.visitFunction(declaration)
     }
 
+    private fun findNearestCommonSignature(
+        sig: IdSignature
+    ): IdSignature.CommonSignature? {
+        return when (sig) {
+            is IdSignature.CommonSignature -> sig
+            is IdSignature.CompositeSignature -> findNearestCommonSignature(sig.inner)
+            else -> null
+        }
+    }
+
     private fun IrDeclaration.canBeLinkedAgainst(): Boolean =
         mangler.run { [email protected](false) }
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt
index fdb42c4..7763d4e 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/SubstituteDecoyCallsTransformer.kt
@@ -17,7 +17,6 @@
 package androidx.compose.compiler.plugins.kotlin.lower.decoys
 
 import androidx.compose.compiler.plugins.kotlin.ModuleMetrics
-import androidx.compose.compiler.plugins.kotlin.lower.AbstractComposeLowering
 import androidx.compose.compiler.plugins.kotlin.lower.ModuleLoweringPass
 import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
 import org.jetbrains.kotlin.backend.common.ir.remapTypeParameters
@@ -50,16 +49,16 @@
     pluginContext: IrPluginContext,
     symbolRemapper: DeepCopySymbolRemapper,
     bindingTrace: BindingTrace,
-    override val signatureBuilder: IdSignatureSerializer,
+    signatureBuilder: IdSignatureSerializer,
     metrics: ModuleMetrics,
-) : AbstractComposeLowering(
-    context = pluginContext,
+) : AbstractDecoysLowering(
+    pluginContext = pluginContext,
     symbolRemapper = symbolRemapper,
     bindingTrace = bindingTrace,
     metrics = metrics,
-),
-    ModuleLoweringPass,
-    DecoyTransformBase {
+    signatureBuilder = signatureBuilder
+), ModuleLoweringPass {
+
     override fun lower(module: IrModuleFragment) {
         module.transformChildrenVoid()