Debugger: do not create codeFragments with context of PsiFile
This commit is contained in:
@@ -20,6 +20,7 @@ import com.intellij.debugger.DebuggerManagerEx
|
|||||||
import com.intellij.debugger.engine.evaluation.CodeFragmentFactory
|
import com.intellij.debugger.engine.evaluation.CodeFragmentFactory
|
||||||
import com.intellij.debugger.engine.evaluation.CodeFragmentKind
|
import com.intellij.debugger.engine.evaluation.CodeFragmentKind
|
||||||
import com.intellij.debugger.engine.evaluation.TextWithImports
|
import com.intellij.debugger.engine.evaluation.TextWithImports
|
||||||
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import com.intellij.openapi.progress.ProgressManager
|
import com.intellij.openapi.progress.ProgressManager
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.Key
|
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.idea.debugger.KotlinEditorTextProvider
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
||||||
import org.jetbrains.kotlin.types.JetType
|
import org.jetbrains.kotlin.types.JetType
|
||||||
import java.util.HashMap
|
import java.util.HashMap
|
||||||
import java.util.concurrent.atomic.AtomicReference
|
import java.util.concurrent.atomic.AtomicReference
|
||||||
|
|
||||||
class KotlinCodeFragmentFactory: CodeFragmentFactory() {
|
class KotlinCodeFragmentFactory: CodeFragmentFactory() {
|
||||||
|
private val LOG = Logger.getInstance(this.javaClass)
|
||||||
|
|
||||||
override fun createCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment {
|
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) {
|
val codeFragment = if (item.getKind() == CodeFragmentKind.EXPRESSION) {
|
||||||
JetExpressionCodeFragment(
|
JetExpressionCodeFragment(
|
||||||
project,
|
project,
|
||||||
"fragment.kt",
|
"fragment.kt",
|
||||||
item.getText(),
|
item.getText(),
|
||||||
item.getImports(),
|
item.getImports(),
|
||||||
getWrappedContextElement(project, context)
|
contextElement
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -59,7 +67,7 @@ class KotlinCodeFragmentFactory: CodeFragmentFactory() {
|
|||||||
"fragment.kt",
|
"fragment.kt",
|
||||||
item.getText(),
|
item.getText(),
|
||||||
item.getImports(),
|
item.getImports(),
|
||||||
getWrappedContextElement(project, context)
|
contextElement
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,12 +138,15 @@ class KotlinCodeFragmentFactory: CodeFragmentFactory() {
|
|||||||
return getContextElement(elementAt.getOrigin())
|
return getContextElement(elementAt.getOrigin())
|
||||||
}
|
}
|
||||||
|
|
||||||
val expressionAtOffset = PsiTreeUtil.findElementOfClassAtOffset(elementAt.getContainingFile()!!, elementAt.getTextOffset(), javaClass<JetExpression>(), false)
|
val containingFile = elementAt.getContainingFile()
|
||||||
|
if (containingFile !is JetFile) return null
|
||||||
|
|
||||||
|
val expressionAtOffset = PsiTreeUtil.findElementOfClassAtOffset(containingFile, elementAt.getTextOffset(), javaClass<JetExpression>(), false)
|
||||||
if (expressionAtOffset != null && KotlinEditorTextProvider.isAcceptedAsCodeFragmentContext(elementAt)) {
|
if (expressionAtOffset != null && KotlinEditorTextProvider.isAcceptedAsCodeFragmentContext(elementAt)) {
|
||||||
return expressionAtOffset
|
return expressionAtOffset
|
||||||
}
|
}
|
||||||
|
|
||||||
return KotlinEditorTextProvider.findExpressionInner(elementAt, true) ?: elementAt.getContainingFile()
|
return KotlinEditorTextProvider.findExpressionInner(elementAt, true) ?: containingFile
|
||||||
}
|
}
|
||||||
|
|
||||||
//internal for tests
|
//internal for tests
|
||||||
|
|||||||
Reference in New Issue
Block a user