[compiler] introduce dedicated Fir declaration for dangling modifier lists (KTIJ-23008)

ensure fir annotations are included in FirDanglingModifierList and resolved,
dedicated DanglingTopLevelModifierListStructureElement exists for top
level lists only, class level lists are processed by containing structure
element
diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
index beaf356..dd026fe 100644
--- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
+++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
@@ -707,6 +707,40 @@
     }
 
     @Nested
+    @TestMetadata("analysis/analysis-api/testData/referenceResolve/danglingAnnotations")
+    @TestDataPath("$PROJECT_ROOT")
+    public class DanglingAnnotations {
+        @Test
+        public void testAllFilesPresentInDanglingAnnotations() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/danglingAnnotations"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedAnonymous.kt")
+        public void testDanglingAnnotationsResolvedAnonymous() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedClass.kt")
+        public void testDanglingAnnotationsResolvedClass() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedLocal.kt")
+        public void testDanglingAnnotationsResolvedLocal() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedTopLevel.kt")
+        public void testDanglingAnnotationsResolvedTopLevel() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt");
+        }
+    }
+
+    @Nested
     @TestMetadata("analysis/analysis-api/testData/referenceResolve/delegatedPropertyAccessors")
     @TestDataPath("$PROJECT_ROOT")
     public class DelegatedPropertyAccessors {
@@ -1598,6 +1632,12 @@
         }
 
         @Test
+        @TestMetadata("DanglingAnnotations.kt")
+        public void testDanglingAnnotations() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DanglingAnnotations.kt");
+        }
+
+        @Test
         @TestMetadata("DeprecatedHidden.kt")
         public void testDeprecatedHidden() throws Exception {
             runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DeprecatedHidden.kt");
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java
index 9e46198..48bd960 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java
@@ -707,6 +707,40 @@
     }
 
     @Nested
+    @TestMetadata("analysis/analysis-api/testData/referenceResolve/danglingAnnotations")
+    @TestDataPath("$PROJECT_ROOT")
+    public class DanglingAnnotations {
+        @Test
+        public void testAllFilesPresentInDanglingAnnotations() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/danglingAnnotations"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedAnonymous.kt")
+        public void testDanglingAnnotationsResolvedAnonymous() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedClass.kt")
+        public void testDanglingAnnotationsResolvedClass() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedLocal.kt")
+        public void testDanglingAnnotationsResolvedLocal() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedTopLevel.kt")
+        public void testDanglingAnnotationsResolvedTopLevel() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt");
+        }
+    }
+
+    @Nested
     @TestMetadata("analysis/analysis-api/testData/referenceResolve/delegatedPropertyAccessors")
     @TestDataPath("$PROJECT_ROOT")
     public class DelegatedPropertyAccessors {
@@ -1598,6 +1632,12 @@
         }
 
         @Test
+        @TestMetadata("DanglingAnnotations.kt")
+        public void testDanglingAnnotations() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DanglingAnnotations.kt");
+        }
+
+        @Test
         @TestMetadata("DeprecatedHidden.kt")
         public void testDeprecatedHidden() throws Exception {
             runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DeprecatedHidden.kt");
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java
index 22c1a0d..713f598 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java
@@ -685,6 +685,40 @@
     }
 
     @Nested
+    @TestMetadata("analysis/analysis-api/testData/referenceResolve/danglingAnnotations")
+    @TestDataPath("$PROJECT_ROOT")
+    public class DanglingAnnotations {
+        @Test
+        public void testAllFilesPresentInDanglingAnnotations() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/danglingAnnotations"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedAnonymous.kt")
+        public void testDanglingAnnotationsResolvedAnonymous() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedClass.kt")
+        public void testDanglingAnnotationsResolvedClass() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedLocal.kt")
+        public void testDanglingAnnotationsResolvedLocal() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedTopLevel.kt")
+        public void testDanglingAnnotationsResolvedTopLevel() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt");
+        }
+    }
+
+    @Nested
     @TestMetadata("analysis/analysis-api/testData/referenceResolve/delegatedPropertyAccessors")
     @TestDataPath("$PROJECT_ROOT")
     public class DelegatedPropertyAccessors {
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
index 84ecb68..794e673 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
@@ -707,6 +707,40 @@
     }
 
     @Nested
+    @TestMetadata("analysis/analysis-api/testData/referenceResolve/danglingAnnotations")
+    @TestDataPath("$PROJECT_ROOT")
+    public class DanglingAnnotations {
+        @Test
+        public void testAllFilesPresentInDanglingAnnotations() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/danglingAnnotations"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedAnonymous.kt")
+        public void testDanglingAnnotationsResolvedAnonymous() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedClass.kt")
+        public void testDanglingAnnotationsResolvedClass() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedLocal.kt")
+        public void testDanglingAnnotationsResolvedLocal() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedTopLevel.kt")
+        public void testDanglingAnnotationsResolvedTopLevel() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt");
+        }
+    }
+
+    @Nested
     @TestMetadata("analysis/analysis-api/testData/referenceResolve/delegatedPropertyAccessors")
     @TestDataPath("$PROJECT_ROOT")
     public class DelegatedPropertyAccessors {
@@ -1598,6 +1632,12 @@
         }
 
         @Test
+        @TestMetadata("DanglingAnnotations.kt")
+        public void testDanglingAnnotations() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DanglingAnnotations.kt");
+        }
+
+        @Test
         @TestMetadata("DeprecatedHidden.kt")
         public void testDeprecatedHidden() throws Exception {
             runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DeprecatedHidden.kt");
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
index fdedbc7..d5c8215 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java
@@ -707,6 +707,40 @@
     }
 
     @Nested
+    @TestMetadata("analysis/analysis-api/testData/referenceResolve/danglingAnnotations")
+    @TestDataPath("$PROJECT_ROOT")
+    public class DanglingAnnotations {
+        @Test
+        public void testAllFilesPresentInDanglingAnnotations() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/danglingAnnotations"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedAnonymous.kt")
+        public void testDanglingAnnotationsResolvedAnonymous() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedClass.kt")
+        public void testDanglingAnnotationsResolvedClass() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedLocal.kt")
+        public void testDanglingAnnotationsResolvedLocal() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt");
+        }
+
+        @Test
+        @TestMetadata("DanglingAnnotationsResolvedTopLevel.kt")
+        public void testDanglingAnnotationsResolvedTopLevel() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt");
+        }
+    }
+
+    @Nested
     @TestMetadata("analysis/analysis-api/testData/referenceResolve/delegatedPropertyAccessors")
     @TestDataPath("$PROJECT_ROOT")
     public class DelegatedPropertyAccessors {
@@ -1598,6 +1632,12 @@
         }
 
         @Test
+        @TestMetadata("DanglingAnnotations.kt")
+        public void testDanglingAnnotations() throws Exception {
+            runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DanglingAnnotations.kt");
+        }
+
+        @Test
         @TestMetadata("DeprecatedHidden.kt")
         public void testDeprecatedHidden() throws Exception {
             runTest("analysis/analysis-api/testData/referenceResolve/withErrors/DeprecatedHidden.kt");
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt
new file mode 100644
index 0000000..e83f7f7
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.kt
@@ -0,0 +1,10 @@
+// COMPILATION_ERRORS
+annotation class Ann0
+interface I
+class Foo {
+    fun foo() {
+        val i = object : I {
+            @<caret>Ann0 @Suppress
+        }
+    }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.txt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.txt
new file mode 100644
index 0000000..26a0a77
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedAnonymous.txt
@@ -0,0 +1,2 @@
+Resolved to:
+0: (in Ann0) constructor()
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt
new file mode 100644
index 0000000..f19134b
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.kt
@@ -0,0 +1,6 @@
+// COMPILATION_ERRORS
+annotation class Ann0
+interface I
+class Foo {
+    @<caret>Ann0 @Suppress
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.txt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.txt
new file mode 100644
index 0000000..26a0a77
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedClass.txt
@@ -0,0 +1,2 @@
+Resolved to:
+0: (in Ann0) constructor()
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt
new file mode 100644
index 0000000..7ae20da
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.kt
@@ -0,0 +1,9 @@
+// COMPILATION_ERRORS
+annotation class Ann0
+class Foo {
+    fun foo() {
+        class Local {
+            @<caret>Ann0 @Suppress
+        }
+    }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.txt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.txt
new file mode 100644
index 0000000..26a0a77
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedLocal.txt
@@ -0,0 +1,2 @@
+Resolved to:
+0: (in Ann0) constructor()
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt
new file mode 100644
index 0000000..4f8267f
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.kt
@@ -0,0 +1,3 @@
+// COMPILATION_ERRORS
+annotation class Ann0
+@<caret>Ann0 @Suppress
diff --git a/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.txt b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.txt
new file mode 100644
index 0000000..26a0a77
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/danglingAnnotations/DanglingAnnotationsResolvedTopLevel.txt
@@ -0,0 +1,2 @@
+Resolved to:
+0: (in Ann0) constructor()
diff --git a/analysis/analysis-api/testData/referenceResolve/withErrors/DanglingAnnotations.kt b/analysis/analysis-api/testData/referenceResolve/withErrors/DanglingAnnotations.kt
new file mode 100644
index 0000000..624aefc
--- /dev/null
+++ b/analysis/analysis-api/testData/referenceResolve/withErrors/DanglingAnnotations.kt
@@ -0,0 +1,8 @@
+// UNRESOLVED_REFERENCE
+class Foo {
+    fun foo() {
+        class Local {
+            @<caret>Ann0
+        }
+    }
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt
index c03997b..75521ec 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt
@@ -18,11 +18,15 @@
 import org.jetbrains.kotlin.fir.declarations.*
 import org.jetbrains.kotlin.fir.declarations.utils.classId
 import org.jetbrains.kotlin.fir.declarations.utils.isLocal
-import org.jetbrains.kotlin.fir.diagnostics.ConeDestructuringDeclarationsOnTopLevel
 import org.jetbrains.kotlin.fir.java.javaSymbolProvider
 import org.jetbrains.kotlin.fir.resolve.providers.firProvider
 import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
 import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLookupTagWithFixedSymbol
+import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
+import org.jetbrains.kotlin.analysis.utils.errors.checkWithAttachmentBuilder
+import org.jetbrains.kotlin.fir.containingClass
+import org.jetbrains.kotlin.fir.diagnostics.ConeDestructuringDeclarationsOnTopLevel
+import org.jetbrains.kotlin.fir.java.javaSymbolProvider
 
 class FirDesignationWithFile(
     path: List<FirRegularClass>,
@@ -92,6 +96,11 @@
             outerClassId?.let(target.moduleData.session.firProvider::getFirClassifierByFqName)
                 ?: outerClassId?.let(target.moduleData.session.javaSymbolProvider::getClassLikeSymbolByClassId)?.fir
         }
+        is FirDanglingModifierList -> {
+            val klass = target.containingClass() ?: return emptyList()
+            if (klass.classId.isLocal) return null
+            klass.toFirRegularClassFromSameSession(target.moduleData.session)
+        }
         else -> return null
     } ?: return emptyList()
 
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/ContextCollectingDiagnosticCollectorVisitor.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/ContextCollectingDiagnosticCollectorVisitor.kt
index a71fb71..ebe8aab 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/ContextCollectingDiagnosticCollectorVisitor.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/ContextCollectingDiagnosticCollectorVisitor.kt
@@ -12,10 +12,8 @@
 import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
 import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
 import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollectorVisitor
-import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
-import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
-import org.jetbrains.kotlin.fir.declarations.FirDeclaration
-import org.jetbrains.kotlin.fir.declarations.FirFile
+import org.jetbrains.kotlin.fir.containingClass
+import org.jetbrains.kotlin.fir.declarations.*
 import org.jetbrains.kotlin.fir.renderWithType
 import org.jetbrains.kotlin.fir.resolve.SessionHolder
 
@@ -61,6 +59,7 @@
         val isLocal = when (declaration) {
             is FirClassLikeDeclaration -> declaration.symbol.classId.isLocal
             is FirCallableDeclaration -> declaration.symbol.callableId.isLocal
+            is FirDanglingModifierList -> declaration.containingClass()?.classId?.isLocal == true
             else -> error("Unsupported declaration ${declaration.renderWithType()}")
         }
         require(!isLocal) {
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 9cf791b..fc34d9f 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
@@ -6,12 +6,17 @@
 package org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure
 
 import com.intellij.psi.PsiElement
+import com.intellij.psi.PsiErrorElement
+import com.intellij.psi.util.PsiTreeUtil
 import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
 import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
+import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
+import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceByTraversingWholeTree
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration
 import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
 import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
 import org.jetbrains.kotlin.fir.declarations.FirFile
 import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
 import org.jetbrains.kotlin.fir.resolve.providers.firProvider
@@ -36,14 +41,23 @@
 
     private val firProvider = firFile.moduleData.session.firProvider
 
-    private val structureElements = ConcurrentHashMap<KtAnnotated, FileStructureElement>()
+    private val structureElements = ConcurrentHashMap<KtElement, FileStructureElement>()
 
     fun getStructureElementFor(element: KtElement): FileStructureElement {
-        val container: KtAnnotated = element.getNonLocalContainingOrThisDeclaration() ?: element.containingKtFile
+        val declaration = element.getNonLocalContainingOrThisDeclaration()
+        val container: KtElement
+        if (declaration != null) {
+            container = declaration
+        } else {
+            val modifierList = PsiTreeUtil.getParentOfType(element, KtModifierList::class.java, false)
+            container = if (modifierList != null && modifierList.nextSibling is PsiErrorElement) {
+                modifierList
+            } else element.containingKtFile
+        }
         return getStructureElementForDeclaration(container)
     }
 
-    private fun getStructureElementForDeclaration(declaration: KtAnnotated): FileStructureElement {
+    private fun getStructureElementForDeclaration(declaration: KtElement): FileStructureElement {
         @Suppress("CANNOT_CHECK_FOR_ERASED")
         val structureElement = structureElements.compute(declaration) { _, structureElement ->
             when {
@@ -91,6 +105,12 @@
                     dcl.acceptChildren(this)
                 }
             }
+
+            override fun visitModifierList(list: KtModifierList) {
+                if (list.parent == ktFile) {
+                    structureElements += getStructureElementFor(list)
+                }
+            }
         })
 
         return structureElements
@@ -112,8 +132,15 @@
         )
     }
 
-    private fun createStructureElement(container: KtAnnotated): FileStructureElement = when (container) {
-        is KtFile -> {
+    private fun createDanglingModifierListStructure(container: KtElement): FileStructureElement {
+        val firDanglingModifierList = container.findSourceByTraversingWholeTree(moduleComponents.firFileBuilder, firFile) as? FirDanglingModifierList
+                ?: errorWithFirSpecificEntries("No dangling modifier found", psi = container)
+        firDanglingModifierList.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
+        return DanglingTopLevelModifierListStructureElement(firFile, firDanglingModifierList, moduleComponents, container.containingKtFile)
+    }
+
+    private fun createStructureElement(container: KtElement): FileStructureElement = when {
+        container is KtFile -> {
             val firFile = moduleComponents.firFileBuilder.buildRawFirFileWithCaching(ktFile)
             moduleComponents.firModuleLazyDeclarationResolver.lazyResolve(
                 target = firFile.annotationsContainer,
@@ -123,7 +150,8 @@
 
             RootStructureElement(firFile, container, moduleComponents)
         }
-        is KtDeclaration -> createDeclarationStructure(container)
+        container is KtDeclaration -> createDeclarationStructure(container)
+        container is KtModifierList && container.nextSibling is PsiErrorElement -> createDanglingModifierListStructure(container)
         else -> error("Invalid container $container")
     }
 }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt
index 7a81307..23fa253 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt
@@ -226,6 +226,12 @@
     }
 }
 
+internal class DanglingTopLevelModifierListStructureElement(firFile: FirFile, val fir: FirDeclaration, moduleComponents: LLFirModuleResolveComponents, override val psi: KtAnnotated) :
+    FileStructureElement(firFile, moduleComponents) {
+    override val mappings = KtToFirMapping(fir, FirElementsRecorder())
+
+    override val diagnostics = FileStructureElementDiagnostics(firFile, SingleNonLocalDeclarationDiagnosticRetriever(fir), moduleComponents)
+}
 
 internal class RootStructureElement(
     firFile: FirFile,
@@ -246,4 +252,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt
index aa0dd30..961a03b 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt
@@ -116,6 +116,7 @@
                         it.kind == KtFakeSourceElementKind.DesugaredPrefixNameReference ||
                         it.kind == KtFakeSourceElementKind.DesugaredPostfixNameReference ||
                         it.kind == KtFakeSourceElementKind.SmartCastExpression ||
+                        it.kind == KtFakeSourceElementKind.DanglingModifierList ||
                         it.isSourceForCompoundAccess(element)
             }.psi as? KtElement
             ?: return
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt
index 9f7dd28..27a3a189 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt
@@ -18,6 +18,7 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirLazyTransformerExecutor
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration
+import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ktDeclaration
 import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
 import org.jetbrains.kotlin.analysis.utils.errors.rethrowExceptionWithDetails
 import org.jetbrains.kotlin.fir.FirElement
@@ -29,6 +30,11 @@
 import org.jetbrains.kotlin.fir.resolve.providers.firProvider
 import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
 import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
+import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
+import org.jetbrains.kotlin.fir.psi
+import org.jetbrains.kotlin.psi.*
+import org.jetbrains.kotlin.util.SourceCodeAnalysisException
+import org.jetbrains.kotlin.util.shouldIjPlatformExceptionBeRethrown
 import org.jetbrains.kotlin.psi.KtClassBody
 import org.jetbrains.kotlin.psi.KtDeclaration
 import org.jetbrains.kotlin.psi.KtEnumEntry
@@ -224,7 +230,16 @@
         val designation: FirDesignationWithFile
         val neededPhase: FirResolvePhase
 
-        if (requestedDeclarationDesignation != null) {
+        if (target is FirDanglingModifierList) {
+            neededPhase = toPhase
+            val ktFile = target.psi?.containingFile as? KtFile
+                ?: error("File for dangling modifier list cannot be null")
+            designation = FirDesignationWithFile(
+                emptyList(),
+                target,
+                moduleComponents.cache.getCachedFirFile(ktFile) ?: error("Fir file for dandling modifier list cannot be null")
+            )
+        } else if (requestedDeclarationDesignation != null) {
             designation = requestedDeclarationDesignation
             neededPhase = toPhase
         } else {
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt
index d5676da..8b5e0d6 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/contrainingFileUtils.kt
@@ -5,6 +5,7 @@
 
 package org.jetbrains.kotlin.analysis.low.level.api.fir.util
 
+import org.jetbrains.kotlin.fir.declarations.*
 import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
 import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
 import org.jetbrains.kotlin.fir.declarations.*
@@ -20,6 +21,7 @@
         is FirValueParameter -> containingFunctionSymbol.fir.getContainingFile()
         is FirCallableDeclaration -> provider.getFirCallableContainerFile(symbol)
         is FirClassLikeDeclaration -> provider.getFirClassifierContainerFile(symbol)
+        is FirDanglingModifierList -> null
         else -> errorWithFirSpecificEntries("Unsupported declaration ${this::class.java}", fir = this)
     }
 }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt
index 746de88..719dcb1 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt
@@ -28,7 +28,7 @@
 ): FirDeclaration {
     //TODO test what way faster
     findSourceNonLocalFirDeclarationByProvider(firFileBuilder, provider, containerFirFile)?.let { return it }
-    findSourceOfNonLocalFirDeclarationByTraversingWholeTree(firFileBuilder, containerFirFile)?.let { return it }
+    findSourceByTraversingWholeTree(firFileBuilder, containerFirFile)?.let { return it }
     errorWithFirSpecificEntries("No fir element was found for", psi = this)
 }
 
@@ -56,14 +56,15 @@
     return fir
 }
 
-private fun KtDeclaration.findSourceOfNonLocalFirDeclarationByTraversingWholeTree(
+internal fun KtElement.findSourceByTraversingWholeTree(
     firFileBuilder: LLFirFileBuilder,
     containerFirFile: FirFile?,
 ): FirDeclaration? {
     val firFile = containerFirFile ?: firFileBuilder.buildRawFirFileWithCaching(containingKtFile)
-    val originalDeclaration = originalDeclaration
+    val originalDeclaration = (this as? KtDeclaration)?.originalDeclaration
+    val isDeclaration = this is KtDeclaration
     return FirElementFinder.findElementIn(firFile, canGoInside = { it is FirRegularClass }) { firDeclaration ->
-        firDeclaration.psi == this || firDeclaration.psi == originalDeclaration
+        firDeclaration.psi == this || isDeclaration && firDeclaration.psi == originalDeclaration
     }
 }
 
diff --git a/analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationClassLevel.kt b/analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationClassLevel.kt
new file mode 100644
index 0000000..9ccf19d
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationClassLevel.kt
@@ -0,0 +1,16 @@
+class Foo {/* NonReanalyzableDeclarationStructureElement */
+    @Suppress("") @MustBeDocumented
+}
+class Bar {/* NonReanalyzableDeclarationStructureElement */
+    @Suppress("") @MustBeDocumented
+}
+class Outer {/* NonReanalyzableDeclarationStructureElement */
+    class Inner {/* NonReanalyzableDeclarationStructureElement */
+        @Suppress("") @MustBeDocumented
+    }
+    fun foo() {/* ReanalyzableFunctionStructureElement */
+        class Local {
+            @Suppress("") @MustBeDocumented
+        }
+    }
+}
diff --git a/analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationTopLevel.kt b/analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationTopLevel.kt
new file mode 100644
index 0000000..dd22e44
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationTopLevel.kt
@@ -0,0 +1 @@
+@Suppress("") @MustBeDocumented/* DanglingTopLevelModifierListStructureElement */
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotation.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotation.kt
new file mode 100644
index 0000000..4bd66a6
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotation.kt
@@ -0,0 +1,3 @@
+// WITH_STDLIB
+// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtAnnotationEntry
+<expr>@Suppress("")</expr> @MustBeDocumented
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotation.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotation.txt
new file mode 100644
index 0000000..8e4d5fb
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotation.txt
@@ -0,0 +1,6 @@
+KT element: KtAnnotationEntry
+FIR element: FirAnnotationCallImpl
+FIR source kind: KtRealSourceElementKind
+
+FIR element rendered:
+@R|kotlin/Suppress|(names = vararg(String()))
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotationInClass.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotationInClass.kt
new file mode 100644
index 0000000..ee93e28
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotationInClass.kt
@@ -0,0 +1,5 @@
+// WITH_STDLIB
+// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtAnnotationEntry
+class F {
+    <expr>@Suppress("")</expr> @MustBeDocumented
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotationInClass.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotationInClass.txt
new file mode 100644
index 0000000..8e4d5fb
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotationInClass.txt
@@ -0,0 +1,6 @@
+KT element: KtAnnotationEntry
+FIR element: FirAnnotationCallImpl
+FIR source kind: KtRealSourceElementKind
+
+FIR element rendered:
+@R|kotlin/Suppress|(names = vararg(String()))
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.kt
new file mode 100644
index 0000000..2de5af7
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.kt
@@ -0,0 +1,5 @@
+annotation class JsQualifier : kotlin.Annotation {
+    public constructor JsQualifier(<expr>value</expr>: kotlin.String)
+
+    public final val value: kotlin.String { get; }
+}
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.txt
new file mode 100644
index 0000000..79024476
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.txt
@@ -0,0 +1,6 @@
+KT element: KtDeclarationModifierList
+FIR element: FirDanglingModifierListImpl
+FIR source kind: DanglingModifierList
+
+FIR element rendered:
+<DANGLING MODIFIER: Top level declaration expected>
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java
index bc306a0..ec5e989 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java
@@ -76,6 +76,18 @@
         }
 
         @Test
+        @TestMetadata("danglingAnnotationsClassLevel.kt")
+        public void testDanglingAnnotationsClassLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
+        }
+
+        @Test
+        @TestMetadata("danglingAnnotationsFileLevel.kt")
+        public void testDanglingAnnotationsFileLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
+        }
+
+        @Test
         @TestMetadata("delegates.kt")
         public void testDelegates() throws Exception {
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java
index 6156d5f..f63f31f 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java
@@ -70,6 +70,18 @@
         }
 
         @Test
+        @TestMetadata("danglingAnnotation.kt")
+        public void testDanglingAnnotation() throws Exception {
+            runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotation.kt");
+        }
+
+        @Test
+        @TestMetadata("danglingAnnotationInClass.kt")
+        public void testDanglingAnnotationInClass() throws Exception {
+            runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/danglingAnnotationInClass.kt");
+        }
+
+        @Test
         @TestMetadata("fileAnnotation.kt")
         public void testFileAnnotation() throws Exception {
             runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/fileAnnotation.kt");
@@ -566,6 +578,12 @@
         public void testJavaClassLiteral() throws Exception {
             runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/javaClassLiteral.kt");
         }
+
+        @Test
+        @TestMetadata("secondaryConstructor.kt")
+        public void testSecondaryConstructor() throws Exception {
+            runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.kt");
+        }
     }
 
     @Nested
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/AbstractFirContextCollectionTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/AbstractFirContextCollectionTest.kt
index c6cd958..6d39078 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/AbstractFirContextCollectionTest.kt
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/AbstractFirContextCollectionTest.kt
@@ -17,6 +17,8 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
 import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.BeforeElementDiagnosticCollectionHandler
 import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.fir.PersistenceContextCollector
+import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.*
+import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.DanglingTopLevelModifierListStructureElement
 import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.FileStructureElement
 import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.NonReanalyzableDeclarationStructureElement
 import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.ReanalyzableStructureElement
@@ -62,6 +64,7 @@
         is NonReanalyzableDeclarationStructureElement -> fir
         is ReanalyzableStructureElement<*, *> -> firSymbol.fir
         is RootStructureElement -> firFile
+        is DanglingTopLevelModifierListStructureElement -> fir
     }
 
 
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirContextCollectionTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirContextCollectionTestGenerated.java
index 4f67dc4..0285f61 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirContextCollectionTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/FirContextCollectionTestGenerated.java
@@ -37,6 +37,18 @@
     }
 
     @Test
+    @TestMetadata("danglingAnnotationClassLevel.kt")
+    public void testDanglingAnnotationClassLevel() throws Exception {
+        runTest("analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationClassLevel.kt");
+    }
+
+    @Test
+    @TestMetadata("danglingAnnotationTopLevel.kt")
+    public void testDanglingAnnotationTopLevel() throws Exception {
+        runTest("analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationTopLevel.kt");
+    }
+
+    @Test
     @TestMetadata("declarationsInPropertyInit.kt")
     public void testDeclarationsInPropertyInit() throws Exception {
         runTest("analysis/low-level-api-fir/testdata/fileStructure/declarationsInPropertyInit.kt");
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 c31119d..c1ff8a6 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
@@ -8,7 +8,9 @@
 import com.intellij.psi.PsiComment
 import com.intellij.psi.PsiElement
 import com.intellij.psi.PsiElementVisitor
+import com.intellij.psi.PsiErrorElement
 import com.intellij.psi.impl.source.tree.LeafPsiElement
+import com.intellij.psi.util.PsiTreeUtil
 import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirSourceResolveSession
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession
 import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableModuleSession
@@ -32,7 +34,8 @@
             val comment = structureElement.createComment()
             when (ktDeclaration) {
                 is KtClassOrObject -> {
-                    val lBrace = ktDeclaration.body?.lBrace
+                    val body = ktDeclaration.body
+                    val lBrace = body?.lBrace
                     if (lBrace != null) {
                         elementToComment[lBrace] = comment
                     } else {
@@ -62,6 +65,13 @@
             }
         }
 
+        PsiTreeUtil.getChildrenOfTypeAsList(ktFile, KtModifierList::class.java).forEach {
+            if (it.nextSibling is PsiErrorElement) {
+                val structureElement = declarationToStructureElement[ktFile] ?: return@forEach
+                val comment = structureElement.createComment()
+                elementToComment[it] = comment
+            }
+        }
 
         val text = buildString {
             ktFile.accept(object : PsiElementVisitor() {
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureTestGenerated.java
index 7ff903b..db31d95 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureTestGenerated.java
@@ -37,6 +37,18 @@
     }
 
     @Test
+    @TestMetadata("danglingAnnotationClassLevel.kt")
+    public void testDanglingAnnotationClassLevel() throws Exception {
+        runTest("analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationClassLevel.kt");
+    }
+
+    @Test
+    @TestMetadata("danglingAnnotationTopLevel.kt")
+    public void testDanglingAnnotationTopLevel() throws Exception {
+        runTest("analysis/low-level-api-fir/testdata/fileStructure/danglingAnnotationTopLevel.kt");
+    }
+
+    @Test
     @TestMetadata("declarationsInPropertyInit.kt")
     public void testDeclarationsInPropertyInit() throws Exception {
         runTest("analysis/low-level-api-fir/testdata/fileStructure/declarationsInPropertyInit.kt");
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt
index df7a889..51d6658 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt
@@ -154,7 +154,7 @@
                 fir.loadCallableSpecificExperimentalities(this, context, visited, fromSetter, dispatchReceiverType, result)
             is FirClassLikeDeclaration ->
                 fir.loadClassLikeSpecificExperimentalities(this, context, visited, result)
-            is FirAnonymousInitializer, is FirFile, is FirTypeParameter, is FirScript -> {}
+            is FirAnonymousInitializer, is FirDanglingModifierList, is FirFile, is FirTypeParameter, is FirScript -> {}
         }
 
         fir.loadExperimentalitiesFromAnnotationTo(session, result, fromSupertype)
diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt
index 9a64c8a..7d5fddd 100644
--- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt
+++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt
@@ -29,6 +29,7 @@
 import org.jetbrains.kotlin.fir.declarations.builder.*
 import org.jetbrains.kotlin.fir.declarations.impl.*
 import org.jetbrains.kotlin.fir.declarations.utils.*
+import org.jetbrains.kotlin.fir.diagnostics.ConeDanglingModifierOnTopLevel
 import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
 import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
 import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
@@ -97,6 +98,7 @@
         var fileAnnotationContainer: FirFileAnnotationsContainer? = null
         val importList = mutableListOf<FirImport>()
         val firDeclarationList = mutableListOf<FirDeclaration>()
+        val modifierList = mutableListOf<LighterASTNode>()
         context.packageFqName = FqName.ROOT
         var packageDirective: FirPackageDirective? = null
         file.forEachChildren { child ->
@@ -116,9 +118,14 @@
                 SCRIPT -> {
                     // TODO: scripts aren't supported yet
                 }
+                MODIFIER_LIST -> modifierList += child
             }
         }
 
+        modifierList.forEach {
+            firDeclarationList += buildErrorTopLevelDeclarationForDanglingModifierList(it)
+        }
+
         return buildFile {
             symbol = fileSymbol
             source = file.toFirSourceElement()
@@ -839,7 +846,8 @@
      * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseEnumClassBody
      */
     private fun convertClassBody(classBody: LighterASTNode, classWrapper: ClassWrapper): List<FirDeclaration> {
-        return classBody.forEachChildrenReturnList { node, container ->
+        val modifierLists = mutableListOf<LighterASTNode>()
+        var firDeclarations = classBody.forEachChildrenReturnList { node, container ->
             @Suppress("RemoveRedundantQualifierName")
             when (node.tokenType) {
                 ENUM_ENTRY -> container += convertEnumEntry(node, classWrapper)
@@ -850,8 +858,22 @@
                 OBJECT_DECLARATION -> container += convertClass(node)
                 CLASS_INITIALIZER -> container += convertAnonymousInitializer(node) //anonymousInitializer
                 SECONDARY_CONSTRUCTOR -> container += convertSecondaryConstructor(node, classWrapper)
+                MODIFIER_LIST -> modifierLists += node
             }
         }
+        for (node in modifierLists) {
+            firDeclarations += buildErrorTopLevelDeclarationForDanglingModifierList(node)
+        }
+        return firDeclarations
+    }
+
+    private fun buildErrorTopLevelDeclarationForDanglingModifierList(node: LighterASTNode) = buildDanglingModifierList {
+        this.source = node.toFirSourceElement(KtFakeSourceElementKind.DanglingModifierList)
+        moduleData = baseModuleData
+        origin = FirDeclarationOrigin.Source
+        diagnostic = ConeDanglingModifierOnTopLevel
+        symbol = FirDanglingModifierSymbol()
+        annotations += convertModifierList(node).annotations
     }
 
     /**
diff --git a/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java b/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java
index f69cb9a..8408ed1 100644
--- a/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java
+++ b/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java
@@ -76,6 +76,16 @@
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contextReceivers.kt");
         }
 
+        @TestMetadata("danglingAnnotationsClassLevel.kt")
+        public void testDanglingAnnotationsClassLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
+        }
+
+        @TestMetadata("danglingAnnotationsFileLevel.kt")
+        public void testDanglingAnnotationsFileLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
+        }
+
         @TestMetadata("delegates.kt")
         public void testDelegates() throws Exception {
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");
diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
index 261c3a0..06ebe68 100644
--- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
+++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
@@ -8,6 +8,7 @@
 import com.intellij.psi.PsiElement
 import com.intellij.psi.tree.IElementType
 import com.intellij.util.AstLoadingFilter
+import com.intellij.psi.util.PsiTreeUtil
 import org.jetbrains.kotlin.*
 import org.jetbrains.kotlin.builtins.StandardNames
 import org.jetbrains.kotlin.builtins.StandardNames.BACKING_FIELD
@@ -1056,6 +1057,10 @@
                         else -> declaration.convert()
                     }
                 }
+
+                for (danglingModifierList in PsiTreeUtil.getChildrenOfTypeAsList(file, KtModifierList::class.java)) {
+                    declarations += buildErrorTopLevelDeclarationForDanglingModifierList(danglingModifierList)
+                }
             }
         }
 
@@ -1267,7 +1272,14 @@
                                     classOrObject,
                                     this,
                                     typeParameters
-                                ),
+                                )
+                            )
+                        }
+                        for (danglingModifier in PsiTreeUtil.getChildrenOfTypeAsList(classOrObject.body, KtModifierList::class.java)) {
+                            addDeclaration(
+                                buildErrorTopLevelDeclarationForDanglingModifierList(danglingModifier).apply {
+                                    containingClassAttr = currentDispatchReceiverType()?.lookupTag
+                                }
                             )
                         }
 
@@ -1359,6 +1371,12 @@
                                 ownerTypeParameters = emptyList()
                             )
                         }
+
+                        for (danglingModifier in PsiTreeUtil.getChildrenOfTypeAsList(objectDeclaration.body, KtModifierList::class.java)) {
+                            declarations += buildErrorTopLevelDeclarationForDanglingModifierList(danglingModifier).apply {
+                                containingClassAttr = currentDispatchReceiverType()?.lookupTag
+                            }
+                        }
                     }.also {
                         it.delegateFieldsMap = delegatedFieldsMap
                     }
@@ -2728,6 +2746,17 @@
                 this += typeArgument.convert<FirTypeProjection>()
             }
         }
+
+        private fun buildErrorTopLevelDeclarationForDanglingModifierList(modifierList : KtModifierList) = buildDanglingModifierList {
+            this.source = modifierList.toFirSourceElement(KtFakeSourceElementKind.DanglingModifierList)
+            moduleData = baseModuleData
+            origin = FirDeclarationOrigin.Source
+            diagnostic = ConeDanglingModifierOnTopLevel
+            symbol = FirDanglingModifierSymbol()
+            for (annotationEntry in modifierList.getAnnotationEntries()) {
+                annotations += annotationEntry.convert<FirAnnotation>()
+            }
+        }
     }
 }
 
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt
new file mode 100644
index 0000000..8def9a6
--- /dev/null
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt
@@ -0,0 +1,22 @@
+class A {
+    @Suppress("") @MustBeDocumented
+}
+class B {
+    @Suppress("") @MustBeDocumented
+}
+class Outer {
+    class Inner {
+        @Suppress("") @MustBeDocumented
+    }
+
+    fun withLocal() {
+        class Local {
+            @Suppress("") @MustBeDocumented
+        }
+
+        val r : I = object : I {
+            @Suppress("") @MustBeDocumented
+        }
+    }
+}
+interface I {}
\ No newline at end of file
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.lazyBodies.txt
new file mode 100644
index 0000000..2c1c255
--- /dev/null
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.lazyBodies.txt
@@ -0,0 +1,33 @@
+FILE: danglingAnnotationsClassLevel.kt
+    public? final? class A : R|kotlin/Any| {
+        public? constructor(): R|A| {
+            super<R|kotlin/Any|>()
+        }
+
+        @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+    }
+    public? final? class B : R|kotlin/Any| {
+        public? constructor(): R|B| {
+            super<R|kotlin/Any|>()
+        }
+
+        @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+    }
+    public? final? class Outer : R|kotlin/Any| {
+        public? constructor(): R|Outer| {
+            super<R|kotlin/Any|>()
+        }
+
+        public? final? class Inner : R|kotlin/Any| {
+            public? constructor(): R|Outer.Inner| {
+                super<R|kotlin/Any|>()
+            }
+
+            @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+        }
+
+        public? final? fun withLocal(): R|kotlin/Unit| { LAZY_BLOCK }
+
+    }
+    public? final? interface I : R|kotlin/Any| {
+    }
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.txt
new file mode 100644
index 0000000..19f0346
--- /dev/null
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.txt
@@ -0,0 +1,50 @@
+FILE: danglingAnnotationsClassLevel.kt
+    public? final? class A : R|kotlin/Any| {
+        public? [ContainingClassKey=A] constructor(): R|A| {
+            super<R|kotlin/Any|>()
+        }
+
+        @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+    }
+    public? final? class B : R|kotlin/Any| {
+        public? [ContainingClassKey=B] constructor(): R|B| {
+            super<R|kotlin/Any|>()
+        }
+
+        @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+    }
+    public? final? class Outer : R|kotlin/Any| {
+        public? [ContainingClassKey=Outer] constructor(): R|Outer| {
+            super<R|kotlin/Any|>()
+        }
+
+        public? final? class Inner : R|kotlin/Any| {
+            public? [ContainingClassKey=Inner] constructor(): R|Outer.Inner| {
+                super<R|kotlin/Any|>()
+            }
+
+            @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+        }
+
+        public? final? fun withLocal(): R|kotlin/Unit| {
+            local final? [ContainingClassKey=Outer] class Local : R|kotlin/Any| {
+                public? [ContainingClassKey=Local] constructor(): R|Outer.Local| {
+                    super<R|kotlin/Any|>()
+                }
+
+                @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+            }
+
+            lval r: I = object : I {
+                private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
+                    super<<implicit>>()
+                }
+
+                @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
+            }
+
+        }
+
+    }
+    public? final? interface I : R|kotlin/Any| {
+    }
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt
new file mode 100644
index 0000000..2563387
--- /dev/null
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt
@@ -0,0 +1 @@
+@Suppress("") @MustBeDocumented
\ No newline at end of file
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.lazyBodies.txt
new file mode 100644
index 0000000..fb90000
--- /dev/null
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.lazyBodies.txt
@@ -0,0 +1,2 @@
+FILE: danglingAnnotationsFileLevel.kt
+    @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
\ No newline at end of file
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.txt
new file mode 100644
index 0000000..fb90000
--- /dev/null
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.txt
@@ -0,0 +1,2 @@
+FILE: danglingAnnotationsFileLevel.kt
+    @Suppress(String()) @MustBeDocumented() <DANGLING MODIFIER: Top level declaration expected>
\ No newline at end of file
diff --git a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java
index a8c12db..ab99172 100644
--- a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java
+++ b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java
@@ -76,6 +76,16 @@
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contextReceivers.kt");
         }
 
+        @TestMetadata("danglingAnnotationsClassLevel.kt")
+        public void testDanglingAnnotationsClassLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
+        }
+
+        @TestMetadata("danglingAnnotationsFileLevel.kt")
+        public void testDanglingAnnotationsFileLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
+        }
+
         @TestMetadata("delegates.kt")
         public void testDelegates() throws Exception {
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");
diff --git a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java
index 6de3f44..c18d6a0 100644
--- a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java
+++ b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java
@@ -76,6 +76,16 @@
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contextReceivers.kt");
         }
 
+        @TestMetadata("danglingAnnotationsClassLevel.kt")
+        public void testDanglingAnnotationsClassLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
+        }
+
+        @TestMetadata("danglingAnnotationsFileLevel.kt")
+        public void testDanglingAnnotationsFileLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
+        }
+
         @TestMetadata("delegates.kt")
         public void testDelegates() throws Exception {
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");
diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt
index 0fd72a9..046299c 100644
--- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt
+++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt
@@ -18,10 +18,7 @@
 import org.jetbrains.kotlin.fir.declarations.utils.addDeclaration
 import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
 import org.jetbrains.kotlin.fir.declarations.utils.isLocal
-import org.jetbrains.kotlin.fir.diagnostics.ConeDestructuringDeclarationsOnTopLevel
-import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
-import org.jetbrains.kotlin.fir.diagnostics.ConeUnderscoreIsReserved
-import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
+import org.jetbrains.kotlin.fir.diagnostics.*
 import org.jetbrains.kotlin.fir.expressions.*
 import org.jetbrains.kotlin.fir.expressions.builder.*
 import org.jetbrains.kotlin.fir.references.FirReference
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirDanglingModifierList.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirDanglingModifierList.kt
new file mode 100644
index 0000000..e526952
--- /dev/null
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirDanglingModifierList.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2010-2022 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.
+ */
+
+package org.jetbrains.kotlin.fir.declarations
+
+import org.jetbrains.kotlin.KtSourceElement
+import org.jetbrains.kotlin.fir.FirElement
+import org.jetbrains.kotlin.fir.FirModuleData
+import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
+import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
+import org.jetbrains.kotlin.fir.expressions.FirAnnotation
+import org.jetbrains.kotlin.fir.symbols.impl.FirDanglingModifierSymbol
+import org.jetbrains.kotlin.fir.visitors.*
+
+/*
+ * This file was generated automatically
+ * DO NOT MODIFY IT MANUALLY
+ */
+
+abstract class FirDanglingModifierList : FirDeclaration(), FirDiagnosticHolder {
+    abstract override val source: KtSourceElement?
+    abstract override val resolvePhase: FirResolvePhase
+    abstract override val annotations: List<FirAnnotation>
+    abstract override val moduleData: FirModuleData
+    abstract override val origin: FirDeclarationOrigin
+    abstract override val attributes: FirDeclarationAttributes
+    abstract override val diagnostic: ConeDiagnostic
+    abstract override val symbol: FirDanglingModifierSymbol
+
+    override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitDanglingModifierList(this, data)
+
+    @Suppress("UNCHECKED_CAST")
+    override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
+        transformer.transformDanglingModifierList(this, data) as E
+
+    abstract override fun replaceResolvePhase(newResolvePhase: FirResolvePhase)
+
+    abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
+
+    abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirDanglingModifierList
+}
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirDanglingModifierListBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirDanglingModifierListBuilder.kt
new file mode 100644
index 0000000..75dad90
--- /dev/null
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirDanglingModifierListBuilder.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010-2022 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.
+ */
+
+@file:Suppress("DuplicatedCode")
+
+package org.jetbrains.kotlin.fir.declarations.builder
+
+import kotlin.contracts.*
+import org.jetbrains.kotlin.KtSourceElement
+import org.jetbrains.kotlin.fir.FirModuleData
+import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
+import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
+import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
+import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
+import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
+import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
+import org.jetbrains.kotlin.fir.declarations.impl.FirDanglingModifierListImpl
+import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
+import org.jetbrains.kotlin.fir.expressions.FirAnnotation
+import org.jetbrains.kotlin.fir.symbols.impl.FirDanglingModifierSymbol
+import org.jetbrains.kotlin.fir.visitors.*
+
+/*
+ * This file was generated automatically
+ * DO NOT MODIFY IT MANUALLY
+ */
+
+@FirBuilderDsl
+class FirDanglingModifierListBuilder : FirAnnotationContainerBuilder {
+    override var source: KtSourceElement? = null
+    var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
+    override val annotations: MutableList<FirAnnotation> = mutableListOf()
+    lateinit var moduleData: FirModuleData
+    lateinit var origin: FirDeclarationOrigin
+    var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
+    lateinit var diagnostic: ConeDiagnostic
+    lateinit var symbol: FirDanglingModifierSymbol
+
+    override fun build(): FirDanglingModifierList {
+        return FirDanglingModifierListImpl(
+            source,
+            resolvePhase,
+            annotations.toMutableOrEmpty(),
+            moduleData,
+            origin,
+            attributes,
+            diagnostic,
+            symbol,
+        )
+    }
+
+}
+
+@OptIn(ExperimentalContracts::class)
+inline fun buildDanglingModifierList(init: FirDanglingModifierListBuilder.() -> Unit): FirDanglingModifierList {
+    contract {
+        callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
+    }
+    return FirDanglingModifierListBuilder().apply(init).build()
+}
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirDanglingModifierListImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirDanglingModifierListImpl.kt
new file mode 100644
index 0000000..d2a2ac9
--- /dev/null
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirDanglingModifierListImpl.kt
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010-2022 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.
+ */
+
+@file:Suppress("DuplicatedCode")
+
+package org.jetbrains.kotlin.fir.declarations.impl
+
+import org.jetbrains.kotlin.KtSourceElement
+import org.jetbrains.kotlin.fir.FirModuleData
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
+import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
+import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
+import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
+import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
+import org.jetbrains.kotlin.fir.expressions.FirAnnotation
+import org.jetbrains.kotlin.fir.symbols.impl.FirDanglingModifierSymbol
+import org.jetbrains.kotlin.fir.visitors.*
+import org.jetbrains.kotlin.fir.MutableOrEmptyList
+import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
+
+/*
+ * This file was generated automatically
+ * DO NOT MODIFY IT MANUALLY
+ */
+
+internal class FirDanglingModifierListImpl(
+    override val source: KtSourceElement?,
+    @Volatile
+    override var resolvePhase: FirResolvePhase,
+    override var annotations: MutableOrEmptyList<FirAnnotation>,
+    override val moduleData: FirModuleData,
+    override val origin: FirDeclarationOrigin,
+    override val attributes: FirDeclarationAttributes,
+    override val diagnostic: ConeDiagnostic,
+    override val symbol: FirDanglingModifierSymbol,
+) : FirDanglingModifierList() {
+    init {
+        symbol.bind(this)
+    }
+
+    override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
+        annotations.forEach { it.accept(visitor, data) }
+    }
+
+    override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirDanglingModifierListImpl {
+        transformAnnotations(transformer, data)
+        return this
+    }
+
+    override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirDanglingModifierListImpl {
+        annotations.transformInplace(transformer, data)
+        return this
+    }
+
+    override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
+        resolvePhase = newResolvePhase
+    }
+
+    override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
+        annotations = newAnnotations.toMutableOrEmpty()
+    }
+}
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt
index 5701ef4..6caff00 100644
--- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt
@@ -95,6 +95,7 @@
 import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
 import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
 import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedErrorAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt
index ed42152..002291e 100644
--- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt
@@ -95,6 +95,7 @@
 import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
 import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
 import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedErrorAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt
index 978d154..28b05bc 100644
--- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt
@@ -95,6 +95,7 @@
 import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
 import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
 import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedErrorAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
@@ -514,6 +515,10 @@
         return transformElement(errorProperty, data)
     }
 
+    open fun transformDanglingModifierList(danglingModifierList: FirDanglingModifierList, data: D): FirDanglingModifierList {
+        return transformElement(danglingModifierList, data)
+    }
+
     open fun transformQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): FirStatement {
         return transformElement(qualifiedAccessExpression, data)
     }
@@ -1086,6 +1091,10 @@
         return transformErrorProperty(errorProperty, data)
     }
 
+    final override fun visitDanglingModifierList(danglingModifierList: FirDanglingModifierList, data: D): FirDanglingModifierList {
+        return transformDanglingModifierList(danglingModifierList, data)
+    }
+
     final override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): FirStatement {
         return transformQualifiedAccessExpression(qualifiedAccessExpression, data)
     }
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt
index 2405f45..1df7a64 100644
--- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt
@@ -95,6 +95,7 @@
 import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
 import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
 import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedErrorAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
@@ -335,6 +336,8 @@
 
     open fun visitErrorProperty(errorProperty: FirErrorProperty, data: D): R  = visitElement(errorProperty, data)
 
+    open fun visitDanglingModifierList(danglingModifierList: FirDanglingModifierList, data: D): R  = visitElement(danglingModifierList, data)
+
     open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): R  = visitElement(qualifiedAccessExpression, data)
 
     open fun visitQualifiedErrorAccessExpression(qualifiedErrorAccessExpression: FirQualifiedErrorAccessExpression, data: D): R  = visitElement(qualifiedErrorAccessExpression, data)
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt
index 866eaa4..06231ff 100644
--- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt
+++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt
@@ -95,6 +95,7 @@
 import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
 import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
 import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedErrorAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
@@ -513,6 +514,10 @@
         visitElement(errorProperty)
     }
 
+    open fun visitDanglingModifierList(danglingModifierList: FirDanglingModifierList) {
+        visitElement(danglingModifierList)
+    }
+
     open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
         visitElement(qualifiedAccessExpression)
     }
@@ -1085,6 +1090,10 @@
         visitErrorProperty(errorProperty)
     }
 
+    final override fun visitDanglingModifierList(danglingModifierList: FirDanglingModifierList, data: Nothing?) {
+        visitDanglingModifierList(danglingModifierList)
+    }
+
     final override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Nothing?) {
         visitQualifiedAccessExpression(qualifiedAccessExpression)
     }
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt
index b67b66b..112a3d1 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt
@@ -37,9 +37,13 @@
 fun FirRegularClass.containingClassForLocal(): ConeClassLikeLookupTag? =
     if (isLocal) containingClassForLocalAttr else null
 
+fun FirDanglingModifierList.containingClass(): ConeClassLikeLookupTag? =
+    containingClassAttr
+
 private object ContainingClassKey : FirDeclarationDataKey()
 var FirCallableDeclaration.containingClassForStaticMemberAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
 var FirRegularClass.containingClassForLocalAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
+var FirDanglingModifierList.containingClassAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
 
 private object IsNewPlaceForBodyGeneration : FirDeclarationDataKey()
 var FirRegularClass.isNewPlaceForBodyGeneration: Boolean? by FirDeclarationDataRegistry.data(IsNewPlaceForBodyGeneration)
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt
index bfab7e8..cceed39 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt
@@ -46,6 +46,11 @@
         get() = "Destructuring declarations are only allowed for local variables/values"
 }
 
+object ConeDanglingModifierOnTopLevel : ConeDiagnostic {
+    override val reason: String
+        get() = "Top level declaration expected"
+}
+
 enum class DiagnosticKind {
     Syntax,
     ExpressionExpected,
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt
index 59bdd19..19183e9 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt
@@ -387,6 +387,11 @@
             bodyRenderer?.renderBody(anonymousInitializer.body)
         }
 
+        override fun visitDanglingModifierList(danglingModifierList: FirDanglingModifierList) {
+            annotationRenderer?.render(danglingModifierList)
+            print("<DANGLING MODIFIER: ${danglingModifierList.diagnostic.reason}>")
+        }
+
         override fun visitBlock(block: FirBlock) {
             bodyRenderer?.renderBody(block)
         }
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirDanglingModifierSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirDanglingModifierSymbol.kt
new file mode 100644
index 0000000..cde9bc5
--- /dev/null
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirDanglingModifierSymbol.kt
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2010-2020 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.
+ */
+
+package org.jetbrains.kotlin.fir.symbols.impl
+
+import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList
+import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
+
+class FirDanglingModifierSymbol : FirBasedSymbol<FirDanglingModifierList>() {
+    override fun toString(): String = "${this::class.simpleName}"
+}
diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt
index 4ec6f73..9bf095a 100644
--- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt
+++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt
@@ -118,6 +118,7 @@
     val errorExpression by element(Expression, expression, diagnosticHolder)
     val errorFunction by element(Declaration, function, diagnosticHolder)
     val errorProperty by element(Declaration, variable, diagnosticHolder)
+    val danglingModifierList by element(Declaration, declaration, diagnosticHolder)
     val qualifiedAccessExpression by element(Expression, expression, qualifiedAccess)
     val qualifiedErrorAccessExpression by element(Expression, expression, diagnosticHolder)
     val propertyAccessExpression by element(Expression, qualifiedAccessExpression)
diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt
index 4ad27f4..5f2ca28 100644
--- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt
+++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt
@@ -43,6 +43,7 @@
         }
 
         impl(anonymousObject)
+        impl(danglingModifierList)
         noImpl(anonymousObjectExpression)
 
         impl(typeAlias)
diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt
index 5c5f057..b29e845 100644
--- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt
+++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt
@@ -456,6 +456,10 @@
             +field("dispatchReceiverType", coneSimpleKotlinTypeType, nullable = true)
         }
 
+        danglingModifierList.configure {
+            +symbol("FirDanglingModifierSymbol")
+        }
+
         file.configure {
             +field("annotationsContainer", fileAnnotationsContainer).withTransform()
             +field("packageDirective", packageDirective)
diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt
index 4334b64..dff05ff 100644
--- a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt
+++ b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt
@@ -57,6 +57,9 @@
     // with a fake sources which refers to the target expression
     object GeneratedLambdaLabel : KtFakeSourceElementKind()
 
+    // for error element which is created for dangling modifier lists
+    object DanglingModifierList : KtFakeSourceElementKind()
+
     // for lambdas & functions with expression bodies the return statement is added
     // with a fake sources which refers to the return target
     sealed class ImplicitReturn : KtFakeSourceElementKind() {
diff --git a/compiler/testData/diagnostics/tests/annotations/DanglingMixed.fir.kt b/compiler/testData/diagnostics/tests/annotations/DanglingMixed.fir.kt
deleted file mode 100644
index 28b63a6..0000000
--- a/compiler/testData/diagnostics/tests/annotations/DanglingMixed.fir.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-annotation class Ann
-annotation class Ann2
-
-class C {
-    fun foo() {
-        class Local {
-            @Ann0
-            @Ann @Ann3
-            @Ann2(1)
-            @Ann4<!SYNTAX!><!>
-        }
-    }
-    @Ann0
-    @Ann @Ann3
-    @Ann2(1)
-    @Ann4<!SYNTAX!><!>
-}
-
-@Ann0
-@Ann @Ann3
-@Ann2(1)
-@Ann4<!SYNTAX!><!>
diff --git a/compiler/testData/diagnostics/tests/annotations/DanglingMixed.kt b/compiler/testData/diagnostics/tests/annotations/DanglingMixed.kt
index 21fd5a0..5774d1c 100644
--- a/compiler/testData/diagnostics/tests/annotations/DanglingMixed.kt
+++ b/compiler/testData/diagnostics/tests/annotations/DanglingMixed.kt
@@ -1,6 +1,7 @@
+// FIR_IDENTICAL
 annotation class Ann
 annotation class Ann2
-
+interface I {}
 class C {
     fun foo() {
         class Local {
@@ -9,6 +10,12 @@
             @Ann2(<!TOO_MANY_ARGUMENTS!>1<!>)
             @<!UNRESOLVED_REFERENCE!>Ann4<!><!SYNTAX!><!>
         }
+        val i = object : I {
+            @<!UNRESOLVED_REFERENCE!>Ann0<!>
+            @Ann @<!UNRESOLVED_REFERENCE!>Ann3<!>
+            @Ann2(<!TOO_MANY_ARGUMENTS!>1<!>)
+            @<!UNRESOLVED_REFERENCE!>Ann4<!><!SYNTAX!><!>
+        }
     }
     @<!UNRESOLVED_REFERENCE!>Ann0<!>
     @Ann @<!UNRESOLVED_REFERENCE!>Ann3<!>
diff --git a/compiler/testData/diagnostics/tests/annotations/DanglingMixed.txt b/compiler/testData/diagnostics/tests/annotations/DanglingMixed.txt
index dc8aaf3..f0eb3d3 100644
--- a/compiler/testData/diagnostics/tests/annotations/DanglingMixed.txt
+++ b/compiler/testData/diagnostics/tests/annotations/DanglingMixed.txt
@@ -21,3 +21,10 @@
     public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
     public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
 }
+
+public interface I {
+    public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
+    public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+    public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+}
+
diff --git a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java
index 60e29ec..faa15ec 100644
--- a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java
+++ b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java
@@ -76,6 +76,18 @@
         }
 
         @Test
+        @TestMetadata("danglingAnnotationsClassLevel.kt")
+        public void testDanglingAnnotationsClassLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
+        }
+
+        @Test
+        @TestMetadata("danglingAnnotationsFileLevel.kt")
+        public void testDanglingAnnotationsFileLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
+        }
+
+        @Test
         @TestMetadata("delegates.kt")
         public void testDelegates() throws Exception {
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");
diff --git a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java
index cb1ed44..db1fd50 100644
--- a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java
+++ b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java
@@ -76,6 +76,18 @@
         }
 
         @Test
+        @TestMetadata("danglingAnnotationsClassLevel.kt")
+        public void testDanglingAnnotationsClassLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
+        }
+
+        @Test
+        @TestMetadata("danglingAnnotationsFileLevel.kt")
+        public void testDanglingAnnotationsFileLevel() throws Exception {
+            runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
+        }
+
+        @Test
         @TestMetadata("delegates.kt")
         public void testDelegates() throws Exception {
             runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");