tmp
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ImportOptimizer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ImportOptimizer.kt
index 46c5988..7f8930d 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ImportOptimizer.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ImportOptimizer.kt
@@ -21,7 +21,7 @@
     override val token: KtLifetimeToken
         get() = analysisSession.token
 
-    override fun analyseImports(file: KtFile): KtImportOptimizerResult = withValidityAssertion {
+    override fun analyseImports(file: KtFile): KtImportOptimizerResult {
         val (allUnderImports, otherImports) = file.importDirectives.partition { it.isAllUnder }
 
         val unusedImports = LinkedHashSet<KtImportDirective>()
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt
index 9dcf00c..aacf76d 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt
@@ -82,7 +82,7 @@
 
     override val referenceShortenerImpl = KtFirReferenceShortener(this, token, firResolveSession)
 
-    override val importOptimizerImpl: KtImportOptimizer = KtFirImportOptimizer(token, firResolveSession)
+    override val importOptimizerImpl: KtImportOptimizer = KtFirImportOptimizer(this, token, firResolveSession)
 
     override val symbolDeclarationRendererProviderImpl: KtSymbolDeclarationRendererProvider = KtFirRendererProvider(this, token)
 
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt
index 20fe4e5..169755a 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt
@@ -6,12 +6,15 @@
 package org.jetbrains.kotlin.analysis.api.fir.components
 
 import org.jetbrains.kotlin.KtRealSourceElementKind
+import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
 import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizer
 import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizerResult
 import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
 import org.jetbrains.kotlin.analysis.api.fir.utils.FirBodyReanalyzingVisitorVoid
 import org.jetbrains.kotlin.analysis.api.fir.utils.computeImportableName
 import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
+import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
 import org.jetbrains.kotlin.fir.FirElement
@@ -33,19 +36,20 @@
 import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
 import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
 import org.jetbrains.kotlin.fir.types.classId
+import org.jetbrains.kotlin.idea.references.KDocReference
+import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
 import org.jetbrains.kotlin.name.ClassId
 import org.jetbrains.kotlin.name.FqName
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.name.parentOrNull
 import org.jetbrains.kotlin.psi.*
-import org.jetbrains.kotlin.psi.psiUtil.getCallNameExpression
-import org.jetbrains.kotlin.psi.psiUtil.getPossiblyQualifiedCallExpression
-import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability
+import org.jetbrains.kotlin.psi.psiUtil.*
 import org.jetbrains.kotlin.resolve.ImportPath
 import org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny
 import org.jetbrains.kotlin.util.OperatorNameConventions
 
 internal class KtFirImportOptimizer(
+    override val analysisSession: KtAnalysisSession,
     override val token: KtLifetimeToken,
     private val firResolveSession: LLFirResolveSession
 ) : KtImportOptimizer() {
@@ -65,7 +69,7 @@
             .map { it.fqName }
             .toSet()
 
-        val (usedImports, unresolvedNames) = collectReferencedEntities(firFile)
+        val (usedImports, unresolvedNames) = collectReferencedEntities(firFile, file)
 
         val referencesEntities = usedImports
             .filterNot { (fqName, referencedByNames) ->
@@ -107,10 +111,45 @@
         val unresolvedNames: Set<Name>,
     )
 
-    private fun collectReferencedEntities(firFile: FirFile): ReferencedEntitiesResult {
+    private fun KDocName.getReferencedNames(): List<Pair<FqName, Name>> {
+        val kDocReferences = references.filterIsInstance<KDocReference>()
+        val kDocName = getQualifiedNameAsFqName()
+
+        return kDocReferences
+            .flatMap { reference ->
+                with(analysisSession) {
+                    val symbols = reference.resolveToSymbols()
+                    symbols.mapNotNull { symbol ->
+                        when (symbol) {
+                            is KtClassLikeSymbol -> symbol.classIdIfNonLocal?.asSingleFqName()?.takeIf { kDocName.parentOrNull()?.isRoot == true }
+                            is KtCallableSymbol -> symbol.callableIdIfNonLocal?.asSingleFqName()
+                            else -> null
+                        }
+                    }
+                }
+            }
+            .filterNot { it == kDocName }
+            .map { it to kDocName.shortName() }
+    }
+
+    private fun collectKDocReferences(ktFile: KtFile): List<Pair<FqName, Name>> {
+        val kDocNames = ktFile.collectDescendantsOfType<KDocName>()
+
+        return kDocNames.flatMap { it.getReferencedNames() }.distinct()
+    }
+
+    private fun collectReferencedEntities(firFile: FirFile, ktFile: KtFile): ReferencedEntitiesResult {
         val usedImports = mutableMapOf<FqName, MutableSet<Name>>()
         val unresolvedNames = mutableSetOf<Name>()
 
+        fun saveReferencedItem(importableName: FqName, referencedByName: Name) {
+            usedImports.getOrPut(importableName) { hashSetOf() } += referencedByName
+        }
+
+        collectKDocReferences(ktFile).forEach { (importableName, referencedByName) ->
+            saveReferencedItem(importableName, referencedByName)
+        }
+
         firFile.accept(object : FirBodyReanalyzingVisitorVoid(firResolveSession) {
             override fun visitElement(element: FirElement) {
                 element.acceptChildren(this)
@@ -242,10 +281,6 @@
 
                 saveReferencedItem(importableName, referencedByName)
             }
-
-            private fun saveReferencedItem(importableName: FqName, referencedByName: Name) {
-                usedImports.getOrPut(importableName) { hashSetOf() } += referencedByName
-            }
         })
 
         return ReferencedEntitiesResult(usedImports, unresolvedNames)
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java
index 62e157f..8c039e37 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java
@@ -155,6 +155,88 @@
     }
 
     @Nested
+    @TestMetadata("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Kdocs {
+        @Test
+        public void testAllFilesPresentInKdocs() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("callables.kt")
+        public void testCallables() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_alias.kt")
+        public void testCallables_alias() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_member.kt")
+        public void testCallables_member() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_overloads.kt")
+        public void testCallables_overloads() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_overloadsFromDifferentPlaces.kt")
+        public void testCallables_overloadsFromDifferentPlaces() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_unused.kt")
+        public void testCallables_unused() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_alias.kt")
+        public void testClassifier_alias() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_nested_1.kt")
+        public void testClassifier_nested_1() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_nested_2.kt")
+        public void testClassifier_nested_2() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_typealias.kt")
+        public void testClassifier_typealias() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_typealias_member.kt")
+        public void testClassifier_typealias_member() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_typealias_unused.kt")
+        public void testClassifier_typealias_unused() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.kt");
+        }
+    }
+
+    @Nested
     @TestMetadata("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors")
     @TestDataPath("$PROJECT_ROOT")
     public class ReferencesWithErrors {
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java
index e0b6dd5..0feaba4 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java
@@ -155,6 +155,88 @@
     }
 
     @Nested
+    @TestMetadata("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs")
+    @TestDataPath("$PROJECT_ROOT")
+    public class Kdocs {
+        @Test
+        public void testAllFilesPresentInKdocs() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("callables.kt")
+        public void testCallables() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_alias.kt")
+        public void testCallables_alias() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_member.kt")
+        public void testCallables_member() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_overloads.kt")
+        public void testCallables_overloads() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_overloadsFromDifferentPlaces.kt")
+        public void testCallables_overloadsFromDifferentPlaces() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.kt");
+        }
+
+        @Test
+        @TestMetadata("callables_unused.kt")
+        public void testCallables_unused() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_alias.kt")
+        public void testClassifier_alias() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_nested_1.kt")
+        public void testClassifier_nested_1() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_nested_2.kt")
+        public void testClassifier_nested_2() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_typealias.kt")
+        public void testClassifier_typealias() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_typealias_member.kt")
+        public void testClassifier_typealias_member() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.kt");
+        }
+
+        @Test
+        @TestMetadata("classifier_typealias_unused.kt")
+        public void testClassifier_typealias_unused() throws Exception {
+            runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.kt");
+        }
+    }
+
+    @Nested
     @TestMetadata("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors")
     @TestDataPath("$PROJECT_ROOT")
     public class ReferencesWithErrors {
diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt
index 9833ca6..e836775 100644
--- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt
+++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt
@@ -10,7 +10,7 @@
 import org.jetbrains.kotlin.psi.KtFile
 import org.jetbrains.kotlin.psi.KtImportDirective
 
-public abstract class KtImportOptimizer : KtLifetimeOwner {
+public abstract class KtImportOptimizer : KtAnalysisSessionComponent() {
     public abstract fun analyseImports(file: KtFile): KtImportOptimizerResult
 }
 
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.imports
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.imports
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.kt
new file mode 100644
index 0000000..b83f68c
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables.kt
@@ -0,0 +1,17 @@
+// FILE: main.kt
+package test
+
+import dependency.function
+import dependency.property
+
+/**
+ * [function]
+ * [property]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+fun function() {}
+val property: Int = 0
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.imports
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.imports
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.kt
new file mode 100644
index 0000000..c288739
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_alias.kt
@@ -0,0 +1,14 @@
+// FILE: main.kt
+package test
+
+import dependency.function as aliased
+
+/**
+ * [aliased]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+fun function() {}
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.imports
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.imports
@@ -0,0 +1 @@
+
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.kt
new file mode 100644
index 0000000..71b2d9f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_member.kt
@@ -0,0 +1,18 @@
+// FILE: main.kt
+package test
+
+import dependency.MyClass
+
+/**
+ * [MyClass.function]
+ * [MyClass.property]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+class MyClass {
+    fun function() {}
+    val property: Int = 0
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.imports
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.imports
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.kt
new file mode 100644
index 0000000..51744b4
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloads.kt
@@ -0,0 +1,16 @@
+// FILE: main.kt
+package test
+
+import dependency.function
+
+/**
+ * [function]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+fun function() {}
+fun function(i: Int) {}
+fun function(s: String) {}
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.imports
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.imports
@@ -0,0 +1 @@
+
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.kt
new file mode 100644
index 0000000..71afba2
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_overloadsFromDifferentPlaces.kt
@@ -0,0 +1,20 @@
+// FILE: main.kt
+package test
+
+import dependency1.function
+import dependency2.function
+
+/**
+ * [function]
+ */
+fun usage() {}
+
+// FILE: dependency1.kt
+package dependency1
+
+fun function(s: String) {}
+
+// FILE: dependency2.kt
+package dependency2
+
+fun function(s: String) {}
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.imports
new file mode 100644
index 0000000..41c0cf3
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.imports
@@ -0,0 +1,2 @@
+dependency.function
+dependency.property
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.kt
new file mode 100644
index 0000000..444da5d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/callables_unused.kt
@@ -0,0 +1,17 @@
+// FILE: main.kt
+package test
+
+import dependency.function
+import dependency.property
+
+/**
+ * [dependency.function]
+ * [dependency.property]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+fun function() {}
+val property: Int = 0
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.imports
new file mode 100644
index 0000000..9c951b7
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.imports
@@ -0,0 +1 @@
+dependency.MyClass
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.kt
new file mode 100644
index 0000000..d66f6d4
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_alias.kt
@@ -0,0 +1,15 @@
+// FILE: main.kt
+package test
+
+import dependency.MyClass
+import dependency.MyClass as MyAlias
+
+/**
+ * [MyAlias]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+class MyClass
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.imports
new file mode 100644
index 0000000..9c951b7
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.imports
@@ -0,0 +1 @@
+dependency.MyClass
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.kt
new file mode 100644
index 0000000..ba87bf5
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_1.kt
@@ -0,0 +1,17 @@
+// FILE: main.kt
+package test
+
+import dependency.MyClass
+import dependency.MyClass.Nested
+
+/**
+ * [Nested]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+class MyClass {
+    class Nested
+}
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.imports
new file mode 100644
index 0000000..a5ff173
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.imports
@@ -0,0 +1 @@
+dependency.MyClass.Nested
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.kt
new file mode 100644
index 0000000..23ef0eb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_nested_2.kt
@@ -0,0 +1,17 @@
+// FILE: main.kt
+package test
+
+import dependency.MyClass
+import dependency.MyClass.Nested
+
+/**
+ * [MyClass.Nested]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+class MyClass {
+    class Nested
+}
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.imports
new file mode 100644
index 0000000..6889ea6
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.imports
@@ -0,0 +1 @@
+dependency.MyClass
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.kt
new file mode 100644
index 0000000..9f12e4e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias.kt
@@ -0,0 +1,17 @@
+// FILE: main.kt
+package test
+
+import dependency.MyClass
+import dependency.MyTypealias
+
+/**
+ * [MyTypealias]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+class MyClass
+
+typealias MyTypealias = MyClass
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.imports
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.imports
@@ -0,0 +1 @@
+
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.kt
new file mode 100644
index 0000000..7b00135
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_member.kt
@@ -0,0 +1,18 @@
+// FILE: main.kt
+package test
+
+import dependency.MyTypealias
+
+/**
+ * [MyTypealias.function]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+class MyClass {
+    fun function() {}
+}
+
+typealias MyTypealias = MyClass
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.imports
new file mode 100644
index 0000000..6c68ed13
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.imports
@@ -0,0 +1 @@
+dependency.MyTypealias
diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.kt
new file mode 100644
index 0000000..a728a07
--- /dev/null
+++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/kdocs/classifier_typealias_unused.kt
@@ -0,0 +1,16 @@
+// FILE: main.kt
+package test
+
+import dependency.MyTypealias
+
+/**
+ * [dependency.MyTypealias]
+ */
+fun usage() {}
+
+// FILE: dependency.kt
+package dependency
+
+class MyClass
+
+typealias MyTypealias = MyClass
\ No newline at end of file