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()