SourceNavigationHelper multifile classes support

Use .class files as BINARY instead of .metadata.
 relates to #KT-39196
This commit is contained in:
Vladimir Ilmov
2020-09-07 15:18:53 +02:00
parent 3764eeba25
commit 8b239d89b6
@@ -19,7 +19,11 @@ import com.intellij.psi.stubs.StringStubIndexExtension
import com.intellij.util.containers.ContainerUtil
import gnu.trove.THashSet
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
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.ScriptDependenciesInfo
import org.jetbrains.kotlin.idea.caches.project.getBinaryLibrariesModuleInfos
@@ -72,10 +76,23 @@ object SourceNavigationHelper {
}
}
NavigationKind.SOURCES_TO_CLASS_FILES -> getLibrarySourcesModuleInfos(
declaration.project,
vFile
).map { it.binariesModuleInfo.binariesScope() }.union()
NavigationKind.SOURCES_TO_CLASS_FILES -> {
if (containingFile.fileClassInfo is JvmMultifileClassPartInfo) {
// if the asked element is multifile classs, it might be compiled into .kotlin_metadata and .class
// 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()
}
}
}