diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index 42ea2e544a3..e9d64d47470 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -124,6 +124,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A runTest("analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.kt"); } + @Test + @TestMetadata("explicitBackingField.kt") + public void testExplicitBackingField() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt"); + } + @Test @TestMetadata("extensionFunction.kt") public void testExtensionFunction() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index aa74881f196..f4fa5ae9589 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -124,6 +124,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends Ab runTest("analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.kt"); } + @Test + @TestMetadata("explicitBackingField.kt") + public void testExplicitBackingField() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt"); + } + @Test @TestMetadata("extensionFunction.kt") public void testExtensionFunction() throws Exception { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolByPsiTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolByPsiTest.kt index 3c89f1fab18..00472af10dd 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolByPsiTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolByPsiTest.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.psi.KtBackingField import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtParameter @@ -28,6 +29,7 @@ abstract class AbstractSymbolByPsiTest : AbstractSymbolTest() { private val KtDeclaration.isValidForSymbolCreation get() = when (this) { + is KtBackingField -> false is KtParameter -> !this.isFunctionTypeParameter else -> true } diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index a2483697f53..e48438fa684 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -124,6 +124,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.kt"); } + @Test + @TestMetadata("explicitBackingField.kt") + public void testExplicitBackingField() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt"); + } + @Test @TestMetadata("extensionFunction.kt") public void testExtensionFunction() throws Exception { diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt new file mode 100644 index 00000000000..bc9366f11cb --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.kt @@ -0,0 +1,6 @@ +var p: Int + field = "test" + get() = field.length + set(value) { + field = value.toString() + } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.pretty.txt new file mode 100644 index 00000000000..6ae4f637585 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.pretty.txt @@ -0,0 +1 @@ +var p: kotlin.Int diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.txt new file mode 100644 index 00000000000..307fa29c6d4 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/explicitBackingField.txt @@ -0,0 +1,91 @@ +KtPropertyGetterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + hasBody: true + hasStableParameterNames: true + isDefault: false + isExtension: false + isInline: false + isOverride: false + modality: FINAL + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: ACCESSOR + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: false + isVararg: false + name: value + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtPropertySetterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + hasBody: true + hasStableParameterNames: true + isDefault: false + isExtension: false + isInline: false + isOverride: false + modality: FINAL + origin: SOURCE + parameter: KtValueParameterSymbol(value) + receiverType: null + returnType: kotlin/Unit + symbolKind: ACCESSOR + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol(value) + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtKotlinPropertySymbol: + annotationsList: [] + callableIdIfNonLocal: /p + getter: KtPropertyGetterSymbol() + hasBackingField: true + hasGetter: true + hasSetter: true + initializer: null + isConst: false + isDelegatedProperty: false + isExtension: false + isFromPrimaryConstructor: false + isLateInit: false + isOverride: false + isStatic: false + isVal: false + modality: FINAL + name: p + origin: SOURCE + receiverType: null + returnType: kotlin/Int + setter: KtPropertySetterSymbol() + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getP + javaSetterName: setP + setterDeprecationStatus: null \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt index 9b1138e82ad..a034924fd2d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt @@ -68,13 +68,12 @@ internal class LLFirProvider( symbol.fir.originalForSubstitutionOverride?.symbol?.let { return getFirCallableContainerFile(it) } - if (symbol is FirSyntheticPropertySymbol) { - val fir = symbol.fir - if (fir is FirSyntheticProperty) { - return getFirCallableContainerFile(fir.getter.delegate.symbol) - } + val fir = symbol.fir + return when { + symbol is FirBackingFieldSymbol -> getFirCallableContainerFile(symbol.fir.propertySymbol) + symbol is FirSyntheticPropertySymbol && fir is FirSyntheticProperty -> getFirCallableContainerFile(fir.getter.delegate.symbol) + else -> moduleComponents.cache.getContainerFirFile(symbol.fir) } - return moduleComponents.cache.getContainerFirFile(symbol.fir) } override fun getFirFilesByPackage(fqName: FqName): List = error("Should not be called in FIR IDE") diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt index 8bfa1a60322..65776cd80f2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt @@ -31,12 +31,6 @@ fun FirVisibilityChecker.isVisible( return isVisible(declaration.originalIfFakeOverride() as FirMemberDeclaration, callInfo, dispatchReceiverValue) } - // We won't resolve into the backing field - // in the first place, if it's not accessible. - if (declaration is FirBackingField) { - return true - } - val useSiteFile = callInfo.containingFile val containingDeclarations = callInfo.containingDeclarations val session = callInfo.session