psi2ir: no unbound field symbols in delegated property references

#KT-30323 Fixed
This commit is contained in:
Dmitry Petrov
2019-03-07 11:18:49 +03:00
parent 15918fc475
commit 9f48695dde
8 changed files with 18 additions and 11 deletions
@@ -199,7 +199,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
private fun createCallableReference(
ktElement: KtElement,
type: KotlinType,
referencedDescriptor: CallableDescriptor,
referencedDescriptor: VariableDescriptorWithAccessors,
scopeOwner: IrSymbol
): IrCallableReference =
createCallableReference(
@@ -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,
@@ -48,7 +48,7 @@ FILE fqName:<root> fileName:/boundCallableReferences.kt
PROPERTY name:test2 visibility:public modality:FINAL flags:val
FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty0<kotlin.Int> visibility:public flags:final,static
EXPRESSION_BODY
PROPERTY_REFERENCE 'bar: Int' field=null getter='<get-bar>(): Int' setter=null type=kotlin.reflect.KProperty0<kotlin.Int> origin=null
PROPERTY_REFERENCE 'bar: Int' field='bar: Int' getter='<get-bar>(): Int' setter=null type=kotlin.reflect.KProperty0<kotlin.Int> origin=null
$this: CALL 'constructor A()' type=A origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test2> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0<kotlin.Int> flags:
correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL flags:val
@@ -65,4 +65,3 @@ FILE fqName:<root> fileName:/boundCallableReferences.kt
BLOCK_BODY
RETURN type=kotlin.Nothing from='<get-test3>(): KFunction0<Unit>'
GET_FIELD 'test3: KFunction0<Unit>' type=kotlin.reflect.KFunction0<kotlin.Unit> origin=null
@@ -45,7 +45,7 @@ FILE fqName:<root> fileName:/callableRefToGenericMember.kt
PROPERTY name:test2 visibility:public modality:FINAL flags:val
FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.reflect.KProperty1<A<kotlin.String>, kotlin.Int> visibility:public flags:final,static
EXPRESSION_BODY
PROPERTY_REFERENCE 'bar: Int' field=null getter='<get-bar>(): Int' setter=null type=kotlin.reflect.KProperty1<A<kotlin.String>, kotlin.Int> origin=null
PROPERTY_REFERENCE 'bar: Int' field='bar: Int' getter='<get-bar>(): Int' setter=null type=kotlin.reflect.KProperty1<A<kotlin.String>, kotlin.Int> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test2> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty1<A<kotlin.String>, kotlin.Int> flags:
correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL flags:val
BLOCK_BODY
@@ -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<kotlin.String> visibility:public flags:final,static
EXPRESSION_BODY
PROPERTY_REFERENCE 'a: String' field=null getter='<get-a>(): String' setter=null type=kotlin.reflect.KProperty0<kotlin.String> origin=null
PROPERTY_REFERENCE 'a: String' field='a: String' getter='<get-a>(): String' setter=null type=kotlin.reflect.KProperty0<kotlin.String> origin=null
$this: GET_OBJECT 'Foo' type=test.Foo
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test1> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0<kotlin.String> 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<kotlin.String> visibility:public flags:final,static
EXPRESSION_BODY
PROPERTY_REFERENCE 'a: String' field=null getter='<get-a>(): String' setter=null type=kotlin.reflect.KProperty0<kotlin.String> origin=null
PROPERTY_REFERENCE 'a: String' field='a: String' getter='<get-a>(): String' setter=null type=kotlin.reflect.KProperty0<kotlin.String> origin=null
$this: GET_OBJECT 'Foo' type=test.Foo
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test1a> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0<kotlin.String> flags:
correspondingProperty: PROPERTY name:test1a visibility:public modality:FINAL flags:val
@@ -79,7 +79,7 @@ FILE fqName:<root> 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<T>' type=Value<T> origin=null
p: PROPERTY_REFERENCE 'additionalText: Int on Value<T>' field='additionalText: Int on Value<T>' getter='<get-additionalText>() on Value<T>: Int' setter=null type=kotlin.reflect.KProperty1<Value<T>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
p: PROPERTY_REFERENCE 'additionalText: Int on Value<T>' field=null getter='<get-additionalText>() on Value<T>: Int' setter=null type=kotlin.reflect.KProperty1<Value<T>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
<T>: <none>
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:<root> 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<T>' type=Value<T> origin=null
p: PROPERTY_REFERENCE 'additionalValue: Int on Value<T>' field='additionalValue: Int on Value<T>' getter='<get-additionalValue>() on Value<T>: Int' setter=null type=kotlin.reflect.KProperty1<Value<T>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
p: PROPERTY_REFERENCE 'additionalValue: Int on Value<T>' field=null getter='<get-additionalValue>() on Value<T>: Int' setter=null type=kotlin.reflect.KProperty1<Value<T>, kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
<T>: <none>
CLASS CLASS name:DVal modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:DVal flags:
@@ -91,7 +91,7 @@ FILE fqName:<root> fileName:/reflectionLiterals.kt
PROPERTY name:test7 visibility:public modality:FINAL flags:val
FIELD PROPERTY_BACKING_FIELD name:test7 type:kotlin.reflect.KProperty0<kotlin.Int> visibility:public flags:final,static
EXPRESSION_BODY
PROPERTY_REFERENCE 'qux: Int' field=null getter='<get-qux>(): Int' setter=null type=kotlin.reflect.KProperty0<kotlin.Int> origin=null
PROPERTY_REFERENCE 'qux: Int' field='qux: Int' getter='<get-qux>(): Int' setter=null type=kotlin.reflect.KProperty0<kotlin.Int> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test7> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KProperty0<kotlin.Int> flags:
correspondingProperty: PROPERTY name:test7 visibility:public modality:FINAL flags:val
BLOCK_BODY