diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt index 4a3b36b8efe..a8f9db23f6a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/breakpointTypeUtils.kt @@ -31,9 +31,8 @@ import com.intellij.xdebugger.XSourcePosition import com.intellij.xdebugger.impl.XSourcePositionImpl import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils -import org.jetbrains.kotlin.idea.refactoring.getLineEndOffset +import org.jetbrains.kotlin.idea.debugger.findElementAtLine import org.jetbrains.kotlin.idea.refactoring.getLineNumber -import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf @@ -124,23 +123,10 @@ fun getLambdasAtLineIfAny(sourcePosition: SourcePosition): List { } fun getLambdasAtLineIfAny(file: KtFile, line: Int): List { - var lineStartOffset = file.getLineStartOffset(line) ?: return emptyList() - var lineEndOffset = file.getLineEndOffset(line) ?: return emptyList() + val lineElement = findElementAtLine(file, line) as? KtElement ?: return emptyList() - var topMostElement: PsiElement? = null - var elementAt: PsiElement? - while (topMostElement !is KtElement && lineStartOffset < lineEndOffset) { - elementAt = file.findElementAt(lineStartOffset) - if (elementAt != null) { - topMostElement = CodeInsightUtils.getTopmostElementAtOffset(elementAt, lineStartOffset) - } - lineStartOffset++ - } - - if (topMostElement !is KtElement) return emptyList() - - val start = topMostElement.startOffset - val end = topMostElement.endOffset + val start = lineElement.startOffset + val end = lineElement.endOffset val allLiterals = CodeInsightUtils. findElementsOfClassInRange(file, start, end, KtFunction::class.java) @@ -155,4 +141,3 @@ fun getLambdasAtLineIfAny(file: KtFile, line: Int): List { } } - diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt index f5383c3f42b..bac4ec5674e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt @@ -21,14 +21,20 @@ import com.intellij.debugger.engine.DebuggerManagerThreadImpl import com.intellij.debugger.engine.events.DebuggerCommandImpl import com.intellij.debugger.impl.DebuggerContextImpl import com.intellij.debugger.jdi.LocalVariableProxyImpl +import com.intellij.psi.PsiElement import com.sun.jdi.* import com.sun.tools.jdi.LocalVariableImpl import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.coroutines.CONTINUATION_ASM_TYPE import org.jetbrains.kotlin.codegen.coroutines.DO_RESUME_METHOD_NAME +import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinDebuggerCaches +import org.jetbrains.kotlin.idea.refactoring.getLineEndOffset +import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.inline.InlineUtil @@ -193,3 +199,22 @@ fun isOneLineMethod(location: Location): Boolean { return firstLine != null && firstLine == lastLine } + +fun findElementAtLine(file: KtFile, line: Int): PsiElement? { + val lineStartOffset = file.getLineStartOffset(line) ?: return null + val lineEndOffset = file.getLineEndOffset(line) ?: return null + + var topMostElement: PsiElement? = null + var elementAt: PsiElement? + for (offset in lineStartOffset until lineEndOffset) { + elementAt = file.findElementAt(offset) + if (elementAt != null) { + topMostElement = CodeInsightUtils.getTopmostElementAtOffset(elementAt, offset) + if (topMostElement is KtElement) { + break + } + } + } + + return topMostElement +} diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt index c830ac8a2ef..1e0956aed9b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt @@ -45,7 +45,6 @@ import org.jetbrains.kotlin.idea.debugger.stepping.DexBytecode.RETURN import org.jetbrains.kotlin.idea.debugger.stepping.DexBytecode.RETURN_OBJECT import org.jetbrains.kotlin.idea.debugger.stepping.DexBytecode.RETURN_VOID import org.jetbrains.kotlin.idea.debugger.stepping.DexBytecode.RETURN_WIDE -import org.jetbrains.kotlin.idea.refactoring.getLineEndOffset import org.jetbrains.kotlin.idea.refactoring.getLineNumber import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset import org.jetbrains.kotlin.idea.util.application.runReadAction @@ -235,24 +234,11 @@ private fun getInlineFunctionCallsIfAny(sourcePosition: SourcePosition): List Boolean): List { val file = sourcePosition.file as? KtFile ?: return emptyList() val lineNumber = sourcePosition.line - var elementAt = sourcePosition.elementAt - var startOffset = file.getLineStartOffset(lineNumber) ?: elementAt.startOffset - val endOffset = file.getLineEndOffset(lineNumber) ?: elementAt.endOffset + val lineElement = findElementAtLine(file, lineNumber) as? KtElement ?: return emptyList() - var topMostElement: PsiElement? = null - while (topMostElement !is KtElement && startOffset < endOffset) { - elementAt = file.findElementAt(startOffset) - if (elementAt != null) { - topMostElement = CodeInsightUtils.getTopmostElementAtOffset(elementAt, startOffset) - } - startOffset++ - } - - if (topMostElement !is KtElement) return emptyList() - - val start = topMostElement.startOffset - val end = topMostElement.endOffset + val start = lineElement.startOffset + val end = lineElement.endOffset val allFilteredCalls = CodeInsightUtils. findElementsOfClassInRange(file, start, end, KtExpression::class.java)