psi2ir: no unbound field symbols in delegated property references
#KT-30323 Fixed
This commit is contained in:
+1
-1
@@ -199,7 +199,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
|
||||
private fun createCallableReference(
|
||||
ktElement: KtElement,
|
||||
type: KotlinType,
|
||||
referencedDescriptor: CallableDescriptor,
|
||||
referencedDescriptor: VariableDescriptorWithAccessors,
|
||||
scopeOwner: IrSymbol
|
||||
): IrCallableReference =
|
||||
createCallableReference(
|
||||
|
||||
+10
-2
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user