From 754a7bc554cb6464589dd5e8c4abb4b2df7947f3 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 6 Mar 2019 18:21:55 +0300 Subject: [PATCH] Code fragment analysis: analyze parents if there's no sensible scope for the default element (KT-29179) --- .../caches/resolve/CodeFragmentAnalyzer.kt | 11 +++++----- .../src/evaluate/singleBreakpoint/kt29179.kt | 21 +++++++++++++++++++ .../src/evaluate/singleBreakpoint/kt29179.out | 9 ++++++++ ...KotlinEvaluateExpressionTestGenerated.java | 5 +++++ 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.kt create mode 100644 idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.out diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt index c90f68e483f..0d81968ac53 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt @@ -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() + if (parentDeclaration != null) { + return getContextInfo(parentDeclaration, resolutionFactory) } } diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.kt new file mode 100644 index 00000000000..2f22584f9e5 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.kt @@ -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; \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.out b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.out new file mode 100644 index 00000000000..c37717ff3be --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/kt29179.out @@ -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 diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java index cc451521b2b..54c2ea517f1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -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");