From 66a5351cd016ecd4cd4fc0c75b0d8b48e5a13f5c Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Fri, 23 Oct 2015 11:35:52 +0300 Subject: [PATCH] Do not show fake local variables for inline function/argument in Variables View for Debugger --- .../idea/debugger/JetPositionManager.kt | 17 ++++++++-- .../kotlin/idea/debugger/KotlinStackFrame.kt | 32 +++++++++++++++++++ .../tinyApp/outs/frameSharedVarLocalVar.out | 2 -- 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt index 55791d0ba74..8b8f4201df4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt @@ -21,6 +21,9 @@ import com.intellij.debugger.NoDataException import com.intellij.debugger.SourcePosition import com.intellij.debugger.engine.DebugProcess import com.intellij.debugger.engine.DebugProcessImpl +import com.intellij.debugger.engine.PositionManagerEx +import com.intellij.debugger.engine.evaluation.EvaluationContext +import com.intellij.debugger.jdi.StackFrameProxyImpl import com.intellij.debugger.requests.ClassPrepareRequestor import com.intellij.openapi.project.DumbService import com.intellij.openapi.roots.libraries.LibraryUtil @@ -30,6 +33,8 @@ import com.intellij.psi.impl.compiled.ClsFileImpl import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.util.* +import com.intellij.util.ThreeState +import com.intellij.xdebugger.frame.XStackFrame import com.sun.jdi.AbsentInformationException import com.sun.jdi.Location import com.sun.jdi.ReferenceType @@ -54,8 +59,6 @@ import org.jetbrains.kotlin.idea.search.usagesSearch.isImportUsage import org.jetbrains.kotlin.idea.util.DebuggerUtils import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.application.runReadAction -import org.jetbrains.kotlin.load.kotlin.PackageClassUtils -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext @@ -66,10 +69,18 @@ import com.intellij.debugger.engine.DebuggerUtils as JDebuggerUtils class PositionedElement(val className: String?, val element: PsiElement?) -public class JetPositionManager(private val myDebugProcess: DebugProcess) : MultiRequestPositionManager { +public class JetPositionManager(private val myDebugProcess: DebugProcess) : MultiRequestPositionManager, PositionManagerEx() { private val myTypeMappers = WeakHashMap>() + override fun evaluateCondition(context: EvaluationContext, frame: StackFrameProxyImpl, location: Location, expression: String): ThreeState? { + return null + } + + override fun createStackFrame(frame: StackFrameProxyImpl, debugProcess: DebugProcessImpl, location: Location): XStackFrame? { + return KotlinStackFrame(frame) + } + override fun getSourcePosition(location: Location?): SourcePosition? { if (location == null) { throw NoDataException.INSTANCE diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt new file mode 100644 index 00000000000..40570111ded --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.debugger + +import com.intellij.debugger.engine.JavaStackFrame +import com.intellij.debugger.jdi.LocalVariableProxyImpl +import com.intellij.debugger.jdi.StackFrameProxyImpl +import com.intellij.debugger.ui.impl.watch.MethodsTracker +import com.intellij.debugger.ui.impl.watch.StackFrameDescriptorImpl +import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil + +class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDescriptorImpl(frame, MethodsTracker()), true) { + override fun getVisibleVariables(): List? { + return super.getVisibleVariables().filter { + !InlineCodegenUtil.isFakeLocalVariableForInline(it.name()) + } + } +} \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/outs/frameSharedVarLocalVar.out b/idea/testData/debugger/tinyApp/outs/frameSharedVarLocalVar.out index e3a28fb038b..aa046bda467 100644 --- a/idea/testData/debugger/tinyApp/outs/frameSharedVarLocalVar.out +++ b/idea/testData/debugger/tinyApp/outs/frameSharedVarLocalVar.out @@ -25,8 +25,6 @@ inline fun foo(f: () -> Unit) { local = args: java.lang.String[] = {java.lang.String[0]@uniqueID} (sp = frameSharedVarLocalVar.kt, 3) local = var1: kotlin.jvm.internal.Ref$IntRef = {kotlin.jvm.internal.Ref$IntRef@uniqueID}1 (sp = frameSharedVarLocalVar.kt, 4) field = element: int = 1 (sp = Ref.!EXT!) - local = $i$a$1: int = 0 (sp = null) - local = $i$f$foo: int = 0 (sp = null) Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' Process finished with exit code 0