[Analysis API FIR] fix KtSymbol creation for _ destructuring parameter

We need to have a corresponding declaration in the FIR tree,
so we can create a symbol for it

^KT-60904 fixed
^KT-60904 fixed
This commit is contained in:
Ilya Kirillov
2023-08-15 18:52:46 +02:00
committed by Space Team
parent 04b9faf9e6
commit c963eadb44
36 changed files with 431 additions and 11 deletions
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.psi
@@ -130,6 +131,11 @@ internal class KtFirImportOptimizer(
super.visitImplicitInvokeCall(implicitInvokeCall)
}
override fun visitProperty(property: FirProperty) {
if (property.name == SpecialNames.UNDERSCORE_FOR_UNUSED_VAR) return
super.visitProperty(property)
}
override fun visitComponentCall(componentCall: FirComponentCall) {
processFunctionCall(componentCall)
super.visitComponentCall(componentCall)
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.fir.components.KtFirAnalysisSessionComp
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.resolveToFirSymbol
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
@@ -25,6 +26,7 @@ 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,
@@ -186,11 +188,14 @@ internal class KtFirSymbolProvider(
override val ROOT_PACKAGE_SYMBOL: KtPackageSymbol = KtFirPackageSymbol(FqName.ROOT, firResolveSession.project, token)
override fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtFirLocalOrErrorVariableSymbol<*, *> {
return when (val firSymbol = psi.resolveToFirSymbolOfType<FirVariableSymbol<*>>(firResolveSession)) {
override fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtLocalVariableSymbol {
return when (val firSymbol = psi.resolveToFirSymbol(firResolveSession)) {
is FirPropertySymbol -> firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol(firSymbol)
is FirErrorPropertySymbol -> firSymbolBuilder.variableLikeBuilder.buildErrorVariableSymbol(firSymbol)
else -> throwUnexpectedFirElementError(firSymbol, psi, FirPropertySymbol::class, FirErrorPropertySymbol::class)
else -> throwUnexpectedFirElementError(
firSymbol, psi,
FirPropertySymbol::class, FirErrorPropertySymbol::class, FirValueParameterSymbol::class
)
}
}
}
@@ -314,6 +314,46 @@ public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring")
@TestDataPath("$PROJECT_ROOT")
public class Destructuring {
@Test
public void testAllFilesPresentInDestructuring() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("destructuringDeclarationParameterInLambda.kt")
public void testDestructuringDeclarationParameterInLambda() throws Exception {
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring/destructuringDeclarationParameterInLambda.kt");
}
@Test
@TestMetadata("entryInDestructuringDeclaration.kt")
public void testEntryInDestructuringDeclaration() throws Exception {
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring/entryInDestructuringDeclaration.kt");
}
@Test
@TestMetadata("entryInDestructuringDeclarationParameterInLambda.kt")
public void testEntryInDestructuringDeclarationParameterInLambda() throws Exception {
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring/entryInDestructuringDeclarationParameterInLambda.kt");
}
@Test
@TestMetadata("entryUnderscoreInDestructuringDeclaration.kt")
public void testEntryUnderscoreInDestructuringDeclaration() throws Exception {
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring/entryUnderscoreInDestructuringDeclaration.kt");
}
@Test
@TestMetadata("entryUnderscoreInDestructuringDeclarationParameterInLambda.kt")
public void testEntryUnderscoreInDestructuringDeclarationParameterInLambda() throws Exception {
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/destructuring/entryUnderscoreInDestructuringDeclarationParameterInLambda.kt");
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors")
@TestDataPath("$PROJECT_ROOT")