[java] IDEA-355048 Support binary files (.class) in split mode

GitOrigin-RevId: ea7a098ef33476d53dd8bf061810835510885466
This commit is contained in:
Mikhail Pyltsin
2024-08-06 20:55:58 +00:00
committed by intellij-monorepo-bot
parent 985f40d088
commit c60037c8b3
4 changed files with 54 additions and 1 deletions
@@ -37,4 +37,7 @@ class JavaLangLevelProjectCustomDataSynchronizer : ProjectCustomDataSynchronizer
class LanguageLevelHolder(val languageLevel: LanguageLevel)
@Serializable
class NullableLanguageLevelHolder(val languageLevel: LanguageLevel?)
class NullableLanguageLevelHolder(val languageLevel: LanguageLevel?)
@Serializable
class ClassFileInformation(val isClassFile: Boolean?)
@@ -2811,6 +2811,7 @@
<postStartupActivity implementation="com.intellij.ide.FileNotInSourceRootChecker"/>
<virtualFileCustomDataProvider implementation="com.intellij.openapi.roots.impl.JavaLangLevelVirtualFileCustomDataProvider"/>
<virtualFileCustomDataProvider implementation="com.intellij.openapi.roots.impl.JavaClassVirtualFileCustomDataProvider"/>
<spellchecker.dictionary.checker implementation="com.intellij.java.frameworks.MavenDictionaryChecker"/>
@@ -0,0 +1,49 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.roots.impl
import com.intellij.ide.highlighter.JavaClassFileType
import com.intellij.java.frontback.psi.impl.ClassFileInformation
import com.intellij.openapi.application.readAction
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.FileIndexFacade
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileCustomDataProvider
import com.intellij.util.concurrency.annotations.RequiresReadLock
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.flow.emptyFlow
import kotlin.reflect.KType
import kotlin.reflect.typeOf
class JavaClassVirtualFileCustomDataProvider : VirtualFileCustomDataProvider<ClassFileInformation> {
companion object {
val LOG = logger<JavaClassVirtualFileCustomDataProvider>()
}
override val id: String = "javaClassVirtualFile"
override val dataType: KType
get() = typeOf<ClassFileInformation>()
override fun getValues(project: Project, virtualFile: VirtualFile): Flow<ClassFileInformation> {
if (virtualFile.fileType != JavaClassFileType.INSTANCE) return emptyFlow()
return object : Flow<ClassFileInformation> {
override suspend fun collect(collector: FlowCollector<ClassFileInformation>) {
collector.emit(readAction {
createClassFileInformation(project, virtualFile)
})
}
}
}
@RequiresReadLock
private fun createClassFileInformation(
project: Project,
virtualFile: VirtualFile,
): ClassFileInformation {
val fileIndex = FileIndexFacade.getInstance(project)
val isOutOfLibrary = !fileIndex.isInLibraryClasses(virtualFile) && fileIndex.isInSource(virtualFile)
return ClassFileInformation(!isOutOfLibrary)
}
}