From e67f44947681b64b2e57810b3b6023fd2e195c21 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 6 Jun 2018 18:27:17 +0200 Subject: [PATCH] Fix exception from kotlin bytecode window on common code Do not show bytecode window for non-jvm platform modules #KT-24159 Fixed --- .../idea/internal/KotlinBytecodeToolWindow.kt | 15 ++++++++++++--- .../idea/internal/KotlinDecompilerServiceImpl.kt | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt index 376a851fe30..d023523059d 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.kt @@ -22,6 +22,7 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.wm.ToolWindow import com.intellij.util.Alarm import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory +import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.codegen.ClassBuilderFactories import org.jetbrains.kotlin.codegen.CompilationErrorHandler import org.jetbrains.kotlin.codegen.DefaultCodegenFactory @@ -29,15 +30,17 @@ import org.jetbrains.kotlin.codegen.KotlinCodegenFacade import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages -import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.debugger.DebuggerUtils import org.jetbrains.kotlin.idea.project.languageVersionSettings +import org.jetbrains.kotlin.idea.project.platform import org.jetbrains.kotlin.idea.util.InfinitePeriodicalTask import org.jetbrains.kotlin.idea.util.LongRunningReadTask import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtScript +import org.jetbrains.kotlin.resolve.TargetPlatform +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.utils.join import java.awt.BorderLayout import java.awt.FlowLayout @@ -234,6 +237,7 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW val state: GenerationState try { state = compileSingleFile(ktFile, configuration) + ?: return BytecodeGenerationResult.Error("Cannot compile ${ktFile.name} to bytecode.") } catch (e: ProcessCanceledException) { throw e } catch (e: Exception) { @@ -271,8 +275,13 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW fun compileSingleFile( ktFile: KtFile, configuration: CompilerConfiguration - ): GenerationState { - val resolutionFacade = ktFile.getResolutionFacade() + ): GenerationState? { + val platform = ktFile.platform + if (platform != TargetPlatform.Common && platform != JvmPlatform) return null + + val resolutionFacade = KotlinCacheService.getInstance(ktFile.project) + .getResolutionFacadeByFile(ktFile, JvmPlatform) + ?: return null val bindingContextForFile = resolutionFacade.analyzeWithAllCompilerChecks(listOf(ktFile)).bindingContext diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinDecompilerServiceImpl.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinDecompilerServiceImpl.kt index 83b79eefd04..7b76d67cdc1 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinDecompilerServiceImpl.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/internal/KotlinDecompilerServiceImpl.kt @@ -83,7 +83,7 @@ class KotlinDecompilerServiceImpl : KotlinDecompilerService { val configuration = CompilerConfiguration().apply { languageVersionSettings = file.languageVersionSettings } - val generationState = KotlinBytecodeToolWindow.compileSingleFile(file, configuration) + val generationState = KotlinBytecodeToolWindow.compileSingleFile(file, configuration) ?: return emptyMap() val bytecodeMap = hashMapOf ByteArray>() generationState.factory.asList().filter { FileUtilRt.extensionEquals(it.relativePath, "class") }.forEach {