Skip to content

Commit 66bdb9c

Browse files
JSMonkSpace Team
authored and
Space Team
committed
[K/JS] Fix private constructor delegating inside single class with ES6 mode ^KT-59335 Fixed
1 parent 79dbacb commit 66bdb9c

File tree

11 files changed

+51
-8
lines changed

11 files changed

+51
-8
lines changed

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,13 @@ object JsIrBuilder {
189189
isVar: Boolean = false,
190190
isConst: Boolean = false,
191191
isLateinit: Boolean = false,
192-
initializer: IrExpression? = null
192+
initializer: IrExpression? = null,
193+
origin: IrDeclarationOrigin = SYNTHESIZED_DECLARATION
193194
): IrVariable = buildVariable(
194195
parent,
195196
UNDEFINED_OFFSET,
196197
UNDEFINED_OFFSET,
197-
SYNTHESIZED_DECLARATION,
198+
origin,
198199
Name.identifier(name),
199200
type,
200201
isVar,

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorCallLowering.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,10 @@ class ES6ConstructorCallLowering(val context: JsIrBackendContext) : BodyLowering
4444
}
4545
}
4646

47-
val isDelegatingCall =
48-
expression.isSyntheticDelegatingReplacement && currentFunction != null && currentFunction.parentAsClass != irClass
47+
val isDelegatingCall = expression.isSyntheticDelegatingReplacement && currentFunction != null
4948

5049
val factoryFunctionCall = JsIrBuilder.buildCall(
5150
factoryFunction.symbol,
52-
superQualifierSymbol = irClass.symbol.takeIf { isDelegatingCall },
5351
origin = if (isDelegatingCall) ES6_DELEGATING_CONSTRUCTOR_REPLACEMENT else JsStatementOrigins.SYNTHESIZED_STATEMENT
5452
).apply {
5553
copyValueArgumentsFrom(expression, factoryFunction)

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ class ES6ConstructorLowering(val context: JsIrBackendContext) : DeclarationTrans
155155
type = irClass.defaultType,
156156
parent = this,
157157
name = Namer.SYNTHETIC_RECEIVER_NAME,
158-
initializer = initializer
158+
initializer = initializer,
159+
origin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE
159160
)
160161
}
161162

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6PrimaryConstructorOptimizationLowering.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,9 @@ class ES6CollectPrimaryConstructorsWhichCouldBeOptimizedLowering(private val con
226226
}
227227

228228
private fun IrClass.canBeOptimized(): Boolean {
229-
return superClass?.symbol != context.throwableClass && !isSubclassOfExternalClassWithRequiredBoxParameter() && !hasPrimaryDelegatedToSecondaryOrSecondaryToPrimary()
229+
return superClass?.symbol != context.throwableClass &&
230+
!isSubclassOfExternalClassWithRequiredBoxParameter() &&
231+
!hasPrimaryDelegatedToSecondaryOrSecondaryToPrimary()
230232
}
231233

232234
private fun IrClass.hasPrimaryDelegatedToSecondaryOrSecondaryToPrimary(): Boolean {

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs
77

88
import org.jetbrains.kotlin.backend.common.ir.inlineFunction
99
import org.jetbrains.kotlin.backend.common.ir.innerInlinedBlockOrThis
10+
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
1011
import org.jetbrains.kotlin.ir.backend.js.utils.JsGenerationContext
1112
import org.jetbrains.kotlin.ir.backend.js.utils.emptyScope
1213
import org.jetbrains.kotlin.ir.backend.js.utils.isTheLastReturnStatementIn

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ fun translateCall(
205205
Pair(function, superQualifier.owner)
206206
}
207207

208-
if (expression.isSyntheticDelegatingReplacement || currentDispatchReceiver.canUseSuperRef(context, klass)) {
208+
if (currentDispatchReceiver.canUseSuperRef(context, klass)) {
209209
return JsInvocation(JsNameRef(context.getNameForMemberFunction(target), JsSuperRef()), arguments)
210210
}
211211

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// EXPECTED_REACHABLE_NODES: 1344
2+
open class MyClass1 private constructor(val value: String) {
3+
constructor(i: Int): this(i.toString())
4+
}
5+
6+
class MyClass2 : MyClass1 {
7+
constructor(i: Int): super(i)
8+
}
9+
10+
fun test(x: Any) = x is MyClass2
11+
12+
fun box(): String {
13+
val b = test(MyClass2(0))
14+
15+
return if (b) "OK" else "NOT OK"
16+
}

0 commit comments

Comments
 (0)