From 449ebc35ef396e4245f45292d5e54fbaa53f5e99 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Fri, 19 Dec 2014 17:42:38 +0300 Subject: [PATCH] Debugger: add ability to evaluate expressions on closing bracket --- .../jet/lang/resolve/lazy/ElementResolver.java | 11 +++++++++++ .../jet/plugin/caches/resolve/KotlinResolveCache.kt | 10 ++++++++++ .../checker/codeFragments/localVariablesOnReturn.kt | 4 ++++ .../codeFragments/localVariablesOnReturn.kt.fragment | 1 + .../basic/codeFragments/localVariablesOnReturn.kt | 7 +++++++ .../codeFragments/localVariablesOnReturn.kt.fragment | 1 + .../evaluate/CodeFragmentCompletionTestGenerated.java | 6 ++++++ .../CodeFragmentHighlightingTestGenerated.java | 6 ++++++ 8 files changed, 46 insertions(+) create mode 100644 idea/testData/checker/codeFragments/localVariablesOnReturn.kt create mode 100644 idea/testData/checker/codeFragments/localVariablesOnReturn.kt.fragment create mode 100644 idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt create mode 100644 idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt.fragment diff --git a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java index b6fe9259fbc..50beb430fc9 100644 --- a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java +++ b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java @@ -22,6 +22,7 @@ import com.google.common.base.Predicates; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzerPackage; import org.jetbrains.jet.di.InjectorForBodyResolve; @@ -245,6 +246,16 @@ public abstract class ElementResolver { scopeForContextElement = descriptor.getScopeForMemberDeclarationResolution(); dataFlowInfoForContextElement = DataFlowInfo.EMPTY; } + else if (contextElement instanceof JetBlockExpression) { + JetElement newContextElement = KotlinPackage.lastOrNull(((JetBlockExpression) contextElement).getStatements()); + + if (!(newContextElement instanceof JetExpression)) return; + + BindingContext contextForElement = resolveToElement((JetElement) contextElement, BodyResolveMode.FULL); + + scopeForContextElement = contextForElement.get(BindingContext.RESOLUTION_SCOPE, ((JetExpression) newContextElement)); + dataFlowInfoForContextElement = getDataFlowInfo(contextForElement, (JetExpression) newContextElement); + } else { if (!(contextElement instanceof JetExpression)) return; diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt index c9cbc927bfe..e076d4c3b9c 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt @@ -66,6 +66,7 @@ import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.jet.lang.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.jet.lang.resolve.scopes.JetScope import org.jetbrains.jet.lang.resolve.lazy.BodyResolveMode +import org.jetbrains.jet.lang.psi.JetBlockExpression public trait CacheExtension { public val platform: TargetPlatform @@ -290,6 +291,15 @@ private object KotlinResolveDataProvider { scopeForContextElement = descriptor.getScopeForMemberDeclarationResolution() dataFlowInfo = DataFlowInfo.EMPTY } + else if (contextElement is JetBlockExpression) { + val newContextElement = contextElement.getStatements().lastOrNull() + if (newContextElement !is JetExpression) return BindingContext.EMPTY + + val contextForElement = newContextElement.getResolutionFacade().analyze(newContextElement, BodyResolveMode.FULL) + + scopeForContextElement = contextForElement[BindingContext.RESOLUTION_SCOPE, newContextElement] + dataFlowInfo = contextForElement.getDataFlowInfo(newContextElement) + } else { if (contextElement !is JetExpression) return BindingContext.EMPTY diff --git a/idea/testData/checker/codeFragments/localVariablesOnReturn.kt b/idea/testData/checker/codeFragments/localVariablesOnReturn.kt new file mode 100644 index 00000000000..b5640e3c19b --- /dev/null +++ b/idea/testData/checker/codeFragments/localVariablesOnReturn.kt @@ -0,0 +1,4 @@ +fun foo() { + val aaa1 = 1 + val aaa2 = 2 +} diff --git a/idea/testData/checker/codeFragments/localVariablesOnReturn.kt.fragment b/idea/testData/checker/codeFragments/localVariablesOnReturn.kt.fragment new file mode 100644 index 00000000000..88f31790046 --- /dev/null +++ b/idea/testData/checker/codeFragments/localVariablesOnReturn.kt.fragment @@ -0,0 +1 @@ +aaa1 + aaa2 diff --git a/idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt b/idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt new file mode 100644 index 00000000000..c1879fd346a --- /dev/null +++ b/idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt @@ -0,0 +1,7 @@ +fun foo() { + val aaa1 = 1 + val aaa2 = 2 +} + +// INVOCATION_COUNT: 1 +// EXIST: aaa1, aaa2 diff --git a/idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt.fragment b/idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt.fragment new file mode 100644 index 00000000000..673089a370f --- /dev/null +++ b/idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt.fragment @@ -0,0 +1 @@ +aa diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java index b51495a2ffb..0c375b4610e 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentCompletionTestGenerated.java @@ -61,6 +61,12 @@ public class CodeFragmentCompletionTestGenerated extends AbstractCodeFragmentCom doTest(fileName); } + @TestMetadata("localVariablesOnReturn.kt") + public void testLocalVariablesOnReturn() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/codeFragments/localVariablesOnReturn.kt"); + doTest(fileName); + } + @TestMetadata("topLevel.kt") public void testTopLevel() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/codeFragments/topLevel.kt"); diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java index 451bf707a0f..fc3fd4c9e47 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/evaluate/CodeFragmentHighlightingTestGenerated.java @@ -81,6 +81,12 @@ public class CodeFragmentHighlightingTestGenerated extends AbstractCodeFragmentH doTest(fileName); } + @TestMetadata("localVariablesOnReturn.kt") + public void testLocalVariablesOnReturn() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/localVariablesOnReturn.kt"); + doTest(fileName); + } + @TestMetadata("privateFunArgumentsResolve.kt") public void testPrivateFunArgumentsResolve() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/codeFragments/privateFunArgumentsResolve.kt");