From 2f61bd41d5dd82a53eed5be2d1ef2117ff33f8d6 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Tue, 13 Feb 2018 14:47:54 +0300 Subject: [PATCH] Fix comparision of java versions during class loading in evaluate expression. Do not catch EvaluateException during class loading to show more useful error to user. ^KT-22830 Fixed --- .../OrdinaryClassLoadingAdapter.kt | 18 +++++++++++------- .../debugger/evaluate/compilingEvaluator.kt | 3 +++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt index b7163d99137..f7db0c584ce 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/OrdinaryClassLoadingAdapter.kt @@ -21,7 +21,7 @@ import com.intellij.debugger.engine.evaluation.EvaluateException import com.intellij.debugger.engine.evaluation.EvaluationContextImpl import com.intellij.debugger.impl.ClassLoadingUtils import com.intellij.debugger.impl.DebuggerUtilsEx -import com.intellij.openapi.projectRoots.JdkVersionUtil +import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.util.SystemInfo import com.sun.jdi.ClassLoaderReference import com.sun.jdi.ClassType @@ -51,14 +51,18 @@ class OrdinaryClassLoadingAdapter : ClassLoadingAdapter { throw EvaluateException("Error creating evaluation class loader: " + e, e) } - val version = process.virtualMachineProxy.version() - val sdkVersion = JdkVersionUtil.getVersion(version) + val debugProcessVersionString = process.virtualMachineProxy.version() + val debugProcessVersion = JavaSdkVersion.fromVersionString(debugProcessVersionString) + ?: throw EvaluateException("Unable to parse java version from $debugProcessVersionString.") - if (!SystemInfo.isJavaVersionAtLeast(sdkVersion.description)) { + val ideaJavaVersion = JavaSdkVersion.fromVersionString(SystemInfo.JAVA_RUNTIME_VERSION) + ?: throw EvaluateException("Unable to parse java version from ${SystemInfo.JAVA_RUNTIME_VERSION}.") + + if (!ideaJavaVersion.isAtLeast(debugProcessVersion)) { throw EvaluateException( - "Unable to compile for target level ${sdkVersion.description}. " + - "Need to run IDEA on java version at least ${sdkVersion.description}, " + - "currently running on ${SystemInfo.JAVA_RUNTIME_VERSION}") + "Unable to compile for target level ${debugProcessVersion.description}. " + + "Need to run IDEA on java version at least $debugProcessVersion, " + + "currently running on $ideaJavaVersion") } try { diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilingEvaluator.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilingEvaluator.kt index 9c96bbe1ed9..e2fd8e3027d 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilingEvaluator.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilingEvaluator.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.debugger.evaluate.compilingEvaluator +import com.intellij.debugger.engine.evaluation.EvaluateException import com.intellij.debugger.engine.evaluation.EvaluationContextImpl import com.sun.jdi.ClassLoaderReference import org.jetbrains.kotlin.idea.debugger.evaluate.LOG @@ -25,6 +26,8 @@ import org.jetbrains.kotlin.idea.debugger.evaluate.classLoading.ClassToLoad fun loadClassesSafely(evaluationContext: EvaluationContextImpl, classes: Collection): ClassLoaderReference? { return try { loadClasses(evaluationContext, classes) + } catch (e: EvaluateException) { + throw e } catch (e: Throwable) { LOG.debug("Failed to evaluate expression", e) null