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 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<Function1<JetExpression, JetType?>> = Key.create("RUNTIME_TYPE_EVALUATOR")
public fun getImportsForElement(elementAtCaret: PsiElement): String {
val containingFile = elementAtCaret.getContainingFile()
@@ -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<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
}