[Analysis API] Fix 'getContainingDeclaration()' for code fragments

^KT-65075 Fixed
This commit is contained in:
Yan Zhulanow
2024-01-18 18:53:14 +09:00
committed by Space Team
parent 1c883c93fc
commit c548bed6f6
6 changed files with 57 additions and 6 deletions
@@ -153,8 +153,8 @@ internal class KtFirSymbolContainingDeclarationProvider(
}
}
fun getContainingDeclarationByPsi(symbol: KtSymbol): KtDeclarationSymbol {
val containingDeclaration = getContainingPsi(symbol)
fun getContainingDeclarationByPsi(symbol: KtSymbol): KtDeclarationSymbol? {
val containingDeclaration = getContainingPsi(symbol) ?: return null
return with(analysisSession) { containingDeclaration.getSymbol() }
}
@@ -221,7 +221,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
return symbol.getContainingKtModule(analysisSession.firResolveSession)
}
private fun getContainingPsi(symbol: KtSymbol): KtDeclaration {
private fun getContainingPsi(symbol: KtSymbol): KtDeclaration? {
val source = symbol.firSymbol.source
?: errorWithAttachment("PSI should present for declaration built by Kotlin code") {
withSymbolAttachment("symbolForContainingPsi", symbol, analysisSession)
@@ -245,10 +245,21 @@ internal class KtFirSymbolContainingDeclarationProvider(
}
if (isOrdinarySymbolWithSource(symbol)) {
return psi.getContainingKtDeclaration()
?: errorWithAttachment("Containing declaration should present for nested declaration ${psi::class}") {
val result = psi.getContainingPsiDeclaration()
if (result == null) {
val containingFile = psi.containingFile
if (containingFile is KtCodeFragment) {
// All content inside a code fragment is implicitly local, but there is no non-local parent
return null
}
errorWithAttachment("Containing declaration should present for nested declaration ${psi::class}") {
withSymbolAttachment("symbolForContainingPsi", symbol, analysisSession)
}
}
return result
}
errorWithAttachment("Unsupported declaration origin ${symbol.origin} ${psi::class}") {
@@ -52,6 +52,12 @@ public class FirIdeDependentAnalysisSourceModuleContainingDeclarationProviderByP
runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByPsi/classes.kt");
}
@Test
@TestMetadata("codeFragments.kt")
public void testCodeFragments() throws Exception {
runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByPsi/codeFragments.kt");
}
@Test
@TestMetadata("deeplyNestedCode.kt")
public void testDeeplyNestedCode() throws Exception {
@@ -52,6 +52,12 @@ public class FirIdeNormalAnalysisSourceModuleContainingDeclarationProviderByPsiT
runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByPsi/classes.kt");
}
@Test
@TestMetadata("codeFragments.kt")
public void testCodeFragments() throws Exception {
runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByPsi/codeFragments.kt");
}
@Test
@TestMetadata("deeplyNestedCode.kt")
public void testDeeplyNestedCode() throws Exception {