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
This commit is contained in:
Natalia Selezneva
2018-02-13 14:47:54 +03:00
parent 3214fb8611
commit 2f61bd41d5
2 changed files with 14 additions and 7 deletions
@@ -21,7 +21,7 @@ import com.intellij.debugger.engine.evaluation.EvaluateException
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl import com.intellij.debugger.engine.evaluation.EvaluationContextImpl
import com.intellij.debugger.impl.ClassLoadingUtils import com.intellij.debugger.impl.ClassLoadingUtils
import com.intellij.debugger.impl.DebuggerUtilsEx 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.intellij.openapi.util.SystemInfo
import com.sun.jdi.ClassLoaderReference import com.sun.jdi.ClassLoaderReference
import com.sun.jdi.ClassType import com.sun.jdi.ClassType
@@ -51,14 +51,18 @@ class OrdinaryClassLoadingAdapter : ClassLoadingAdapter {
throw EvaluateException("Error creating evaluation class loader: " + e, e) throw EvaluateException("Error creating evaluation class loader: " + e, e)
} }
val version = process.virtualMachineProxy.version() val debugProcessVersionString = process.virtualMachineProxy.version()
val sdkVersion = JdkVersionUtil.getVersion(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( throw EvaluateException(
"Unable to compile for target level ${sdkVersion.description}. " + "Unable to compile for target level ${debugProcessVersion.description}. " +
"Need to run IDEA on java version at least ${sdkVersion.description}, " + "Need to run IDEA on java version at least $debugProcessVersion, " +
"currently running on ${SystemInfo.JAVA_RUNTIME_VERSION}") "currently running on $ideaJavaVersion")
} }
try { try {
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.idea.debugger.evaluate.compilingEvaluator package org.jetbrains.kotlin.idea.debugger.evaluate.compilingEvaluator
import com.intellij.debugger.engine.evaluation.EvaluateException
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl import com.intellij.debugger.engine.evaluation.EvaluationContextImpl
import com.sun.jdi.ClassLoaderReference import com.sun.jdi.ClassLoaderReference
import org.jetbrains.kotlin.idea.debugger.evaluate.LOG 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<ClassToLoad>): ClassLoaderReference? { fun loadClassesSafely(evaluationContext: EvaluationContextImpl, classes: Collection<ClassToLoad>): ClassLoaderReference? {
return try { return try {
loadClasses(evaluationContext, classes) loadClasses(evaluationContext, classes)
} catch (e: EvaluateException) {
throw e
} catch (e: Throwable) { } catch (e: Throwable) {
LOG.debug("Failed to evaluate expression", e) LOG.debug("Failed to evaluate expression", e)
null null