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

- support kotlin compiled classes

GitOrigin-RevId: 8a1ec87426603d017068bb2f311edb105fa5e977
This commit is contained in:
Mikhail Pyltsin
2024-08-06 20:55:58 +00:00
committed by intellij-monorepo-bot
parent c60037c8b3
commit 858aaf9898
4 changed files with 13 additions and 3 deletions
@@ -78,7 +78,8 @@ public final class ClassFileDecompilers {
public final ExtensionPointName<Decompiler> EP_NAME = new ExtensionPointName<>("com.intellij.psi.classFileDecompiler");
private ClassFileDecompilers() {
EP_NAME.addChangeListener(() -> BinaryFileTypeDecompilers.getInstance().notifyDecompilerSetChange(), null);
Runnable runnable = () -> BinaryFileTypeDecompilers.getInstance().notifyDecompilerSetChange();
EP_NAME.addChangeListener(runnable, null);
}
@SuppressWarnings("unchecked")
@@ -40,4 +40,8 @@ class LanguageLevelHolder(val languageLevel: LanguageLevel)
class NullableLanguageLevelHolder(val languageLevel: LanguageLevel?)
@Serializable
class ClassFileInformation(val isClassFile: Boolean?)
enum class ClassFileInformationType {
JAVA_CLASS_FILE, JAVA_CLASS_FILE_OUTSIDE
}
@Serializable
class ClassFileInformation(val classFileInformationType: ClassFileInformationType?)
@@ -3,12 +3,15 @@ package com.intellij.openapi.roots.impl
import com.intellij.ide.highlighter.JavaClassFileType
import com.intellij.java.frontback.psi.impl.ClassFileInformation
import com.intellij.java.frontback.psi.impl.ClassFileInformationType
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.psi.ClassFileViewProvider
import com.intellij.psi.impl.PsiManagerEx
import com.intellij.util.concurrency.annotations.RequiresReadLock
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
@@ -28,6 +31,8 @@ class JavaClassVirtualFileCustomDataProvider : VirtualFileCustomDataProvider<Cla
override fun getValues(project: Project, virtualFile: VirtualFile): Flow<ClassFileInformation> {
if (virtualFile.fileType != JavaClassFileType.INSTANCE) return emptyFlow()
val viewProvider = PsiManagerEx.getInstanceEx(project).fileManager.findViewProvider(virtualFile)
if(viewProvider !is ClassFileViewProvider) return emptyFlow()
return object : Flow<ClassFileInformation> {
override suspend fun collect(collector: FlowCollector<ClassFileInformation>) {
collector.emit(readAction {
@@ -44,6 +49,6 @@ class JavaClassVirtualFileCustomDataProvider : VirtualFileCustomDataProvider<Cla
): ClassFileInformation {
val fileIndex = FileIndexFacade.getInstance(project)
val isOutOfLibrary = !fileIndex.isInLibraryClasses(virtualFile) && fileIndex.isInSource(virtualFile)
return ClassFileInformation(!isOutOfLibrary)
return ClassFileInformation(if (isOutOfLibrary) ClassFileInformationType.JAVA_CLASS_FILE_OUTSIDE else ClassFileInformationType.JAVA_CLASS_FILE)
}
}