From cabc47516a6302892a0a57f3eed6ac61fd5d04af Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 9 Sep 2021 14:29:45 -0700 Subject: [PATCH] FIR IDE: check backing field with BODY_RESOLVE --- .../api/symbols/KtVariableLikeSymbol.kt | 5 +- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 3 +- .../symbols/symbolByPsi/backingField.kt | 5 ++ .../symbols/symbolByPsi/backingField.txt | 87 +++++++++++++++++++ .../api/symbols/SymbolByPsiTestGenerated.java | 6 ++ 5 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.kt create mode 100644 idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.txt diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt index 3646411e0e3..e6fb54155d9 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt @@ -6,11 +6,11 @@ package org.jetbrains.kotlin.idea.frontend.api.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name public sealed class KtVariableLikeSymbol : KtCallableSymbol(), KtNamedSymbol, KtSymbolWithKind { @@ -42,7 +42,7 @@ public abstract class KtBackingFieldSymbol : KtVariableLikeSymbol() { abstract override fun createPointer(): KtSymbolPointer public companion object { - private val fieldName = Name.identifier("field") + private val fieldName = StandardNames.BACKING_FIELD } } @@ -53,7 +53,6 @@ public abstract class KtEnumEntrySymbol : KtVariableLikeSymbol(), KtSymbolWithMe final override val receiverType: KtTypeAndAnnotations? get() = null public abstract val containingEnumClassIdIfNonLocal: ClassId? - abstract override fun createPointer(): KtSymbolPointer } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt index 0bd48a460f1..f33a45e23ac 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -97,7 +97,8 @@ internal class KtFirKotlinPropertySymbol( property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol } - override val hasBackingField: Boolean get() = firRef.withFir { it.hasBackingField } + // NB: `field` in accessors indicates the property should have a backing field. To see that, though, we need BODY_RESOLVE. + override val hasBackingField: Boolean get() = firRef.withFir(FirResolvePhase.BODY_RESOLVE) { it.hasBackingField } override val isLateInit: Boolean get() = firRef.withFir { it.isLateInit } diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.kt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.kt new file mode 100644 index 00000000000..90b0ce76958 --- /dev/null +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.kt @@ -0,0 +1,5 @@ +var p: Int + get() = field + set(value) { + field = value + } diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.txt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.txt new file mode 100644 index 00000000000..e73d1682e5f --- /dev/null +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.txt @@ -0,0 +1,87 @@ +KtFirPropertyGetterSymbol: + annotatedType: [] kotlin/Int + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: null + dispatchType: null + hasBody: true + hasStableParameterNames: true + isDefault: false + isExtension: false + isInline: false + isOverride: false + modality: FINAL + origin: SOURCE + receiverType: null + symbolKind: ACCESSOR + valueParameters: [] + visibility: Public + deprecationStatus: null + +KtFirValueParameterSymbol: + annotatedType: [] kotlin/Int + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: null + hasDefaultValue: false + isExtension: false + isVararg: false + name: value + origin: SOURCE + receiverType: null + symbolKind: LOCAL + deprecationStatus: null + +KtFirPropertySetterSymbol: + annotatedType: [] kotlin/Unit + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: null + dispatchType: null + hasBody: true + hasStableParameterNames: true + isDefault: false + isExtension: false + isInline: false + isOverride: false + modality: FINAL + origin: SOURCE + parameter: KtFirValueParameterSymbol(value) + receiverType: null + symbolKind: ACCESSOR + valueParameters: [ + KtFirValueParameterSymbol(value) + ] + visibility: Public + deprecationStatus: null + +KtFirKotlinPropertySymbol: + annotatedType: [] kotlin/Int + annotationClassIds: [] + annotations: [] + callableIdIfNonLocal: /p + dispatchType: null + getter: KtFirPropertyGetterSymbol() + hasBackingField: true + hasGetter: true + hasSetter: true + initializer: null + isConst: false + isExtension: false + isFromPrimaryConstructor: false + isLateInit: false + isOverride: false + isStatic: false + isVal: false + modality: FINAL + name: p + origin: SOURCE + receiverType: null + setter: KtFirPropertySetterSymbol() + symbolKind: TOP_LEVEL + visibility: Public + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getP + javaSetterName: setP + setterDeprecationStatus: null diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java index b9e1596ca5e..c5bbdbe9ef1 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java @@ -36,6 +36,12 @@ public class SymbolByPsiTestGenerated extends AbstractSymbolByPsiTest { runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/anonymousObject.kt"); } + @Test + @TestMetadata("backingField.kt") + public void testBackingField() throws Exception { + runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/backingField.kt"); + } + @Test @TestMetadata("class.kt") public void testClass() throws Exception {