diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt index 7ba5a4978de..fdcf235546d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic import org.jetbrains.kotlin.fir.declarations.FirFile @@ -17,10 +18,8 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarati import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider import org.jetbrains.kotlin.idea.fir.low.level.api.util.findSourceNonLocalFirDeclaration import org.jetbrains.kotlin.idea.util.getElementTextInContext -import org.jetbrains.kotlin.psi.KtAnnotated -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType import java.util.concurrent.ConcurrentHashMap @@ -58,16 +57,31 @@ internal class FileStructure( @OptIn(ExperimentalStdlibApi::class) fun getAllDiagnosticsForFile(): Collection> { - val containersForStructureElement = buildList { - add(ktFile) - addAll(ktFile.declarations) - } - val structureElements = containersForStructureElement.map(::getStructureElementFor) + val structureElements = getAllStructureElements() return buildSet { structureElements.forEach { it.diagnostics.forEach { diagnostics -> addAll(diagnostics) } } } } + private fun getAllStructureElements(): Collection { + val structureElements = mutableSetOf(getStructureElementFor(ktFile)) + ktFile.accept(object : KtVisitorVoid() { + override fun visitElement(element: PsiElement) { + element.acceptChildren(this) + } + + override fun visitDeclaration(dcl: KtDeclaration) { + val structureElement = getStructureElementFor(dcl) + structureElements += structureElement + if (structureElement !is ReanalyzableStructureElement<*>) { + dcl.acceptChildren(this) + } + } + }) + + return structureElements + } + private fun createDeclarationStructure(declaration: KtDeclaration): FileStructureElement { val firDeclaration = declaration.findSourceNonLocalFirDeclaration( diff --git a/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt b/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt index 335c5cc6566..43d89342ac9 100644 --- a/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt +++ b/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt @@ -1,4 +1,5 @@ // "Remove 'public' modifier" "true" class Foo { public private fun bar() { } -} \ No newline at end of file +} +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt.after b/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt.after index 3c58a6569a0..53d3d562378 100644 --- a/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt.after +++ b/idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt.after @@ -1,4 +1,5 @@ // "Remove 'public' modifier" "true" class Foo { private fun bar() { } -} \ No newline at end of file +} +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt b/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt index acec3eb7ca5..7ba120a4a4f 100644 --- a/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt +++ b/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt @@ -6,3 +6,5 @@ abstract class B() { abstract class A() : B() { open abstract override fun foo() } + +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt.after b/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt.after index 38c63050707..0a9cd079d2d 100644 --- a/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt.after +++ b/idea/testData/quickfix/modifiers/removeRedundantModifier1.kt.after @@ -6,3 +6,5 @@ abstract class B() { abstract class A() : B() { abstract override fun foo() } + +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt b/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt index 0e158cee4dc..2b1f305be5a 100644 --- a/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt +++ b/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt @@ -6,3 +6,5 @@ abstract class B() { abstract class A() : B() { abstract open override fun foo() } + +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt.after b/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt.after index 181b7b6aadc..d2793d1d8f0 100644 --- a/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt.after +++ b/idea/testData/quickfix/modifiers/removeRedundantModifier2.kt.after @@ -6,3 +6,5 @@ abstract class B() { abstract class A() : B() { abstract override fun foo() } + +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt b/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt index 7db5121da51..015edbc3b51 100644 --- a/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt +++ b/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt @@ -6,3 +6,5 @@ abstract class B() { abstract class A() : B() { abstract override open fun foo() } + +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt.after b/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt.after index 2f6b03af29c..ab85cc6330e 100644 --- a/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt.after +++ b/idea/testData/quickfix/modifiers/removeRedundantModifier3.kt.after @@ -6,3 +6,5 @@ abstract class B() { abstract class A() : B() { abstract override fun foo() } + +/* FIR_COMPARISON */ \ No newline at end of file