Object references in object field initializers are 'GET_VAR this@Object'
This commit is contained in:
+1
-1
@@ -124,7 +124,7 @@ private fun StatementGenerator.shouldGenerateReceiverAsSingletonReference(receiv
|
|||||||
val scopeOwner = this.scopeOwner
|
val scopeOwner = this.scopeOwner
|
||||||
return receiverClassDescriptor.kind.isSingleton &&
|
return receiverClassDescriptor.kind.isSingleton &&
|
||||||
scopeOwner != receiverClassDescriptor && // For anonymous initializers
|
scopeOwner != receiverClassDescriptor && // For anonymous initializers
|
||||||
!(scopeOwner is FunctionDescriptor && scopeOwner.containingDeclaration == receiverClassDescriptor) // Methods of object
|
!(scopeOwner is CallableMemberDescriptor && scopeOwner.containingDeclaration == receiverClassDescriptor) // Members of object
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun StatementGenerator.generateThisOrSuperReceiver(receiver: ReceiverValue, classDescriptor: ClassDescriptor): IrExpression {
|
private fun StatementGenerator.generateThisOrSuperReceiver(receiver: ReceiverValue, classDescriptor: ClassDescriptor): IrExpression {
|
||||||
|
|||||||
+2
-3
@@ -59,7 +59,7 @@ FILE fqName:<root> fileName:/memberExtension.kt
|
|||||||
FIELD DELEGATE name:plusK$delegate type:Host.StringDelegate visibility:private flags:final
|
FIELD DELEGATE name:plusK$delegate type:Host.StringDelegate visibility:private flags:final
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
CALL 'provideDelegate(Any?, Any) on String: Host.StringDelegate' type=Host.StringDelegate origin=null
|
CALL 'provideDelegate(Any?, Any) on String: Host.StringDelegate' type=Host.StringDelegate origin=null
|
||||||
$this: GET_OBJECT 'Host' type=Host
|
$this: GET_VAR 'this@Host: Host' type=Host origin=null
|
||||||
$receiver: CONST String type=kotlin.String value=K
|
$receiver: CONST String type=kotlin.String value=K
|
||||||
host: GET_VAR 'this@Host: Host' type=Host origin=null
|
host: GET_VAR 'this@Host: Host' type=Host origin=null
|
||||||
p: PROPERTY_REFERENCE 'plusK: String on String' field=null getter='<get-plusK>() on String: String' setter=null type=kotlin.reflect.KProperty2<kotlin.String, Host, kotlin.String> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
p: PROPERTY_REFERENCE 'plusK: String on String' field=null getter='<get-plusK>() on String: String' setter=null type=kotlin.reflect.KProperty2<kotlin.String, Host, kotlin.String> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||||
@@ -78,7 +78,7 @@ FILE fqName:<root> fileName:/memberExtension.kt
|
|||||||
FIELD PROPERTY_BACKING_FIELD name:ok type:kotlin.String visibility:public flags:final
|
FIELD PROPERTY_BACKING_FIELD name:ok type:kotlin.String visibility:public flags:final
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
CALL '<get-plusK>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
CALL '<get-plusK>() on String: String' type=kotlin.String origin=GET_PROPERTY
|
||||||
$this: GET_OBJECT 'Host' type=Host
|
$this: GET_VAR 'this@Host: Host' type=Host origin=null
|
||||||
$receiver: CONST String type=kotlin.String value=O
|
$receiver: CONST String type=kotlin.String value=O
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-ok> visibility:public modality:FINAL <> ($this:Host) returnType:kotlin.String flags:
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-ok> visibility:public modality:FINAL <> ($this:Host) returnType:kotlin.String flags:
|
||||||
correspondingProperty: PROPERTY name:ok visibility:public modality:FINAL flags:val
|
correspondingProperty: PROPERTY name:ok visibility:public modality:FINAL flags:val
|
||||||
@@ -100,4 +100,3 @@ FILE fqName:<root> fileName:/memberExtension.kt
|
|||||||
overridden:
|
overridden:
|
||||||
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
||||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
|
||||||
|
|||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
abstract class Base(val lambda: () -> Any)
|
||||||
|
|
||||||
|
object Test : Base({ -> Test })
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
FILE fqName:<root> fileName:/objectReferenceInClosureInSuperConstructorCall.kt
|
||||||
|
CLASS CLASS name:Base modality:ABSTRACT visibility:public flags: superTypes:[kotlin.Any]
|
||||||
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Base flags:
|
||||||
|
CONSTRUCTOR visibility:public <> (lambda:() -> kotlin.Any) returnType:Base flags:primary
|
||||||
|
VALUE_PARAMETER name:lambda index:0 type:() -> kotlin.Any flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='Base'
|
||||||
|
PROPERTY name:lambda visibility:public modality:FINAL flags:val
|
||||||
|
FIELD PROPERTY_BACKING_FIELD name:lambda type:() -> kotlin.Any visibility:public flags:final
|
||||||
|
EXPRESSION_BODY
|
||||||
|
GET_VAR 'value-parameter lambda: () -> Any' type=() -> kotlin.Any origin=INITIALIZE_PROPERTY_FROM_PARAMETER
|
||||||
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-lambda> visibility:public modality:FINAL <> ($this:Base) returnType:() -> kotlin.Any flags:
|
||||||
|
correspondingProperty: PROPERTY name:lambda visibility:public modality:FINAL flags:val
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:Base flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='<get-lambda>(): () -> Any'
|
||||||
|
GET_FIELD 'lambda: () -> Any' type=() -> kotlin.Any origin=null
|
||||||
|
receiver: GET_VAR 'this@Base: Base' type=Base origin=null
|
||||||
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
|
||||||
|
overridden:
|
||||||
|
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
|
||||||
|
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
|
||||||
|
overridden:
|
||||||
|
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
||||||
|
overridden:
|
||||||
|
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
CLASS OBJECT name:Test modality:FINAL visibility:public flags: superTypes:[Base]
|
||||||
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:Test flags:
|
||||||
|
CONSTRUCTOR visibility:private <> () returnType:Test flags:primary
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'constructor Base(() -> Any)'
|
||||||
|
lambda: BLOCK type=() -> Test origin=LAMBDA
|
||||||
|
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:Test flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='<anonymous>(): Test'
|
||||||
|
GET_OBJECT 'Test' type=Test
|
||||||
|
FUNCTION_REFERENCE '<anonymous>(): Test' type=() -> Test origin=LAMBDA
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='Test'
|
||||||
|
PROPERTY FAKE_OVERRIDE name:lambda visibility:public modality:FINAL flags:val
|
||||||
|
FUN FAKE_OVERRIDE name:<get-lambda> visibility:public modality:FINAL <> ($this:Base) returnType:() -> kotlin.Any flags:
|
||||||
|
correspondingProperty: PROPERTY FAKE_OVERRIDE name:lambda visibility:public modality:FINAL flags:val
|
||||||
|
overridden:
|
||||||
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-lambda> visibility:public modality:FINAL <> ($this:Base) returnType:() -> kotlin.Any flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:Base flags:
|
||||||
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
|
||||||
|
overridden:
|
||||||
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
|
||||||
|
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
|
||||||
|
overridden:
|
||||||
|
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
||||||
|
overridden:
|
||||||
|
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
object A {
|
||||||
|
private const val a = "$"
|
||||||
|
private const val b = "1234$a"
|
||||||
|
private const val c = 10000
|
||||||
|
}
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
FILE fqName:<root> fileName:/objectReferenceInFieldInitializer.kt
|
||||||
|
CLASS OBJECT name:A modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
|
||||||
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:A flags:
|
||||||
|
CONSTRUCTOR visibility:private <> () returnType:A flags:primary
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='A'
|
||||||
|
PROPERTY name:a visibility:private modality:FINAL flags:const,val
|
||||||
|
FIELD PROPERTY_BACKING_FIELD name:a type:kotlin.String visibility:private flags:final
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CONST String type=kotlin.String value=$
|
||||||
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-a> visibility:private modality:FINAL <> ($this:A) returnType:kotlin.String flags:
|
||||||
|
correspondingProperty: PROPERTY name:a visibility:private modality:FINAL flags:const,val
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:A flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='<get-a>(): String'
|
||||||
|
GET_FIELD 'a: String' type=kotlin.String origin=null
|
||||||
|
receiver: GET_VAR 'this@A: A' type=A origin=null
|
||||||
|
PROPERTY name:b visibility:private modality:FINAL flags:const,val
|
||||||
|
FIELD PROPERTY_BACKING_FIELD name:b type:kotlin.String visibility:private flags:final
|
||||||
|
EXPRESSION_BODY
|
||||||
|
STRING_CONCATENATION type=kotlin.String
|
||||||
|
CONST String type=kotlin.String value=1234
|
||||||
|
CALL '<get-a>(): String' type=kotlin.String origin=GET_PROPERTY
|
||||||
|
$this: GET_VAR 'this@A: A' type=A origin=null
|
||||||
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-b> visibility:private modality:FINAL <> ($this:A) returnType:kotlin.String flags:
|
||||||
|
correspondingProperty: PROPERTY name:b visibility:private modality:FINAL flags:const,val
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:A flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='<get-b>(): String'
|
||||||
|
GET_FIELD 'b: String' type=kotlin.String origin=null
|
||||||
|
receiver: GET_VAR 'this@A: A' type=A origin=null
|
||||||
|
PROPERTY name:c visibility:private modality:FINAL flags:const,val
|
||||||
|
FIELD PROPERTY_BACKING_FIELD name:c type:kotlin.Int visibility:private flags:final
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CONST Int type=kotlin.Int value=10000
|
||||||
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-c> visibility:private modality:FINAL <> ($this:A) returnType:kotlin.Int flags:
|
||||||
|
correspondingProperty: PROPERTY name:c visibility:private modality:FINAL flags:const,val
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:A flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='<get-c>(): Int'
|
||||||
|
GET_FIELD 'c: Int' type=kotlin.Int origin=null
|
||||||
|
receiver: GET_VAR 'this@A: A' type=A origin=null
|
||||||
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
|
||||||
|
overridden:
|
||||||
|
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
|
||||||
|
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
|
||||||
|
overridden:
|
||||||
|
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
|
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
||||||
|
overridden:
|
||||||
|
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String flags:
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
|
||||||
@@ -977,6 +977,16 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
|
|||||||
runTest("compiler/testData/ir/irText/expressions/objectReference.kt");
|
runTest("compiler/testData/ir/irText/expressions/objectReference.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("objectReferenceInClosureInSuperConstructorCall.kt")
|
||||||
|
public void testObjectReferenceInClosureInSuperConstructorCall() throws Exception {
|
||||||
|
runTest("compiler/testData/ir/irText/expressions/objectReferenceInClosureInSuperConstructorCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("objectReferenceInFieldInitializer.kt")
|
||||||
|
public void testObjectReferenceInFieldInitializer() throws Exception {
|
||||||
|
runTest("compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("outerClassInstanceReference.kt")
|
@TestMetadata("outerClassInstanceReference.kt")
|
||||||
public void testOuterClassInstanceReference() throws Exception {
|
public void testOuterClassInstanceReference() throws Exception {
|
||||||
runTest("compiler/testData/ir/irText/expressions/outerClassInstanceReference.kt");
|
runTest("compiler/testData/ir/irText/expressions/outerClassInstanceReference.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user