Code fragment analysis: analyze parents if there's no sensible scope for the default element (KT-29179)

This commit is contained in:
Yan Zhulanow
2019-03-06 18:21:55 +03:00
parent 97f94700b9
commit 754a7bc554
4 changed files with 41 additions and 5 deletions
@@ -19,10 +19,12 @@ package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.project.ResolveElementCache
import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypes2
import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
@@ -135,16 +137,15 @@ class CodeFragmentAnalyzer(
}
is KtElement -> {
bindingContext = resolutionFactory(context)
scope = bindingContext[BindingContext.LEXICAL_SCOPE, context]
scope = context.getResolutionScope(bindingContext)
dataFlowInfo = bindingContext.getDataFlowInfoAfter(context)
}
}
if (scope == null) {
val containingKtFile = context?.containingFile as? KtFile
if (containingKtFile != null) {
bindingContext = resolveSession.bindingContext
scope = resolveSession.fileScopeProvider.getFileResolutionScope(containingKtFile)
val parentDeclaration = context?.getParentOfTypes2<KtDeclaration, KtFile>()
if (parentDeclaration != null) {
return getContextInfo(parentDeclaration, resolutionFactory)
}
}
@@ -0,0 +1,21 @@
package kt29179
class A {
val a = 1
fun bar() = 2
fun foo() {
3
//Breakpoint!
.toString()
}
}
fun main() {
A().foo()
}
// EXPRESSION: bar()
// RESULT: 2: I
// EXPRESSION: this
// RESULT: instance of kt29179.A(id=ID): Lkt29179/A;
@@ -0,0 +1,9 @@
LineBreakpoint created at kt29179.kt:9
Run Java
Connected to the target VM
kt29179.kt:9
Compile bytecode for bar()
Compile bytecode for this
Disconnected from the target VM
Process finished with exit code 0
@@ -271,6 +271,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt28087.kt");
}
@TestMetadata("kt29179.kt")
public void testKt29179() throws Exception {
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.kt");
}
@TestMetadata("kt5554OnlyIntsShouldBeCoerced.kt")
public void testKt5554OnlyIntsShouldBeCoerced() throws Exception {
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt5554OnlyIntsShouldBeCoerced.kt");