PSI/FIR->IR translators: return to 1.7.10 behavior for field references
In 1.7.20 we used the nearest Java-based receiver for such field references in backend. Now we are using use-site receiver again, it can lead to accidental usage of derived class property backing field. This is effectively a revert of KT-49507 fix, see commits: -fa914f20-b0a6508d#KT-54393 Fixed #KT-49507 Planned #KT-52338 Planned
This commit is contained in:
committed by
Space Team
parent
14213ddad2
commit
c0789b5207
+5
-28
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.fir.backend.generators
|
package org.jetbrains.kotlin.fir.backend.generators
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
import org.jetbrains.kotlin.fir.backend.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
@@ -21,7 +20,6 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference
|
|||||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.impl.FirReferencePlaceholderForResolvedAnnotations
|
import org.jetbrains.kotlin.fir.references.impl.FirReferencePlaceholderForResolvedAnnotations
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
|
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.dfa.unwrapSmartcastExpression
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
|
||||||
@@ -39,7 +37,10 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
|
|||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.dump
|
||||||
|
import org.jetbrains.kotlin.ir.util.isFunctionTypeOrSubtype
|
||||||
|
import org.jetbrains.kotlin.ir.util.isInterface
|
||||||
|
import org.jetbrains.kotlin.ir.util.isMethodOfAny
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects
|
import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.isUnchanging
|
import org.jetbrains.kotlin.psi2ir.generators.isUnchanging
|
||||||
@@ -253,30 +254,6 @@ class CallAndReferenceGenerator(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: I don't like using super qualifier symbols to determine field receivers in bytecode properly.
|
|
||||||
// Would be much better to use super qualifiers only in case when it's used explicitly.
|
|
||||||
// However, FE 1.0 does it, and currently we have no better way to provide these receivers.
|
|
||||||
// See KT-49507 and KT-48954 as good examples for cases we try to handle here
|
|
||||||
private fun FirExpression.superQualifierSymbolForField(fieldSymbol: IrFieldSymbol): IrClassSymbol? {
|
|
||||||
val unwrapped = this.unwrapSmartcastExpression()
|
|
||||||
if (unwrapped !is FirQualifiedAccess) return null
|
|
||||||
if (unwrapped.calleeReference is FirSuperReference) return superQualifierSymbol()
|
|
||||||
if (fieldSymbol.owner.correspondingPropertySymbol != null) return null
|
|
||||||
val originalContainingClass = fieldSymbol.owner.parentClassOrNull ?: return null
|
|
||||||
val ownContainingClass = typeRef.toIrType().classifierOrNull?.owner as? IrClass ?: return null
|
|
||||||
// For static field, we shouldn't unwrap fake override in any case
|
|
||||||
if (fieldSymbol.owner.isStatic) return ownContainingClass.symbol
|
|
||||||
// Find first Java super class to avoid possible visibility exposure & separate compilation problems
|
|
||||||
var superQualifierClass = ownContainingClass
|
|
||||||
while (!superQualifierClass.isFromJava() && superQualifierClass !== originalContainingClass) {
|
|
||||||
superQualifierClass = superQualifierClass.superTypes.find {
|
|
||||||
val kind = it.getClass()?.kind
|
|
||||||
kind == ClassKind.CLASS || kind == ClassKind.ENUM_CLASS
|
|
||||||
}?.getClass() ?: break
|
|
||||||
}
|
|
||||||
return superQualifierClass.symbol
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun FirExpression.superQualifierSymbol(): IrClassSymbol? {
|
private fun FirExpression.superQualifierSymbol(): IrClassSymbol? {
|
||||||
if (this !is FirQualifiedAccess) {
|
if (this !is FirQualifiedAccess) {
|
||||||
return null
|
return null
|
||||||
@@ -492,7 +469,7 @@ class CallAndReferenceGenerator(
|
|||||||
IrGetFieldImpl(
|
IrGetFieldImpl(
|
||||||
startOffset, endOffset, symbol, type,
|
startOffset, endOffset, symbol, type,
|
||||||
origin = IrStatementOrigin.GET_PROPERTY.takeIf { calleeReference !is FirDelegateFieldReference },
|
origin = IrStatementOrigin.GET_PROPERTY.takeIf { calleeReference !is FirDelegateFieldReference },
|
||||||
superQualifierSymbol = dispatchReceiver.superQualifierSymbolForField(symbol)
|
superQualifierSymbol = dispatchReceiver.superQualifierSymbol()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is IrValueSymbol -> {
|
is IrValueSymbol -> {
|
||||||
|
|||||||
+6
@@ -17801,6 +17801,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/fieldRename/javaFieldAndCompanionProperty.kt");
|
runTest("compiler/testData/codegen/box/fieldRename/javaFieldAndCompanionProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("javaFieldAndKotlinPrivateProperty.kt")
|
||||||
|
public void testJavaFieldAndKotlinPrivateProperty() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/fieldRename/javaFieldAndKotlinPrivateProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("javaFieldAndKotlinProperty.kt")
|
@TestMetadata("javaFieldAndKotlinProperty.kt")
|
||||||
public void testJavaFieldAndKotlinProperty() throws Exception {
|
public void testJavaFieldAndKotlinProperty() throws Exception {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.psi2ir.generators
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
@@ -37,7 +36,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument
|
|||||||
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.classValueType
|
import org.jetbrains.kotlin.resolve.descriptorUtil.classValueType
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class CallGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
|
class CallGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
|
||||||
@@ -195,21 +193,6 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PropertyDescriptor.containingClassForField(): ClassDescriptor? {
|
|
||||||
val ownContainingClass = containingDeclaration as? ClassDescriptor ?: return null
|
|
||||||
// For static field, we shouldn't unwrap fake override in any case
|
|
||||||
if (dispatchReceiverParameter == null) return ownContainingClass
|
|
||||||
val originalContainingClass = resolveFakeOverride().containingDeclaration as? ClassDescriptor ?: return ownContainingClass
|
|
||||||
// Find first Java super class to avoid possible visibility exposure & separate compilation problems
|
|
||||||
var containingClassForField = ownContainingClass
|
|
||||||
while (context.extensions.computeExternalDeclarationOrigin(containingClassForField) != IR_EXTERNAL_JAVA_DECLARATION_STUB &&
|
|
||||||
containingClassForField !== originalContainingClass
|
|
||||||
) {
|
|
||||||
containingClassForField = containingClassForField.getSuperClassNotAny() ?: break
|
|
||||||
}
|
|
||||||
return containingClassForField
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun generatePropertyGetterCall(
|
private fun generatePropertyGetterCall(
|
||||||
descriptor: PropertyDescriptor,
|
descriptor: PropertyDescriptor,
|
||||||
startOffset: Int,
|
startOffset: Int,
|
||||||
@@ -220,11 +203,10 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
|
|||||||
val irType = descriptor.type.toIrType()
|
val irType = descriptor.type.toIrType()
|
||||||
|
|
||||||
return if (getMethodDescriptor == null) {
|
return if (getMethodDescriptor == null) {
|
||||||
val superQualifierSymbol =
|
val superQualifierSymbol = (call.superQualifier ?: descriptor.containingDeclaration as? ClassDescriptor)?.let {
|
||||||
(call.superQualifier ?: descriptor.containingClassForField())?.let {
|
if (it is ScriptDescriptor) null // otherwise it creates a reference to script as class; TODO: check if correct
|
||||||
if (it is ScriptDescriptor) null // otherwise it creates a reference to script as class; TODO: check if correct
|
else context.symbolTable.referenceClass(it)
|
||||||
else context.symbolTable.referenceClass(it)
|
}
|
||||||
}
|
|
||||||
val fieldSymbol =
|
val fieldSymbol =
|
||||||
context.symbolTable.referenceField(context.extensions.remapDebuggerFieldPropertyDescriptor(descriptor.resolveFakeOverride().original))
|
context.symbolTable.referenceField(context.extensions.remapDebuggerFieldPropertyDescriptor(descriptor.resolveFakeOverride().original))
|
||||||
call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue, _ ->
|
call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue, _ ->
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
// IGNORE_BACKEND: JVM_IR
|
||||||
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
|
// FIR_STATUS: accesses companion property backing field statically and fails (does not work in K1/JVM too)
|
||||||
|
|
||||||
// FILE: Base.java
|
// FILE: Base.java
|
||||||
public class Base {
|
public class Base {
|
||||||
|
|||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
// Note: works accidentally via backing field access
|
||||||
|
// Field VS property: case 4.2
|
||||||
|
// More or less duplicates the case in KT-34943/KT-54393
|
||||||
|
|
||||||
|
// FILE: BaseJava.java
|
||||||
|
public class BaseJava {
|
||||||
|
public String a = "FAIL";
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Derived.kt
|
||||||
|
class Derived : BaseJava() {
|
||||||
|
private val a = "OK"
|
||||||
|
|
||||||
|
fun x() = a
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Derived().x()
|
||||||
-36
@@ -1,36 +0,0 @@
|
|||||||
FILE fqName:<root> fileName:/Derived.kt
|
|
||||||
CLASS CLASS name:Derived modality:FINAL visibility:public superTypes:[<root>.BaseJava]
|
|
||||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Derived
|
|
||||||
CONSTRUCTOR visibility:public <> () returnType:<root>.Derived [primary]
|
|
||||||
BLOCK_BODY
|
|
||||||
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.BaseJava'
|
|
||||||
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Derived modality:FINAL visibility:public superTypes:[<root>.BaseJava]'
|
|
||||||
PROPERTY name:a visibility:public modality:FINAL [val]
|
|
||||||
FIELD PROPERTY_BACKING_FIELD name:a type:kotlin.String visibility:private [final]
|
|
||||||
EXPRESSION_BODY
|
|
||||||
CONST String type=kotlin.String value="FAIL"
|
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-a> visibility:public modality:FINAL <> ($this:<root>.Derived) returnType:kotlin.String
|
|
||||||
correspondingProperty: PROPERTY name:a visibility:public modality:FINAL [val]
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:<root>.Derived
|
|
||||||
BLOCK_BODY
|
|
||||||
RETURN type=kotlin.Nothing from='public final fun <get-a> (): kotlin.String declared in <root>.Derived'
|
|
||||||
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:a type:kotlin.String visibility:private [final]' type=kotlin.String origin=null
|
|
||||||
receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.<get-a>' type=<root>.Derived origin=null
|
|
||||||
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
|
||||||
overridden:
|
|
||||||
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in <root>.BaseJava
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
|
||||||
VALUE_PARAMETER name:other index:0 type:kotlin.Any?
|
|
||||||
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override]
|
|
||||||
overridden:
|
|
||||||
public open fun hashCode (): kotlin.Int [fake_override] declared in <root>.BaseJava
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
|
||||||
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
|
|
||||||
overridden:
|
|
||||||
public open fun toString (): kotlin.String [fake_override] declared in <root>.BaseJava
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
|
||||||
FUN name:box visibility:public modality:FINAL <> () returnType:@[FlexibleNullability] kotlin.String?
|
|
||||||
BLOCK_BODY
|
|
||||||
RETURN type=kotlin.Nothing from='public final fun box (): @[FlexibleNullability] kotlin.String? declared in <root>'
|
|
||||||
GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:a type:@[FlexibleNullability] kotlin.String? visibility:public' type=@[FlexibleNullability] kotlin.String? origin=GET_PROPERTY
|
|
||||||
receiver: CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.Derived' type=<root>.Derived origin=null
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
FILE fqName:<root> fileName:/Derived.kt
|
|
||||||
CLASS CLASS name:Derived modality:FINAL visibility:public superTypes:[<root>.BaseJava]
|
|
||||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Derived
|
|
||||||
CONSTRUCTOR visibility:public <> () returnType:<root>.Derived [primary]
|
|
||||||
BLOCK_BODY
|
|
||||||
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.BaseJava'
|
|
||||||
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Derived modality:FINAL visibility:public superTypes:[<root>.BaseJava]'
|
|
||||||
PROPERTY name:a visibility:public modality:FINAL [val]
|
|
||||||
FIELD PROPERTY_BACKING_FIELD name:a type:kotlin.String visibility:private [final]
|
|
||||||
EXPRESSION_BODY
|
|
||||||
CONST String type=kotlin.String value="FAIL"
|
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-a> visibility:public modality:FINAL <> ($this:<root>.Derived) returnType:kotlin.String
|
|
||||||
correspondingProperty: PROPERTY name:a visibility:public modality:FINAL [val]
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:<root>.Derived
|
|
||||||
BLOCK_BODY
|
|
||||||
RETURN type=kotlin.Nothing from='public final fun <get-a> (): kotlin.String declared in <root>.Derived'
|
|
||||||
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:a type:kotlin.String visibility:private [final]' type=kotlin.String origin=null
|
|
||||||
receiver: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.<get-a>' type=<root>.Derived origin=null
|
|
||||||
PROPERTY FAKE_OVERRIDE name:a visibility:public modality:FINAL [fake_override,var]
|
|
||||||
overridden:
|
|
||||||
public final a: @[FlexibleNullability] kotlin.String? [var]
|
|
||||||
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
|
||||||
overridden:
|
|
||||||
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in <root>.BaseJava
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
|
||||||
VALUE_PARAMETER name:other index:0 type:kotlin.Any?
|
|
||||||
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override]
|
|
||||||
overridden:
|
|
||||||
public open fun hashCode (): kotlin.Int [fake_override] declared in <root>.BaseJava
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
|
||||||
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
|
|
||||||
overridden:
|
|
||||||
public open fun toString (): kotlin.String [fake_override] declared in <root>.BaseJava
|
|
||||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
|
||||||
FUN name:box visibility:public modality:FINAL <> () returnType:@[FlexibleNullability] kotlin.String?
|
|
||||||
BLOCK_BODY
|
|
||||||
RETURN type=kotlin.Nothing from='public final fun box (): @[FlexibleNullability] kotlin.String? declared in <root>'
|
|
||||||
GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:a type:@[FlexibleNullability] kotlin.String? visibility:public' type=@[FlexibleNullability] kotlin.String? origin=GET_PROPERTY
|
|
||||||
receiver: CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.Derived' type=<root>.Derived origin=null
|
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// DUMP_IR
|
// IGNORE_BACKEND: JVM_IR
|
||||||
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
|
// FIR_STATUS: accesses property backing field accidentally and fails with exception (does not work in K1/JVM too)
|
||||||
|
// Field VS property: case 4.1
|
||||||
|
// See KT-54393 for details
|
||||||
|
|
||||||
// FILE: BaseJava.java
|
// FILE: BaseJava.java
|
||||||
public class BaseJava {
|
public class BaseJava {
|
||||||
|
|||||||
+1
-11
@@ -16,18 +16,8 @@ open class Kotlin2 : Java2() {
|
|||||||
|
|
||||||
fun test1(j: Kotlin2) = j.f
|
fun test1(j: Kotlin2) = j.f
|
||||||
|
|
||||||
// JVM_IR_TEMPLATES
|
|
||||||
// @Kotlin2.class:
|
|
||||||
// 2 GETFIELD Java2.f : I
|
|
||||||
|
|
||||||
// JVM_IR_TEMPLATES
|
|
||||||
// @TestKt.class:
|
|
||||||
// 2 GETFIELD Java2.f : I
|
|
||||||
|
|
||||||
// JVM_TEMPLATES
|
|
||||||
// @Kotlin2.class:
|
// @Kotlin2.class:
|
||||||
// 1 GETFIELD Java2.f : I
|
// 1 GETFIELD Java2.f : I
|
||||||
|
|
||||||
// JVM_TEMPLATES
|
|
||||||
// @TestKt.class:
|
// @TestKt.class:
|
||||||
// 1 GETFIELD Java2.f : I
|
// 1 GETFIELD Kotlin2.f : I
|
||||||
@@ -31,13 +31,7 @@ fun test(b : Boolean) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @TestKt.class:
|
// @TestKt.class:
|
||||||
// 1 PUTFIELD JFieldOwner.f : I
|
|
||||||
// 1 PUTFIELD Mid.f : I
|
|
||||||
|
|
||||||
// JVM_IR_TEMPLATES
|
|
||||||
// 2 GETFIELD JFieldOwner.f : I
|
|
||||||
// 0 GETFIELD Mid.f : I
|
|
||||||
|
|
||||||
// JVM_TEMPLATES
|
|
||||||
// 1 GETFIELD JFieldOwner.f : I
|
// 1 GETFIELD JFieldOwner.f : I
|
||||||
|
// 1 PUTFIELD JFieldOwner.f : I
|
||||||
// 1 GETFIELD Mid.f : I
|
// 1 GETFIELD Mid.f : I
|
||||||
|
// 1 PUTFIELD Mid.f : I
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ class C : B {
|
|||||||
|
|
||||||
fun f(): @FlexibleNullability String? {
|
fun f(): @FlexibleNullability String? {
|
||||||
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
||||||
return <this>(super<B>).#x
|
return <this>.#x
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun g(): @FlexibleNullability String? {
|
fun g(): @FlexibleNullability String? {
|
||||||
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
||||||
return <this>(super<B>).#y
|
return <this>.#y
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ class C : B {
|
|||||||
|
|
||||||
fun f(): @FlexibleNullability String? {
|
fun f(): @FlexibleNullability String? {
|
||||||
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
||||||
return <this>(super<B>).#x
|
return <this>(super<C>).#x
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun g(): @FlexibleNullability String? {
|
fun g(): @FlexibleNullability String? {
|
||||||
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
return eval<@FlexibleNullability String?>(f = local fun <anonymous>(): @FlexibleNullability String? {
|
||||||
return <this>(super<B>).#y
|
return <this>(super<C>).#y
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -55,7 +55,7 @@ fun test(b: Boolean) {
|
|||||||
else -> d2
|
else -> d2
|
||||||
}
|
}
|
||||||
k.#f = 42
|
k.#f = 42
|
||||||
k(super<JFieldOwner>).#f /*~> Unit */
|
k.#f /*~> Unit */
|
||||||
val md1: DerivedThroughMid1 = DerivedThroughMid1()
|
val md1: DerivedThroughMid1 = DerivedThroughMid1()
|
||||||
val md2: DerivedThroughMid2 = DerivedThroughMid2()
|
val md2: DerivedThroughMid2 = DerivedThroughMid2()
|
||||||
val mk: Mid = when {
|
val mk: Mid = when {
|
||||||
@@ -63,6 +63,6 @@ fun test(b: Boolean) {
|
|||||||
else -> md2
|
else -> md2
|
||||||
}
|
}
|
||||||
mk.#f = 44
|
mk.#f = 44
|
||||||
mk(super<JFieldOwner>).#f /*~> Unit */
|
mk.#f /*~> Unit */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -63,6 +63,6 @@ fun test(b: Boolean) {
|
|||||||
else -> md2
|
else -> md2
|
||||||
}
|
}
|
||||||
mk /*as Mid */(super<Mid>).#f = 44
|
mk /*as Mid */(super<Mid>).#f = 44
|
||||||
mk /*as Mid */(super<JFieldOwner>).#f /*~> Unit */
|
mk /*as Mid */(super<Mid>).#f /*~> Unit */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ class Derived : Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getValue(): Int {
|
fun getValue(): Int {
|
||||||
return <this>(super<Base>).#value
|
return <this>.#value
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setValue(value: Int) {
|
fun setValue(value: Int) {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class Derived : Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getValue(): Int {
|
fun getValue(): Int {
|
||||||
return <this>(super<Base>).#value
|
return <this>(super<Derived>).#value
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setValue(value: Int) {
|
fun setValue(value: Int) {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class Box<out T : Foo> {
|
|||||||
get(): String {
|
get(): String {
|
||||||
var foo: Foo = <this>.<get-foo>()
|
var foo: Foo = <this>.<get-foo>()
|
||||||
when {
|
when {
|
||||||
foo is Buz -> return foo /*as Buz */(super<Buz>).#str /*!! String */
|
foo is Buz -> return foo /*as Buz */.#str /*!! String */
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
fun foo(movedPaths: MutableList<Couple<FilePath>>) {
|
fun foo(movedPaths: MutableList<Couple<FilePath>>) {
|
||||||
movedPaths.forEach<Couple<FilePath>>(action = local fun <anonymous>(it: Couple<FilePath>) {
|
movedPaths.forEach<Couple<FilePath>>(action = local fun <anonymous>(it: Couple<FilePath>) {
|
||||||
it(super<Couple>).#second.getName() /*~> Unit */
|
it.#second.getName() /*~> Unit */
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -6,6 +6,6 @@ fun testSetField(a: Any, b: Any) {
|
|||||||
|
|
||||||
fun testGetField(a: Any): String {
|
fun testGetField(a: Any): String {
|
||||||
a as JCell<String> /*~> Unit */
|
a as JCell<String> /*~> Unit */
|
||||||
return a /*as JCell<String> */(super<JCell>).#value /*!! String */
|
return a /*as JCell<String> */.#value /*!! String */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
@@ -17801,6 +17801,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/fieldRename/javaFieldAndCompanionProperty.kt");
|
runTest("compiler/testData/codegen/box/fieldRename/javaFieldAndCompanionProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("javaFieldAndKotlinPrivateProperty.kt")
|
||||||
|
public void testJavaFieldAndKotlinPrivateProperty() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/fieldRename/javaFieldAndKotlinPrivateProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("javaFieldAndKotlinProperty.kt")
|
@TestMetadata("javaFieldAndKotlinProperty.kt")
|
||||||
public void testJavaFieldAndKotlinProperty() throws Exception {
|
public void testJavaFieldAndKotlinProperty() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user