From 9f48695dde3793a224895484cf2309cef2ad0e03 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 7 Mar 2019 11:18:49 +0300 Subject: [PATCH] psi2ir: no unbound field symbols in delegated property references #KT-30323 Fixed --- .../psi2ir/generators/DelegatedPropertyGenerator.kt | 2 +- .../generators/ReflectionReferencesGenerator.kt | 12 ++++++++++-- .../org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt | 0 .../irText/expressions/boundCallableReferences.txt | 3 +-- .../expressions/callableRefToGenericMember.txt | 2 +- .../callableReferenceToImportedFromObject.txt | 4 ++-- .../ir/irText/expressions/genericPropertyRef.txt | 4 ++-- .../ir/irText/expressions/reflectionLiterals.txt | 2 +- 8 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt index a387a1bd031..fa2d2916ae4 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt @@ -199,7 +199,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D private fun createCallableReference( ktElement: KtElement, type: KotlinType, - referencedDescriptor: CallableDescriptor, + referencedDescriptor: VariableDescriptorWithAccessors, scopeOwner: IrSymbol ): IrCallableReference = createCallableReference( diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 0417e3404a9..0f31a3b2178 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -142,9 +142,9 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St return IrPropertyReferenceImpl( startOffset, endOffset, type.toIrType(), - context.symbolTable.referenceProperty(propertyDescriptor.original), + context.symbolTable.referenceProperty(originalProperty), propertyDescriptor.typeParametersCount, - originalGetter?.run { context.symbolTable.referenceField(originalProperty) }, + getFieldForPropertyReference(originalProperty), originalGetter?.let { context.symbolTable.referenceSimpleFunction(it) }, originalSetter?.let { context.symbolTable.referenceSimpleFunction(it) }, origin @@ -153,6 +153,14 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St } } + private fun getFieldForPropertyReference(originalProperty: PropertyDescriptor) = + // NB this is a hack, we really don't know if an arbitrary property has a backing field or not + when { + originalProperty.isDelegated -> null + originalProperty.getter != null -> null + else -> context.symbolTable.referenceField(originalProperty) + } + private fun generateFunctionReference( startOffset: Int, endOffset: Int, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/compiler/testData/ir/irText/expressions/boundCallableReferences.txt b/compiler/testData/ir/irText/expressions/boundCallableReferences.txt index 026756006d9..891743f1e08 100644 --- a/compiler/testData/ir/irText/expressions/boundCallableReferences.txt +++ b/compiler/testData/ir/irText/expressions/boundCallableReferences.txt @@ -48,7 +48,7 @@ FILE fqName: fileName:/boundCallableReferences.kt PROPERTY name:test2 visibility:public modality:FINAL flags:val FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty0 visibility:public flags:final,static EXPRESSION_BODY - PROPERTY_REFERENCE 'bar: Int' field=null getter='(): Int' setter=null type=kotlin.reflect.KProperty0 origin=null + PROPERTY_REFERENCE 'bar: Int' field='bar: Int' getter='(): Int' setter=null type=kotlin.reflect.KProperty0 origin=null $this: CALL 'constructor A()' type=A origin=null FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0 flags: correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL flags:val @@ -65,4 +65,3 @@ FILE fqName: fileName:/boundCallableReferences.kt BLOCK_BODY RETURN type=kotlin.Nothing from='(): KFunction0' GET_FIELD 'test3: KFunction0' type=kotlin.reflect.KFunction0 origin=null - diff --git a/compiler/testData/ir/irText/expressions/callableRefToGenericMember.txt b/compiler/testData/ir/irText/expressions/callableRefToGenericMember.txt index cf8fdaeeb72..a7a49754445 100644 --- a/compiler/testData/ir/irText/expressions/callableRefToGenericMember.txt +++ b/compiler/testData/ir/irText/expressions/callableRefToGenericMember.txt @@ -45,7 +45,7 @@ FILE fqName: fileName:/callableRefToGenericMember.kt PROPERTY name:test2 visibility:public modality:FINAL flags:val FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty1, kotlin.Int> visibility:public flags:final,static EXPRESSION_BODY - PROPERTY_REFERENCE 'bar: Int' field=null getter='(): Int' setter=null type=kotlin.reflect.KProperty1, kotlin.Int> origin=null + PROPERTY_REFERENCE 'bar: Int' field='bar: Int' getter='(): Int' setter=null type=kotlin.reflect.KProperty1, kotlin.Int> origin=null FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty1, kotlin.Int> flags: correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL flags:val BLOCK_BODY diff --git a/compiler/testData/ir/irText/expressions/callableReferenceToImportedFromObject.txt b/compiler/testData/ir/irText/expressions/callableReferenceToImportedFromObject.txt index e546889c13d..d95bec71e59 100644 --- a/compiler/testData/ir/irText/expressions/callableReferenceToImportedFromObject.txt +++ b/compiler/testData/ir/irText/expressions/callableReferenceToImportedFromObject.txt @@ -37,7 +37,7 @@ FILE fqName:test fileName:/callableReferenceToImportedFromObject.kt PROPERTY name:test1 visibility:public modality:FINAL flags:val FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.reflect.KProperty0 visibility:public flags:final,static EXPRESSION_BODY - PROPERTY_REFERENCE 'a: String' field=null getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=null + PROPERTY_REFERENCE 'a: String' field='a: String' getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=null $this: GET_OBJECT 'Foo' type=test.Foo FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0 flags: correspondingProperty: PROPERTY name:test1 visibility:public modality:FINAL flags:val @@ -47,7 +47,7 @@ FILE fqName:test fileName:/callableReferenceToImportedFromObject.kt PROPERTY name:test1a visibility:public modality:FINAL flags:val FIELD PROPERTY_BACKING_FIELD name:test1a type:kotlin.reflect.KProperty0 visibility:public flags:final,static EXPRESSION_BODY - PROPERTY_REFERENCE 'a: String' field=null getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=null + PROPERTY_REFERENCE 'a: String' field='a: String' getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=null $this: GET_OBJECT 'Foo' type=test.Foo FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0 flags: correspondingProperty: PROPERTY name:test1a visibility:public modality:FINAL flags:val diff --git a/compiler/testData/ir/irText/expressions/genericPropertyRef.txt b/compiler/testData/ir/irText/expressions/genericPropertyRef.txt index 0383b5ff4f2..35604e4b397 100644 --- a/compiler/testData/ir/irText/expressions/genericPropertyRef.txt +++ b/compiler/testData/ir/irText/expressions/genericPropertyRef.txt @@ -79,7 +79,7 @@ FILE fqName: fileName:/genericPropertyRef.kt CALL 'getValue(Any?, Any): Int' type=kotlin.Int origin=null $this: GET_FIELD '`additionalText$delegate`: DVal' type=DVal origin=null t: GET_VAR 'this@additionalText: Value' type=Value origin=null - p: PROPERTY_REFERENCE 'additionalText: Int on Value' field='additionalText: Int on Value' getter='() on Value: Int' setter=null type=kotlin.reflect.KProperty1, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE + p: PROPERTY_REFERENCE 'additionalText: Int on Value' field=null getter='() on Value: Int' setter=null type=kotlin.reflect.KProperty1, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE : PROPERTY name:additionalValue visibility:public modality:FINAL flags:delegated,val FIELD DELEGATE name:additionalValue$delegate type:DVal visibility:private flags:final,static @@ -95,7 +95,7 @@ FILE fqName: fileName:/genericPropertyRef.kt CALL 'getValue(Any?, Any): Int' type=kotlin.Int origin=null $this: GET_FIELD '`additionalValue$delegate`: DVal' type=DVal origin=null t: GET_VAR 'this@additionalValue: Value' type=Value origin=null - p: PROPERTY_REFERENCE 'additionalValue: Int on Value' field='additionalValue: Int on Value' getter='() on Value: Int' setter=null type=kotlin.reflect.KProperty1, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE + p: PROPERTY_REFERENCE 'additionalValue: Int on Value' field=null getter='() on Value: Int' setter=null type=kotlin.reflect.KProperty1, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE : CLASS CLASS name:DVal modality:FINAL visibility:public flags: superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:DVal flags: diff --git a/compiler/testData/ir/irText/expressions/reflectionLiterals.txt b/compiler/testData/ir/irText/expressions/reflectionLiterals.txt index 756123fb113..c520018e7aa 100644 --- a/compiler/testData/ir/irText/expressions/reflectionLiterals.txt +++ b/compiler/testData/ir/irText/expressions/reflectionLiterals.txt @@ -91,7 +91,7 @@ FILE fqName: fileName:/reflectionLiterals.kt PROPERTY name:test7 visibility:public modality:FINAL flags:val FIELD PROPERTY_BACKING_FIELD name:test7 type:kotlin.reflect.KProperty0 visibility:public flags:final,static EXPRESSION_BODY - PROPERTY_REFERENCE 'qux: Int' field=null getter='(): Int' setter=null type=kotlin.reflect.KProperty0 origin=null + PROPERTY_REFERENCE 'qux: Int' field='qux: Int' getter='(): Int' setter=null type=kotlin.reflect.KProperty0 origin=null FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0 flags: correspondingProperty: PROPERTY name:test7 visibility:public modality:FINAL flags:val BLOCK_BODY