From 31852c6c0558a6f908fdf3cad1ea2798c251fb4a Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Mon, 12 Feb 2024 16:10:36 +0100 Subject: [PATCH] [LL FIR] FileStructure: support dangling modifier list in non-end position The root cause of the exception is that we missed such an element, and it led to unresolved declaration during iteration over file declarations ^KT-65562 Fixed --- ...ourceModuleCollectDiagnosticsTestGenerated.java | 12 ++++++++++++ ...ourceModuleCollectDiagnosticsTestGenerated.java | 12 ++++++++++++ ...anglingFileCollectDiagnosticsTestGenerated.java | 12 ++++++++++++ ...ourceModuleCollectDiagnosticsTestGenerated.java | 12 ++++++++++++ ...anglingFileCollectDiagnosticsTestGenerated.java | 12 ++++++++++++ .../diagnostics/danglingAnnotationInMiddle.kt | 2 ++ .../diagnostics/danglingAnnotationInMiddle.txt | 4 ++++ .../danglingAnnotationInMiddleWithComment.kt | 2 ++ .../danglingAnnotationInMiddleWithComment.txt | 4 ++++ .../level/api/fir/file/structure/FileStructure.kt | 9 ++++++--- .../fileStructure/danglingAnnotationInMiddle.kt | 4 ++++ .../danglingAnnotationInMiddle.lazy.resolve.txt | 14 ++++++++++++++ ...fContentRootContextCollectionTestGenerated.java | 6 ++++++ .../FirSourceContextCollectionTestGenerated.java | 6 ++++++ ...rceDiagnosticTraversalCounterTestGenerated.java | 6 ++++++ .../file/structure/AbstractFileStructureTest.kt | 3 ++- ...OutOfContentRootFileStructureTestGenerated.java | 6 ++++++ .../SourceFileStructureTestGenerated.java | 6 ++++++ ...tentRootWholeFileResolvePhaseTestGenerated.java | 6 ++++++ .../SourceWholeFileResolvePhaseTestGenerated.java | 6 ++++++ 20 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt create mode 100644 analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.txt create mode 100644 analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt create mode 100644 analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.txt create mode 100644 analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt create mode 100644 analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.lazy.resolve.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java index b0c97b691f1..a295976572c 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/diagnosticProvider/Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java @@ -52,6 +52,18 @@ public class Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated ex runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/annotationWithEnumFromDuplicatedLibrary.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt"); + } + + @Test + @TestMetadata("danglingAnnotationInMiddleWithComment.kt") + public void testDanglingAnnotationInMiddleWithComment() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt"); + } + @Test @TestMetadata("declarationErrors.kt") public void testDeclarationErrors() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java index f5a511644c9..600863857cb 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java @@ -52,6 +52,18 @@ public class FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated ext runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/annotationWithEnumFromDuplicatedLibrary.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt"); + } + + @Test + @TestMetadata("danglingAnnotationInMiddleWithComment.kt") + public void testDanglingAnnotationInMiddleWithComment() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt"); + } + @Test @TestMetadata("declarationErrors.kt") public void testDeclarationErrors() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java index 95cdfbff74a..5ba50d4b481 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java @@ -52,6 +52,18 @@ public class FirIdeNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestG runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/annotationWithEnumFromDuplicatedLibrary.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt"); + } + + @Test + @TestMetadata("danglingAnnotationInMiddleWithComment.kt") + public void testDanglingAnnotationInMiddleWithComment() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt"); + } + @Test @TestMetadata("declarationErrors.kt") public void testDeclarationErrors() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java index c63b2e32757..a9e96420d3d 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated.java @@ -52,6 +52,18 @@ public class FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenera runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/annotationWithEnumFromDuplicatedLibrary.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt"); + } + + @Test + @TestMetadata("danglingAnnotationInMiddleWithComment.kt") + public void testDanglingAnnotationInMiddleWithComment() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt"); + } + @Test @TestMetadata("declarationErrors.kt") public void testDeclarationErrors() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java index 768615ddae5..f583a8810c0 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleDanglingFileCollectDiagnosticsTestGenerated.java @@ -52,6 +52,18 @@ public class FirStandaloneNormalAnalysisSourceModuleDanglingFileCollectDiagnosti runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/annotationWithEnumFromDuplicatedLibrary.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt"); + } + + @Test + @TestMetadata("danglingAnnotationInMiddleWithComment.kt") + public void testDanglingAnnotationInMiddleWithComment() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt"); + } + @Test @TestMetadata("declarationErrors.kt") public void testDeclarationErrors() throws Exception { diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt new file mode 100644 index 00000000000..808e71b0cb7 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.kt @@ -0,0 +1,2 @@ +@MyAnn +fin class Foo \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.txt b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.txt new file mode 100644 index 00000000000..d59a223e62f --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddle.txt @@ -0,0 +1,4 @@ +Diagnostics from elements: + for PSI element of type KtNameReferenceExpression at (1,2-7) + UNRESOLVED_REFERENCE text ranges: [(1,6)] + PSI: KtNameReferenceExpression at (1,2-7) diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt new file mode 100644 index 00000000000..944ed11d1b0 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.kt @@ -0,0 +1,2 @@ +@MyAnn // comment +/*comment*/ope class Foo \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.txt b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.txt new file mode 100644 index 00000000000..d59a223e62f --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/danglingAnnotationInMiddleWithComment.txt @@ -0,0 +1,4 @@ +Diagnostics from elements: + for PSI element of type KtNameReferenceExpression at (1,2-7) + UNRESOLVED_REFERENCE text ranges: [(1,6)] + PSI: KtNameReferenceExpression at (1,2-7) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt index 0ac795f296f..55f06cac1f6 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 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. */ @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.utils.exceptions.withPsiEntry @@ -73,7 +74,7 @@ internal class FileStructure private constructor( container = declaration } else { val modifierList = PsiTreeUtil.getParentOfType(element, KtModifierList::class.java, false) - container = if (modifierList != null && modifierList.nextSibling is PsiErrorElement) { + container = if (modifierList != null && modifierList.getNextSiblingIgnoringWhitespaceAndComments() is PsiErrorElement) { modifierList } else { element.containingKtFile @@ -207,7 +208,9 @@ internal class FileStructure private constructor( RootStructureElement(firFile, moduleComponents) } container is KtDeclaration -> createDeclarationStructure(container) - container is KtModifierList && container.nextSibling is PsiErrorElement -> createDanglingModifierListStructure(container) + container is KtModifierList && container.getNextSiblingIgnoringWhitespaceAndComments() is PsiErrorElement -> { + createDanglingModifierListStructure(container) + } else -> errorWithAttachment("Invalid container ${container::class}") { withPsiEntry("container", container) } diff --git a/analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt b/analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt new file mode 100644 index 00000000000..74f66e4615a --- /dev/null +++ b/analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt @@ -0,0 +1,4 @@ +annotation class MyAnn/* ClassDeclarationStructureElement */ + +@MyAnn/* DeclarationStructureElement */ +fin class Foo/* ClassDeclarationStructureElement */ diff --git a/analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.lazy.resolve.txt b/analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.lazy.resolve.txt new file mode 100644 index 00000000000..3706f52e8ce --- /dev/null +++ b/analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.lazy.resolve.txt @@ -0,0 +1,14 @@ +FILE: [ResolvedTo(BODY_RESOLVE)] danglingAnnotationInMiddle.kt + public final [ResolvedTo(BODY_RESOLVE)] annotation class MyAnn : R|kotlin/Annotation| { + public [ResolvedTo(BODY_RESOLVE)] constructor(): R|MyAnn| { + super() + } + + } + public final [ResolvedTo(BODY_RESOLVE)] class Foo : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] constructor(): R|Foo| { + super() + } + + } + [ResolvedTo(BODY_RESOLVE)] @R|MyAnn|[Types]() diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirOutOfContentRootContextCollectionTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirOutOfContentRootContextCollectionTestGenerated.java index 4171509cd7b..aa9973e3129 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirOutOfContentRootContextCollectionTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirOutOfContentRootContextCollectionTestGenerated.java @@ -102,6 +102,12 @@ public class FirOutOfContentRootContextCollectionTestGenerated extends AbstractF runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationClassLevel.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt"); + } + @Test @TestMetadata("danglingAnnotationTopLevel.kt") public void testDanglingAnnotationTopLevel() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirSourceContextCollectionTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirSourceContextCollectionTestGenerated.java index e9d3dfa30f5..820443cedea 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirSourceContextCollectionTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirSourceContextCollectionTestGenerated.java @@ -102,6 +102,12 @@ public class FirSourceContextCollectionTestGenerated extends AbstractFirSourceCo runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationClassLevel.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt"); + } + @Test @TestMetadata("danglingAnnotationTopLevel.kt") public void testDanglingAnnotationTopLevel() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/SourceDiagnosticTraversalCounterTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/SourceDiagnosticTraversalCounterTestGenerated.java index 13f5478a950..6d57ad572ed 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/SourceDiagnosticTraversalCounterTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/SourceDiagnosticTraversalCounterTestGenerated.java @@ -102,6 +102,12 @@ public class SourceDiagnosticTraversalCounterTestGenerated extends AbstractSourc runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationClassLevel.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt"); + } + @Test @TestMetadata("danglingAnnotationTopLevel.kt") public void testDanglingAnnotationTopLevel() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractFileStructureTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractFileStructureTest.kt index 045265f6cad..ca9c81b2961 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractFileStructureTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractFileStructureTest.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices @@ -76,7 +77,7 @@ abstract class AbstractFileStructureTest : AbstractAnalysisApiBasedTest() { } PsiTreeUtil.getChildrenOfTypeAsList(mainFile, KtModifierList::class.java).forEach { - if (it.nextSibling is PsiErrorElement) { + if (it.getNextSiblingIgnoringWhitespaceAndComments() is PsiErrorElement) { val structureElement = declarationToStructureElement[it] ?: return@forEach val comment = structureElement.createComment() elementToComment[it] = comment diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootFileStructureTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootFileStructureTestGenerated.java index 1ee8d85425c..c58f6a7a924 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootFileStructureTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootFileStructureTestGenerated.java @@ -102,6 +102,12 @@ public class OutOfContentRootFileStructureTestGenerated extends AbstractOutOfCon runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationClassLevel.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt"); + } + @Test @TestMetadata("danglingAnnotationTopLevel.kt") public void testDanglingAnnotationTopLevel() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceFileStructureTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceFileStructureTestGenerated.java index 766966e4d81..0b1cd755474 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceFileStructureTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceFileStructureTestGenerated.java @@ -102,6 +102,12 @@ public class SourceFileStructureTestGenerated extends AbstractSourceFileStructur runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationClassLevel.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt"); + } + @Test @TestMetadata("danglingAnnotationTopLevel.kt") public void testDanglingAnnotationTopLevel() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/OutOfContentRootWholeFileResolvePhaseTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/OutOfContentRootWholeFileResolvePhaseTestGenerated.java index f742fdfe5b0..8e0bd737a81 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/OutOfContentRootWholeFileResolvePhaseTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/OutOfContentRootWholeFileResolvePhaseTestGenerated.java @@ -102,6 +102,12 @@ public class OutOfContentRootWholeFileResolvePhaseTestGenerated extends Abstract runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationClassLevel.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt"); + } + @Test @TestMetadata("danglingAnnotationTopLevel.kt") public void testDanglingAnnotationTopLevel() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/SourceWholeFileResolvePhaseTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/SourceWholeFileResolvePhaseTestGenerated.java index 1964e415ecc..d17dbb539c5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/SourceWholeFileResolvePhaseTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/SourceWholeFileResolvePhaseTestGenerated.java @@ -102,6 +102,12 @@ public class SourceWholeFileResolvePhaseTestGenerated extends AbstractSourceWhol runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationClassLevel.kt"); } + @Test + @TestMetadata("danglingAnnotationInMiddle.kt") + public void testDanglingAnnotationInMiddle() throws Exception { + runTest("analysis/low-level-api-fir/testData/fileStructure/danglingAnnotationInMiddle.kt"); + } + @Test @TestMetadata("danglingAnnotationTopLevel.kt") public void testDanglingAnnotationTopLevel() throws Exception {