diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt index 79a87651af529..6035f6ab1e6e8 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt @@ -33,10 +33,10 @@ class CliVirtualFileFinder( private val scope: GlobalSearchScope ) : VirtualFileFinder() { override fun findVirtualFileWithHeader(classId: ClassId): VirtualFile? = - findBinaryClass(classId, classId.relativeClassName.asString().replace('.', '$') + ".class") + findBinaryOrSigClass(classId) override fun findSourceOrBinaryVirtualFile(classId: ClassId) = - findBinaryClass(classId, classId.relativeClassName.asString().replace('.', '$') + ".class") + findBinaryOrSigClass(classId) ?: findSourceClass(classId, classId.relativeClassName.asString() + ".java") override fun findMetadata(classId: ClassId): InputStream? { @@ -70,6 +70,14 @@ class CliVirtualFileFinder( dir.findChild(fileName)?.takeIf(VirtualFile::isValid) }?.takeIf { it in scope } + private fun findBinaryOrSigClass(classId: ClassId, simpleName: String, rootType: Set) = + index.findClass(classId, acceptedRootTypes = rootType) { dir, _ -> + (dir.findChild("$simpleName.class") ?: dir.findChild("$simpleName.sig"))?.takeIf(VirtualFile::isValid) + }?.takeIf { it in scope } + + private fun findBinaryOrSigClass(classId: ClassId) = + findBinaryOrSigClass(classId, classId.relativeClassName.asString().replace('.', '$'), JavaRoot.OnlyBinary) + private fun findBinaryClass(classId: ClassId, fileName: String) = findClass(classId, fileName, JavaRoot.OnlyBinary) private fun findSourceClass(classId: ClassId, fileName: String) = findClass(classId, fileName, JavaRoot.OnlySource) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt index 692a3b9d4f842..cc9f18d5b49b1 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt @@ -88,7 +88,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ val (classId, classFileContentFromRequest, outerClassFromRequest) = request val virtualFile = findVirtualFileForTopLevelClass(classId, searchScope) ?: return null - if (!usePsiClassFilesReading && virtualFile.extension == "class") { + if (!usePsiClassFilesReading && (virtualFile.extension == "class" || virtualFile.extension == "sig")) { // We return all class files' names in the directory in knownClassNamesInPackage method, so one may request an inner class return binaryCache.getOrPut(classId) { // Note that currently we implicitly suppose that searchScope for binary classes is constant and we do not use it @@ -218,6 +218,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ val vFile = when (rootType) { JavaRoot.RootType.BINARY -> packageDir.findChild("$topLevelClassName.class") + JavaRoot.RootType.BINARY_SIG -> packageDir.findChild("$topLevelClassName.sig") JavaRoot.RootType.SOURCE -> packageDir.findChild("$topLevelClassName.java") } ?: return null @@ -238,7 +239,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ val result = THashSet() index.traverseDirectoriesInPackage(packageFqName, continueSearch = { dir, _ -> for (child in dir.children) { - if (child.extension == "class" || child.extension == "java") { + if (child.extension == "class" || child.extension == "java" || child.extension == "sig") { result.add(child.nameWithoutExtension) } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndex.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndex.kt index f470e2c46aef3..6896826bc8642 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndex.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndex.kt @@ -40,12 +40,13 @@ interface JvmDependenciesIndex { data class JavaRoot(val file: VirtualFile, val type: RootType, val prefixFqName: FqName? = null) { enum class RootType { SOURCE, - BINARY + BINARY, + BINARY_SIG } companion object RootTypes { - val OnlyBinary: Set = EnumSet.of(RootType.BINARY) + val OnlyBinary: Set = EnumSet.of(RootType.BINARY, RootType.BINARY_SIG) val OnlySource: Set = EnumSet.of(RootType.SOURCE) - val SourceAndBinary: Set = EnumSet.of(RootType.BINARY, RootType.SOURCE) + val SourceAndBinary: Set = EnumSet.of(RootType.BINARY, RootType.BINARY_SIG, RootType.SOURCE) } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt index bf901db9ef7c2..e7985ba5a7728 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt @@ -202,6 +202,7 @@ class JvmDependenciesIndexImpl(_roots: List) : JvmDependenciesIndex { val fileExtension = when (rootType) { JavaRoot.RootType.BINARY -> JavaClassFileType.INSTANCE.defaultExtension + JavaRoot.RootType.BINARY_SIG -> "sig" JavaRoot.RootType.SOURCE -> JavaFileType.INSTANCE.defaultExtension }