Do not fetch Kotlin stubs for versioned files from multi-release jars (KT-26439)
An incomplete list of inner class files might be stored in versioned directory and that ruins Kotlin stub building. Another reason for excluding such files, that they are duplicated in different declarations lists such as `Navigate -> Class...` action. #KT-26439 Fixed
This commit is contained in:
+16
-3
@@ -43,13 +43,19 @@ open class KotlinClsStubBuilder : ClsStubBuilder() {
|
||||
override fun getStubVersion() = ClassFileStubBuilder.STUB_VERSION + KotlinStubVersions.CLASSFILE_STUB_VERSION
|
||||
|
||||
override fun buildFileStub(content: FileContent): PsiFileStub<*>? {
|
||||
val file = content.file
|
||||
val virtualFile = content.file
|
||||
|
||||
if (isKotlinInternalCompiledFile(file, content.content)) {
|
||||
if (isKotlinInternalCompiledFile(virtualFile, content.content)) {
|
||||
return null
|
||||
}
|
||||
|
||||
return doBuildFileStub(file, content.content)
|
||||
if (isVersioned(virtualFile)) {
|
||||
// Kotlin can't build stubs for versioned class files, because list of versioned inner classes
|
||||
// might be incomplete
|
||||
return null
|
||||
}
|
||||
|
||||
return doBuildFileStub(virtualFile, content.content)
|
||||
}
|
||||
|
||||
private fun doBuildFileStub(file: VirtualFile, fileContent: ByteArray): PsiFileStub<KtFile>? {
|
||||
@@ -105,6 +111,13 @@ open class KotlinClsStubBuilder : ClsStubBuilder() {
|
||||
|
||||
companion object {
|
||||
val LOG = Logger.getInstance(KotlinClsStubBuilder::class.java)
|
||||
|
||||
// Archive separator + META-INF + versions
|
||||
private val VERSIONED_PATH_MARKER = "!/META-INF/versions/"
|
||||
|
||||
fun isVersioned(virtualFile: VirtualFile): Boolean {
|
||||
return virtualFile.path.contains(VERSIONED_PATH_MARKER)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user