From d09be811f005464285df6833ed323d4dec583aa8 Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Thu, 22 Apr 2021 14:56:43 -0700 Subject: [PATCH] FIR: make class delegation field a fake source Previously, the FirFieldImpl generated from class delegation has a real source. This causes troubles in the IDE. This change adds a new fake source kind for class delegation fields. --- .../kotlin/fir/lightTree/converter/DeclarationsConverter.kt | 2 +- .../src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 3 ++- .../fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 60fee0ab6ab..69a9082dbee 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -1574,7 +1574,7 @@ class DeclarationsConverter( val delegateName = Name.special("<\$\$delegate_${delegateFields.size}>") delegateFields.add( buildField { - source = firExpression!!.source + source = firExpression!!.source?.fakeElement(FirFakeSourceElementKind.ClassDelegationField) declarationSiteSession = baseSession origin = FirDeclarationOrigin.Synthetic name = delegateName diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 99f4c665aff..3594f8185bd 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -566,7 +566,8 @@ open class RawFirBuilder( val delegateExpression = { superTypeListEntry.delegateExpression }.toFirExpression("Should have delegate") container.superTypeRefs += type val delegateName = Name.special("<\$\$delegate_${delegateFields.size}>") - val delegateSource = superTypeListEntry.delegateExpression?.toFirSourceElement() + val delegateSource = + superTypeListEntry.delegateExpression?.toFirSourceElement(FirFakeSourceElementKind.ClassDelegationField) val delegateField = buildField { source = delegateSource declarationSiteSession = baseSession diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt index 7c5b3ad2ac7..3217e74b7d5 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -170,6 +170,10 @@ sealed class FirFakeSourceElementKind : FirSourceElementKind() { // for java annotations constructor implicit parameters are generated // with a fake source which refers to declared annotation methods object ImplicitAnnotationAnnotationConstructorParameter : FirFakeSourceElementKind() + + // for the implicit field storing the delegated object for class delegation + // with a fake source that refers to the KtExpression that creates the delegate + object ClassDelegationField : FirFakeSourceElementKind() } sealed class FirSourceElement {