JVM_IR KT-44744 check accessibility of enum entry 'this'
This commit is contained in:
committed by
TeamCityServer
parent
14cb762133
commit
e630e00e99
+12
@@ -14066,6 +14066,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
|
|||||||
+30
-3
@@ -5,14 +5,22 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.jvm.lower
|
package org.jetbrains.kotlin.backend.jvm.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.*
|
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||||
|
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||||
|
import org.jetbrains.kotlin.backend.common.pop
|
||||||
|
import org.jetbrains.kotlin.backend.common.push
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.IrEnumConstructorCall
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrGetEnumValue
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||||
import org.jetbrains.kotlin.ir.types.classOrNull
|
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||||
|
import org.jetbrains.kotlin.ir.util.isAnonymousObject
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
|
|
||||||
internal val singletonReferencesPhase = makeIrFilePhase(
|
internal val singletonReferencesPhase = makeIrFilePhase(
|
||||||
@@ -38,7 +46,7 @@ private class SingletonReferencesLowering(val context: JvmBackendContext) : File
|
|||||||
override fun visitGetEnumValue(expression: IrGetEnumValue): IrExpression {
|
override fun visitGetEnumValue(expression: IrGetEnumValue): IrExpression {
|
||||||
val candidate = expression.symbol.owner.correspondingClass
|
val candidate = expression.symbol.owner.correspondingClass
|
||||||
val appropriateThis = thisOfClass(candidate)
|
val appropriateThis = thisOfClass(candidate)
|
||||||
return if (candidate != null && appropriateThis != null && !isVisitingSuperConstructor(candidate)) {
|
return if (candidate != null && appropriateThis != null && isThisAccessible(candidate) && !isVisitingSuperConstructor(candidate)) {
|
||||||
// Replace `SomeEnumClass.SomeEnumEntry` with `this`, if possible.
|
// Replace `SomeEnumClass.SomeEnumEntry` with `this`, if possible.
|
||||||
//
|
//
|
||||||
// SomeEnumEntry is a singleton, which is assigned (SETFIELD) to SomeEnumClass after the construction of the singleton is done.
|
// SomeEnumEntry is a singleton, which is assigned (SETFIELD) to SomeEnumClass after the construction of the singleton is done.
|
||||||
@@ -51,6 +59,25 @@ private class SingletonReferencesLowering(val context: JvmBackendContext) : File
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isThisAccessible(irClass: IrClass): Boolean {
|
||||||
|
for (scope in allScopes.asReversed()) {
|
||||||
|
when (val irScopeElement = scope.irElement) {
|
||||||
|
irClass ->
|
||||||
|
return true
|
||||||
|
is IrClass ->
|
||||||
|
if (!irScopeElement.isInner && !irScopeElement.isAnonymousObject)
|
||||||
|
return false
|
||||||
|
is IrField ->
|
||||||
|
if (irScopeElement.isStatic)
|
||||||
|
return false
|
||||||
|
is IrFunction ->
|
||||||
|
if (irScopeElement.dispatchReceiverParameter == null && irScopeElement.visibility != DescriptorVisibilities.LOCAL)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
|
override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
|
||||||
val instanceField = if (allScopes.any { it.irElement == expression.symbol.owner })
|
val instanceField = if (allScopes.any { it.irElement == expression.symbol.owner })
|
||||||
context.cachedDeclarations.getPrivateFieldForObjectInstance(expression.symbol.owner) // Constructor or static method.
|
context.cachedDeclarations.getPrivateFieldForObjectInstance(expression.symbol.owner) // Constructor or static method.
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
enum class ContentType {
|
||||||
|
|
||||||
|
PLAIN_TEXT {
|
||||||
|
override fun convert(text: String, targetType: ContentType): String {
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
MARKDOWN {
|
||||||
|
override fun convert(text: String, targetType: ContentType): String {
|
||||||
|
return when (targetType) {
|
||||||
|
MARKDOWN -> text
|
||||||
|
PLAIN_TEXT -> ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract fun convert(text: String, targetType: ContentType): String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() =
|
||||||
|
ContentType.PLAIN_TEXT.convert("OK", ContentType.PLAIN_TEXT)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
interface IFoo {
|
||||||
|
fun foo(e: En): String
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class En {
|
||||||
|
TEST {
|
||||||
|
inner class Nested : IFoo {
|
||||||
|
private val ee = TEST
|
||||||
|
|
||||||
|
override fun foo(e: En): String {
|
||||||
|
return if (e == ee) e.ok else "Failed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override val ok: String get() = "OK"
|
||||||
|
override fun foo(): IFoo = Nested()
|
||||||
|
},
|
||||||
|
OTHER {
|
||||||
|
override val ok: String get() = throw AssertionError()
|
||||||
|
override fun foo(): IFoo = throw AssertionError()
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract val ok: String
|
||||||
|
abstract fun foo(): IFoo
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = En.TEST.foo().foo(En.TEST)
|
||||||
+12
@@ -14066,6 +14066,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
|
|||||||
+12
@@ -14066,6 +14066,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
|
|||||||
+10
@@ -11553,6 +11553,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
||||||
|
|||||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
Generated
+10
@@ -10321,6 +10321,16 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
||||||
|
|||||||
Generated
+10
@@ -9778,6 +9778,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
||||||
|
|||||||
Generated
+10
@@ -9778,6 +9778,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
||||||
|
|||||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java
Generated
+10
@@ -4797,6 +4797,16 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
runTest("compiler/testData/codegen/box/enum/kt38996.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744.kt")
|
||||||
|
public void testKt44744() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44744_innerClass.kt")
|
||||||
|
public void testKt44744_innerClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/enum/kt44744_innerClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7257.kt")
|
@TestMetadata("kt7257.kt")
|
||||||
public void testKt7257() throws Exception {
|
public void testKt7257() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
runTest("compiler/testData/codegen/box/enum/kt7257.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user