Save runtime type evaluator to userdata of codeFragment

This commit is contained in:
Natalia Ukhorskaya
2014-11-27 16:20:56 +03:00
parent deb80bc3ad
commit 73e71543c6
2 changed files with 40 additions and 2 deletions
@@ -25,6 +25,8 @@ import com.intellij.psi.tree.IElementType
import com.intellij.testFramework.LightVirtualFile import com.intellij.testFramework.LightVirtualFile
import org.jetbrains.jet.plugin.JetFileType import org.jetbrains.jet.plugin.JetFileType
import java.util.HashSet import java.util.HashSet
import com.intellij.openapi.util.Key
import org.jetbrains.jet.lang.types.JetType
public abstract class JetCodeFragment( public abstract class JetCodeFragment(
private val _project: Project, private val _project: Project,
@@ -119,6 +121,7 @@ public abstract class JetCodeFragment(
class object { class object {
public val IMPORT_SEPARATOR: String = "," public val IMPORT_SEPARATOR: String = ","
public val RUNTIME_TYPE_EVALUATOR: Key<Function1<JetExpression, JetType?>> = Key.create("RUNTIME_TYPE_EVALUATOR")
public fun getImportsForElement(elementAtCaret: PsiElement): String { public fun getImportsForElement(elementAtCaret: PsiElement): String {
val containingFile = elementAtCaret.getContainingFile() val containingFile = elementAtCaret.getContainingFile()
@@ -25,13 +25,17 @@ import org.jetbrains.jet.plugin.JetFileType
import org.jetbrains.jet.lang.psi.JetExpressionCodeFragment import org.jetbrains.jet.lang.psi.JetExpressionCodeFragment
import com.intellij.psi.PsiCodeBlock import com.intellij.psi.PsiCodeBlock
import com.intellij.debugger.engine.evaluation.CodeFragmentKind import com.intellij.debugger.engine.evaluation.CodeFragmentKind
import com.intellij.psi.JavaCodeFragmentFactory
import org.jetbrains.jet.plugin.debugger.KotlinEditorTextProvider import org.jetbrains.jet.plugin.debugger.KotlinEditorTextProvider
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetExpression 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.lang.psi.JetBlockCodeFragment
import org.jetbrains.jet.asJava.KotlinLightClass 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() { class KotlinCodeFragmentFactory: CodeFragmentFactory() {
override fun createCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { 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)) JetBlockCodeFragment(project, "fragment.kt", item.getText(), getContextElement(context))
} }
codeFragment.addImportsFromString(item.getImports()) 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<JetType>()
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 return codeFragment
} }