SourceNavigationHelper multifile classes support
Use .class files as BINARY instead of .metadata. relates to #KT-39196
This commit is contained in:
+21
-4
@@ -19,7 +19,11 @@ import com.intellij.psi.stubs.StringStubIndexExtension
|
|||||||
import com.intellij.util.containers.ContainerUtil
|
import com.intellij.util.containers.ContainerUtil
|
||||||
import gnu.trove.THashSet
|
import gnu.trove.THashSet
|
||||||
import org.jetbrains.annotations.TestOnly
|
import org.jetbrains.annotations.TestOnly
|
||||||
|
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
|
import org.jetbrains.kotlin.fileClasses.JvmMultifileClassPartInfo
|
||||||
|
import org.jetbrains.kotlin.fileClasses.fileClassInfo
|
||||||
|
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
|
||||||
import org.jetbrains.kotlin.idea.caches.project.BinaryModuleInfo
|
import org.jetbrains.kotlin.idea.caches.project.BinaryModuleInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.project.ScriptDependenciesInfo
|
import org.jetbrains.kotlin.idea.caches.project.ScriptDependenciesInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.project.getBinaryLibrariesModuleInfos
|
import org.jetbrains.kotlin.idea.caches.project.getBinaryLibrariesModuleInfos
|
||||||
@@ -72,10 +76,23 @@ object SourceNavigationHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NavigationKind.SOURCES_TO_CLASS_FILES -> getLibrarySourcesModuleInfos(
|
NavigationKind.SOURCES_TO_CLASS_FILES -> {
|
||||||
declaration.project,
|
if (containingFile.fileClassInfo is JvmMultifileClassPartInfo) {
|
||||||
vFile
|
// if the asked element is multifile classs, it might be compiled into .kotlin_metadata and .class
|
||||||
).map { it.binariesModuleInfo.binariesScope() }.union()
|
// but we don't have support of metadata declarations in light classes and in reference search (without
|
||||||
|
// acceptOverrides). That's why we include only .class jar in the scope.
|
||||||
|
val psiClass = JavaElementFinder.getInstance(containingFile.project)
|
||||||
|
.findClass(containingFile.javaFileFacadeFqName.asString(), declaration.resolveScope)
|
||||||
|
if (psiClass != null) {
|
||||||
|
return getBinaryLibrariesModuleInfos(declaration.project, psiClass.containingFile.virtualFile)
|
||||||
|
.map { it.binariesScope() }.union()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getLibrarySourcesModuleInfos(
|
||||||
|
declaration.project,
|
||||||
|
vFile
|
||||||
|
).map { it.binariesModuleInfo.binariesScope() }.union()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user