From 86c7d11750e2c1401761a2aaa7b7f35e5461b2db Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Tue, 21 Jul 2015 12:53:19 +0300 Subject: [PATCH] Debugger: do not create codeFragments with context of PsiFile --- .../evaluate/KotlinCodeFragmentFactory.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt index 02a7f9ba129..ba4dc01c74d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt @@ -20,6 +20,7 @@ import com.intellij.debugger.DebuggerManagerEx import com.intellij.debugger.engine.evaluation.CodeFragmentFactory import com.intellij.debugger.engine.evaluation.CodeFragmentKind import com.intellij.debugger.engine.evaluation.TextWithImports +import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project import com.intellij.openapi.util.Key @@ -38,19 +39,26 @@ import org.jetbrains.kotlin.idea.JetFileType import org.jetbrains.kotlin.idea.debugger.KotlinEditorTextProvider import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.types.JetType import java.util.HashMap import java.util.concurrent.atomic.AtomicReference class KotlinCodeFragmentFactory: CodeFragmentFactory() { + private val LOG = Logger.getInstance(this.javaClass) + override fun createCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { + val contextElement = getWrappedContextElement(project, context) + if (contextElement == null) { + LOG.warn("CodeFragment with null context created:\noriginalContext = ${context?.getElementTextWithContext()}") + } val codeFragment = if (item.getKind() == CodeFragmentKind.EXPRESSION) { JetExpressionCodeFragment( project, "fragment.kt", item.getText(), item.getImports(), - getWrappedContextElement(project, context) + contextElement ) } else { @@ -59,7 +67,7 @@ class KotlinCodeFragmentFactory: CodeFragmentFactory() { "fragment.kt", item.getText(), item.getImports(), - getWrappedContextElement(project, context) + contextElement ) } @@ -130,12 +138,15 @@ class KotlinCodeFragmentFactory: CodeFragmentFactory() { return getContextElement(elementAt.getOrigin()) } - val expressionAtOffset = PsiTreeUtil.findElementOfClassAtOffset(elementAt.getContainingFile()!!, elementAt.getTextOffset(), javaClass(), false) + val containingFile = elementAt.getContainingFile() + if (containingFile !is JetFile) return null + + val expressionAtOffset = PsiTreeUtil.findElementOfClassAtOffset(containingFile, elementAt.getTextOffset(), javaClass(), false) if (expressionAtOffset != null && KotlinEditorTextProvider.isAcceptedAsCodeFragmentContext(elementAt)) { return expressionAtOffset } - return KotlinEditorTextProvider.findExpressionInner(elementAt, true) ?: elementAt.getContainingFile() + return KotlinEditorTextProvider.findExpressionInner(elementAt, true) ?: containingFile } //internal for tests