Debugger: add ability to evaluate expressions on closing bracket

This commit is contained in:
Natalia Ukhorskaya
2014-12-19 17:42:38 +03:00
parent 261ced59c5
commit 449ebc35ef
8 changed files with 46 additions and 0 deletions
@@ -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;
@@ -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<T> {
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
@@ -0,0 +1,4 @@
fun foo() {
val aaa1 = 1
val aaa2 = 2
<caret>}
@@ -0,0 +1 @@
aaa1 + aaa2
@@ -0,0 +1,7 @@
fun foo() {
val aaa1 = 1
val aaa2 = 2
<caret>}
// INVOCATION_COUNT: 1
// EXIST: aaa1, aaa2
@@ -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");
@@ -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");