diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCodeFragment.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCodeFragment.kt index ffd7eb031ba..084caef5437 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCodeFragment.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCodeFragment.kt @@ -25,6 +25,8 @@ import com.intellij.psi.tree.IElementType import com.intellij.testFramework.LightVirtualFile import org.jetbrains.jet.plugin.JetFileType import java.util.HashSet +import com.intellij.openapi.util.Key +import org.jetbrains.jet.lang.types.JetType public abstract class JetCodeFragment( private val _project: Project, @@ -119,6 +121,7 @@ public abstract class JetCodeFragment( class object { public val IMPORT_SEPARATOR: String = "," + public val RUNTIME_TYPE_EVALUATOR: Key> = Key.create("RUNTIME_TYPE_EVALUATOR") public fun getImportsForElement(elementAtCaret: PsiElement): String { val containingFile = elementAtCaret.getContainingFile() diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinCodeFragmentFactory.kt b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinCodeFragmentFactory.kt index 09872f905ce..1c2391b53ad 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinCodeFragmentFactory.kt +++ b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinCodeFragmentFactory.kt @@ -25,13 +25,17 @@ import org.jetbrains.jet.plugin.JetFileType import org.jetbrains.jet.lang.psi.JetExpressionCodeFragment import com.intellij.psi.PsiCodeBlock import com.intellij.debugger.engine.evaluation.CodeFragmentKind -import com.intellij.psi.JavaCodeFragmentFactory import org.jetbrains.jet.plugin.debugger.KotlinEditorTextProvider import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.jet.lang.psi.JetExpression -import org.jetbrains.jet.lang.psi.JetBlockExpression import org.jetbrains.jet.lang.psi.JetBlockCodeFragment import org.jetbrains.jet.asJava.KotlinLightClass +import com.intellij.debugger.DebuggerManagerEx +import org.jetbrains.jet.lang.psi.JetCodeFragment +import org.jetbrains.jet.lang.types.JetType +import com.intellij.util.concurrency.Semaphore +import java.util.concurrent.atomic.AtomicReference +import com.intellij.openapi.progress.ProgressManager class KotlinCodeFragmentFactory: CodeFragmentFactory() { override fun createCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { @@ -42,6 +46,37 @@ class KotlinCodeFragmentFactory: CodeFragmentFactory() { JetBlockCodeFragment(project, "fragment.kt", item.getText(), getContextElement(context)) } codeFragment.addImportsFromString(item.getImports()) + + codeFragment.putCopyableUserData(JetCodeFragment.RUNTIME_TYPE_EVALUATOR, { + (expression: JetExpression): JetType? -> + + val debuggerContext = DebuggerManagerEx.getInstanceEx(project).getContext() + val debuggerSession = debuggerContext.getDebuggerSession() + if (debuggerSession == null) { + null + } + else { + val semaphore = Semaphore() + semaphore.down() + val nameRef = AtomicReference() + val worker = object : KotlinRuntimeTypeEvaluator(null, expression, debuggerContext, ProgressManager.getInstance().getProgressIndicator()) { + override fun typeCalculationFinished(type: JetType?) { + nameRef.set(type) + semaphore.up() + } + } + + debuggerContext.getDebugProcess()?.getManagerThread()?.invoke(worker) + + for (i in 0..50) { + ProgressManager.checkCanceled() + if (semaphore.waitFor(20)) break + } + + nameRef.get() + } + }) + return codeFragment }