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 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()
}
} }
} }