[JS IR BE] Fix private members lowering
- visit over file instead of class
This commit is contained in:
+32
-21
@@ -5,17 +5,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.lower
|
package org.jetbrains.kotlin.ir.backend.js.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor
|
import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor
|
import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
@@ -29,31 +27,45 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
|||||||
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
import org.jetbrains.kotlin.ir.util.transformFlat
|
import org.jetbrains.kotlin.ir.util.transformFlat
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
val STATIC_THIS_PARAMETER = object : IrDeclarationOriginImpl("STATIC_THIS_PARAMETER") {}
|
private val STATIC_THIS_PARAMETER = object : IrDeclarationOriginImpl("STATIC_THIS_PARAMETER") {}
|
||||||
|
|
||||||
class PrivateMembersLowering(val context: JsIrBackendContext) : ClassLoweringPass {
|
class PrivateMembersLowering(val context: JsIrBackendContext) : FileLoweringPass {
|
||||||
private val memberMap = mutableMapOf<IrSimpleFunctionSymbol, IrSimpleFunction>()
|
private val memberMap = mutableMapOf<IrSimpleFunctionSymbol, IrSimpleFunction>()
|
||||||
|
|
||||||
override fun lower(irClass: IrClass) {
|
override fun lower(irFile: IrFile) {
|
||||||
|
transformPrivateDeclarations(irFile)
|
||||||
|
transformPrivateUseSites(irFile)
|
||||||
|
|
||||||
|
memberMap.clear()
|
||||||
|
}
|
||||||
|
|
||||||
irClass.declarations.transformFlat {
|
private fun transformPrivateDeclarations(irFile: IrFile) {
|
||||||
when (it) {
|
irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
|
||||||
is IrSimpleFunction -> transformMemberToStaticFunction(it)?.let { staticFunction ->
|
override fun visitClass(declaration: IrClass): IrStatement {
|
||||||
memberMap[it.symbol] = staticFunction
|
declaration.transformChildrenVoid(this)
|
||||||
listOf(staticFunction)
|
declaration.declarations.transformFlat {
|
||||||
|
when (it) {
|
||||||
|
is IrSimpleFunction -> transformMemberToStaticFunction(it)?.let { staticFunction ->
|
||||||
|
memberMap[it.symbol] = staticFunction
|
||||||
|
listOf(staticFunction)
|
||||||
|
}
|
||||||
|
is IrProperty -> listOf(it.apply {
|
||||||
|
this.getter = this.getter?.let { g -> transformAccessor(g) }
|
||||||
|
this.setter = this.setter?.let { s -> transformAccessor(s) }
|
||||||
|
})
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is IrProperty -> listOf(it.apply {
|
return declaration
|
||||||
getter = getter?.let { g -> transformAccessor(g) }
|
|
||||||
setter = setter?.let { s -> transformAccessor(s) }
|
|
||||||
})
|
|
||||||
else -> null
|
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
}
|
||||||
|
|
||||||
irClass.transform(object : IrElementTransformerVoid() {
|
private fun transformPrivateUseSites(irFile: IrFile) {
|
||||||
|
irFile.transform(object : IrElementTransformerVoid() {
|
||||||
override fun visitCall(expression: IrCall): IrExpression {
|
override fun visitCall(expression: IrCall): IrExpression {
|
||||||
super.visitCall(expression)
|
super.visitCall(expression)
|
||||||
|
|
||||||
@@ -97,7 +109,6 @@ class PrivateMembersLowering(val context: JsIrBackendContext) : ClassLoweringPas
|
|||||||
} else expression
|
} else expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun transformPrivateToStaticCall(expression: IrCall, staticTarget: IrSimpleFunction): IrCall {
|
private fun transformPrivateToStaticCall(expression: IrCall, staticTarget: IrSimpleFunction): IrCall {
|
||||||
val newExpression = IrCallImpl(
|
val newExpression = IrCallImpl(
|
||||||
expression.startOffset, expression.endOffset,
|
expression.startOffset, expression.endOffset,
|
||||||
|
|||||||
+5
@@ -6494,6 +6494,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/propertyAccess/packagePropertySet.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/packagePropertySet.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateClassesWithPrivateMembers.kt")
|
||||||
|
public void testPrivateClassesWithPrivateMembers() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/propertyAccess/privateClassesWithPrivateMembers.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("privatePropertyAccessFromMethod.kt")
|
@TestMetadata("privatePropertyAccessFromMethod.kt")
|
||||||
public void testPrivatePropertyAccessFromMethod() throws Exception {
|
public void testPrivatePropertyAccessFromMethod() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/propertyAccess/privatePropertyAccessFromMethod.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/privatePropertyAccessFromMethod.kt");
|
||||||
|
|||||||
+5
@@ -6514,6 +6514,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/propertyAccess/packagePropertySet.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/packagePropertySet.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateClassesWithPrivateMembers.kt")
|
||||||
|
public void testPrivateClassesWithPrivateMembers() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/propertyAccess/privateClassesWithPrivateMembers.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("privatePropertyAccessFromMethod.kt")
|
@TestMetadata("privatePropertyAccessFromMethod.kt")
|
||||||
public void testPrivatePropertyAccessFromMethod() throws Exception {
|
public void testPrivatePropertyAccessFromMethod() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/propertyAccess/privatePropertyAccessFromMethod.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/privatePropertyAccessFromMethod.kt");
|
||||||
|
|||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
// EXPECTED_REACHABLE_NODES: 1305
|
||||||
|
|
||||||
|
private class A {
|
||||||
|
private val f = "OK"
|
||||||
|
inline fun ii() = f
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class B {
|
||||||
|
private val a = A()
|
||||||
|
fun foo() = a.ii()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = B().foo()
|
||||||
Reference in New Issue
Block a user