diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index ea26b2d2420..b0f949c1b9a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -311,6 +311,12 @@ internal class KtSymbolByFirBuilder constructor( } } + fun buildErrorVariableSymbol(firSymbol: FirErrorPropertySymbol): KtFirErrorVariableSymbol { + return symbolsCache.cache(firSymbol) { + KtFirErrorVariableSymbol(firSymbol, analysisSession) + } + } + fun buildSyntheticJavaPropertySymbol(firSymbol: FirSyntheticPropertySymbol): KtFirSyntheticJavaPropertySymbol { return symbolsCache.cache(firSymbol) { KtFirSyntheticJavaPropertySymbol(firSymbol, analysisSession) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt index a2a0dd43cd1..90bfddfaaf4 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt @@ -18,18 +18,18 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPoin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.fir.declarations.FirErrorProperty +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.FirVariable +import org.jetbrains.kotlin.fir.symbols.impl.FirErrorPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.name.Name -internal class KtFirLocalVariableSymbol( - override val firSymbol: FirPropertySymbol, +internal abstract class KtFirLocalOrErrorVariableSymbol>( + override val firSymbol: S, override val analysisSession: KtFirAnalysisSession, -) : KtLocalVariableSymbol(), - KtFirSymbol { - init { - assert(firSymbol.isLocal) - } - +) : KtLocalVariableSymbol(), KtFirSymbol { override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.getAllowedPsi() } override val annotationsList: KtAnnotationsList @@ -37,7 +37,6 @@ internal class KtFirLocalVariableSymbol( KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token) } - override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal } override val name: Name get() = withValidityAssertion { firSymbol.name } override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } @@ -51,4 +50,22 @@ internal class KtFirLocalVariableSymbol( override fun equals(other: Any?): Boolean = symbolEquals(other) override fun hashCode(): Int = symbolHashCode() + +} +internal class KtFirLocalVariableSymbol(firSymbol: FirPropertySymbol, analysisSession: KtFirAnalysisSession) : + KtFirLocalOrErrorVariableSymbol(firSymbol, analysisSession) { + init { + assert(firSymbol.isLocal) + } + + override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal } +} + +internal class KtFirErrorVariableSymbol( + firSymbol: FirErrorPropertySymbol, + analysisSession: KtFirAnalysisSession, +) : KtFirLocalOrErrorVariableSymbol(firSymbol, analysisSession), + KtFirSymbol { + override val isVal: Boolean + get() = firSymbol.fir.isVal } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt index ff3ec25334a..86b43106996 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.getModule import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfType +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirSymbolEntry import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment @@ -185,9 +186,11 @@ internal class KtFirSymbolProvider( override val ROOT_PACKAGE_SYMBOL: KtPackageSymbol = KtFirPackageSymbol(FqName.ROOT, firResolveSession.project, token) - override fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtLocalVariableSymbol { - return firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol( - psi.resolveToFirSymbolOfType(firResolveSession) - ) + override fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtFirLocalOrErrorVariableSymbol<*, *> { + return when (val firSymbol = psi.resolveToFirSymbolOfType>(firResolveSession)) { + is FirPropertySymbol -> firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol(firSymbol) + is FirErrorPropertySymbol -> firSymbolBuilder.variableLikeBuilder.buildErrorVariableSymbol(firSymbol) + else -> throwUnexpectedFirElementError(firSymbol, psi, FirPropertySymbol::class, FirErrorPropertySymbol::class) + } } } diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.kt new file mode 100644 index 00000000000..de867066983 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.kt @@ -0,0 +1 @@ +val (o, r) diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.txt new file mode 100644 index 00000000000..1958ff46c18 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.txt @@ -0,0 +1,6 @@ +KT element: KtDestructuringDeclarationEntry +FIR element: FirErrorPropertyImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: + diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java index cbb9f4a3183..ea265827815 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java @@ -441,6 +441,12 @@ public class OutOfContentRootGetOrBuildFirTestGenerated extends AbstractOutOfCon runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorProperty.kt"); } + @Test + @TestMetadata("destructionWithNoRValue.kt") + public void testDestructionWithNoRValue() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.kt"); + } + @Test @TestMetadata("destructuring.kt") public void testDestructuring() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java index b879dceda4e..6b75ad52249 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java @@ -441,6 +441,12 @@ public class SourceGetOrBuildFirTestGenerated extends AbstractSourceGetOrBuildFi runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorProperty.kt"); } + @Test + @TestMetadata("destructionWithNoRValue.kt") + public void testDestructionWithNoRValue() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/destructionWithNoRValue.kt"); + } + @Test @TestMetadata("destructuring.kt") public void testDestructuring() throws Exception {