[Analysis API] introduce KtDestructuringDeclarationSymbol to represent a destructuring declaration
Mainly needed to avoid "Cannot build symbol for KtDestructuringDeclaration" from `KtSymbolProvider.getSymbol` on `KtDestructuringDeclaration`.
This commit is contained in:
committed by
Space Team
parent
1b0034b6e7
commit
8ad5a48b98
+7
@@ -101,6 +101,13 @@ internal class KtSymbolByFirBuilder constructor(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun buildDestructuringDeclarationSymbol(firSymbol: FirVariableSymbol<*>): KtDestructuringDeclarationSymbol {
|
||||
return symbolsCache.cache(firSymbol) {
|
||||
KtFirDestructuringDeclarationSymbol(firSymbol, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildEnumEntrySymbol(firSymbol: FirEnumEntrySymbol) =
|
||||
symbolsCache.cache(firSymbol) { KtFirEnumEntrySymbol(firSymbol, analysisSession) }
|
||||
|
||||
|
||||
+1
@@ -50,6 +50,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
|
||||
is KtLocalVariableSymbol -> getParentSymbolByPsi()
|
||||
is KtAnonymousFunctionSymbol -> getParentSymbolByPsi()
|
||||
is KtAnonymousObjectSymbol -> getParentSymbolByPsi()
|
||||
is KtDestructuringDeclarationSymbol -> getParentSymbolByPsi()
|
||||
|
||||
is KtSamConstructorSymbol -> null // SAM constructors are always top-level
|
||||
is KtScriptSymbol -> null // Scripts are always top-level
|
||||
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtDestructuringDeclarationSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtParameter
|
||||
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
|
||||
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
|
||||
|
||||
internal class KtFirDestructuringDeclarationSymbol(
|
||||
override val firSymbol: FirVariableSymbol<*>,
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
) : KtDestructuringDeclarationSymbol(), KtFirSymbol<FirVariableSymbol<*>> {
|
||||
|
||||
init {
|
||||
require(firSymbol.name == SpecialNames.DESTRUCT)
|
||||
}
|
||||
|
||||
override val psi: KtDestructuringDeclaration
|
||||
get() = withValidityAssertion {
|
||||
when (val psi = firSymbol.fir.psi) {
|
||||
is KtDestructuringDeclaration -> psi
|
||||
is KtParameter -> psi.destructuringDeclaration
|
||||
?: errorWithAttachment("Expected to find lambda ${KtParameter::class} with ${KtDestructuringDeclaration::class}") {
|
||||
withPsiEntry("psi", psi)
|
||||
}
|
||||
else -> errorWithAttachment("Expected to find ${KtDestructuringDeclaration::class} or ${KtParameter::class} but ${psi?.let { it::class }} found") {
|
||||
withPsiEntry("psi", psi)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override val annotationsList: KtAnnotationsList
|
||||
get() = withValidityAssertion { KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token) }
|
||||
|
||||
override val entries: List<KtLocalVariableSymbol>
|
||||
get() = withValidityAssertion {
|
||||
psi.entries.map { entry ->
|
||||
with(analysisSession) { entry.getDestructuringDeclarationEntrySymbol() }
|
||||
}
|
||||
}
|
||||
|
||||
context(KtAnalysisSession)
|
||||
override fun createPointer(): KtSymbolPointer<KtDestructuringDeclarationSymbol> {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource<KtDestructuringDeclarationSymbol>(this)
|
||||
?: throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(SpecialNames.DESTRUCT.asString())
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
return other is KtFirDestructuringDeclarationSymbol && firSymbol == other.firSymbol
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return firSymbol.hashCode()
|
||||
}
|
||||
}
|
||||
+5
-1
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral
|
||||
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore
|
||||
|
||||
internal class KtFirSymbolProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -198,4 +197,9 @@ internal class KtFirSymbolProvider(
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getDestructuringDeclarationSymbol(psi: KtDestructuringDeclaration): KtDestructuringDeclarationSymbol {
|
||||
val firSymbol = psi.resolveToFirSymbolOfType<FirVariableSymbol<*>>(firResolveSession)
|
||||
return firSymbolBuilder.buildDestructuringDeclarationSymbol(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -323,6 +323,18 @@ public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("destructuringDeclaration.kt")
|
||||
public void testDestructuringDeclaration() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring/destructuringDeclaration.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("destructuringDeclarationInLambda.kt")
|
||||
public void testDestructuringDeclarationInLambda() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring/destructuringDeclarationInLambda.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("destructuringDeclarationParameterInLambda.kt")
|
||||
public void testDestructuringDeclarationParameterInLambda() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user