diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/LLFirDeclarationModificationService.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/LLFirDeclarationModificationService.kt index 61baa2e64d2..6c1440b86ce 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/LLFirDeclarationModificationService.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/LLFirDeclarationModificationService.kt @@ -11,13 +11,19 @@ import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirInternals +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession +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.file.structure.LLFirDeclarationModificationService.ModificationType +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.codeFragment +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider import org.jetbrains.kotlin.analysis.providers.analysisMessageBus import org.jetbrains.kotlin.analysis.providers.topics.KotlinTopics.MODULE_OUT_OF_BLOCK_MODIFICATION import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.psi.KtAnnotated import org.jetbrains.kotlin.psi.KtCodeFragment +import org.jetbrains.kotlin.psi.KtDeclaration /** * This service is responsible for processing incoming [PsiElement] changes to reflect them on FIR tree. @@ -56,14 +62,31 @@ class LLFirDeclarationModificationService(val project: Project) { when (val changeType = calculateChangeType(element, modificationType)) { is ChangeType.Invisible -> {} - is ChangeType.InBlock -> invalidateAfterInBlockModification(changeType.blockOwner) - is ChangeType.OutOfBlock -> { - val ktModule = ProjectStructureProvider.getModule(project, element, contextualModule = null) - project.analysisMessageBus.syncPublisher(MODULE_OUT_OF_BLOCK_MODIFICATION).onModification(ktModule) - } + is ChangeType.InBlock -> inBlockModification(changeType.blockOwner) + is ChangeType.OutOfBlock -> outOfBlockModification(element) } } + private fun inBlockModification(declaration: PsiElement) { + val ktModule = ProjectStructureProvider.getModule(project, declaration, contextualModule = null) + val resolveSession = ktModule.getFirResolveSession(project) + val firDeclaration = when (declaration) { + is KtCodeFragment -> declaration.getOrBuildFirFile(resolveSession).codeFragment + is KtDeclaration -> declaration.resolveToFirSymbol(resolveSession).fir + else -> errorWithFirSpecificEntries( + "Unexpected declaration kind: ${declaration::class.simpleName}", + psi = declaration, + ) + } + + invalidateAfterInBlockModification(firDeclaration) + } + + private fun outOfBlockModification(element: PsiElement) { + val ktModule = ProjectStructureProvider.getModule(project, element, contextualModule = null) + project.analysisMessageBus.syncPublisher(MODULE_OUT_OF_BLOCK_MODIFICATION).onModification(ktModule) + } + /** * @return the psi element (ancestor of the changedElement) which should be re-highlighted in case of in-block changes or null if unsure */ diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/inBlockModification.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/inBlockModification.kt index 3e23c44c3eb..92f9a897af2 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/inBlockModification.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/inBlockModification.kt @@ -5,13 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure -import com.intellij.openapi.application.ApplicationManager -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession -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.util.codeFragment import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries -import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirBlock @@ -21,34 +15,18 @@ import org.jetbrains.kotlin.fir.expressions.FirLazyExpression import org.jetbrains.kotlin.fir.expressions.builder.buildLazyBlock import org.jetbrains.kotlin.fir.expressions.builder.buildLazyExpression import org.jetbrains.kotlin.fir.expressions.impl.FirContractCallBlock -import org.jetbrains.kotlin.psi.KtAnnotated -import org.jetbrains.kotlin.psi.KtCodeFragment -import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.fir.psi /** * Must be called in a write action. * @return **false** if it is not in-block modification */ -internal fun invalidateAfterInBlockModification(declaration: KtAnnotated): Boolean { - ApplicationManager.getApplication().assertIsWriteThread() - - val project = declaration.project - val ktModule = ProjectStructureProvider.getModule(project, declaration, contextualModule = null) - val resolveSession = ktModule.getFirResolveSession(project) - - val firDeclaration = when (declaration) { - is KtCodeFragment -> declaration.getOrBuildFirFile(resolveSession).codeFragment - is KtDeclaration -> declaration.resolveToFirSymbol(resolveSession).fir - else -> errorWithFirSpecificEntries("Unexpected declaration kind: ${declaration.javaClass.simpleName}", psi = declaration) - } - - return when (firDeclaration) { - is FirSimpleFunction -> firDeclaration.inBodyInvalidation() - is FirPropertyAccessor -> firDeclaration.inBodyInvalidation() - is FirProperty -> firDeclaration.inBodyInvalidation() - is FirCodeFragment -> firDeclaration.inBodyInvalidation() - else -> errorWithFirSpecificEntries("Unknown declaration with body", fir = firDeclaration, psi = declaration) - } +internal fun invalidateAfterInBlockModification(declaration: FirDeclaration): Boolean = when (declaration) { + is FirSimpleFunction -> declaration.inBodyInvalidation() + is FirPropertyAccessor -> declaration.inBodyInvalidation() + is FirProperty -> declaration.inBodyInvalidation() + is FirCodeFragment -> declaration.inBodyInvalidation() + else -> errorWithFirSpecificEntries("Unknown declaration with body", fir = declaration, psi = declaration.psi) } /**