diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt index 8b26972d486..073b0073c55 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt @@ -48,6 +48,8 @@ import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils import org.jetbrains.kotlin.idea.decompiler.JetClsFile import org.jetbrains.kotlin.idea.findUsages.toSearchTarget import org.jetbrains.kotlin.idea.search.usagesSearch.DefaultSearchHelper +import org.jetbrains.kotlin.idea.search.usagesSearch.FunctionUsagesSearchHelper +import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearch import org.jetbrains.kotlin.idea.search.usagesSearch.search import org.jetbrains.kotlin.idea.util.DebuggerUtils import org.jetbrains.kotlin.idea.util.application.runReadAction @@ -353,7 +355,10 @@ public class JetPositionManager(private val myDebugProcess: DebugProcess) : Mult } if (isInLibrary) { - val elementAtForLibraryFile = getElementToCreateTypeMapperForLibraryFile(notPositionedElement) + val elementAtForLibraryFile = + if (element is JetDeclaration) element + else PsiTreeUtil.getParentOfType(element, javaClass()) + assert(elementAtForLibraryFile != null) { "Couldn't find element at breakpoint for library file " + file.getName() + (if (notPositionedElement == null) "" else ", notPositionedElement = " + notPositionedElement.getElementTextWithContext()) @@ -430,9 +435,11 @@ public class JetPositionManager(private val myDebugProcess: DebugProcess) : Mult InlineUtil.isInline(typeMapper.getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, psiElement)) ) { val project = myDebugProcess.getProject() - val usagesSearchTarget = FindUsagesOptions(project).toSearchTarget(psiElement, true) + val options = FindUsagesOptions(project) + options.isSearchForTextOccurrences = false + val usagesSearchTarget = options.toSearchTarget(psiElement, true) - val usagesSearchRequest = DefaultSearchHelper(true).newRequest(usagesSearchTarget) + val usagesSearchRequest = FunctionUsagesSearchHelper(skipImports = true).newRequest(usagesSearchTarget) usagesSearchRequest.search().forEach { val psiElement = it.getElement() if (psiElement is JetElement) { diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/PositionManagerLibraryClassFileSearcher.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/PositionManagerLibraryClassFileSearcher.kt index ceace2ba737..ab7d0c3e7e8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/PositionManagerLibraryClassFileSearcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/PositionManagerLibraryClassFileSearcher.kt @@ -51,13 +51,7 @@ private val LOG = Logger.getInstance("org.jetbrains.kotlin.idea.debugger") * 2. find all descriptors with same signature, if there is one - return it * 3. else -> return null, because it means that there is more than one function with same signature in project */ -fun findPackagePartInternalNameForLibraryFile(elementAt: JetElement): String? { - val topLevelDeclaration = PsiTreeUtil.getTopmostParentOfType(elementAt, javaClass()) - if (topLevelDeclaration == null) { - reportError(elementAt, null) - return null - } - +fun findPackagePartInternalNameForLibraryFile(topLevelDeclaration: JetDeclaration): String? { val packagePartFile = findPackagePartFileNamesForElement(topLevelDeclaration).singleOrNull() if (packagePartFile != null) return packagePartFile diff --git a/idea/src/org/jetbrains/kotlin/idea/util/DebuggerUtils.java b/idea/src/org/jetbrains/kotlin/idea/util/DebuggerUtils.java index e88ea3ce09a..58add37c3ab 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/DebuggerUtils.java +++ b/idea/src/org/jetbrains/kotlin/idea/util/DebuggerUtils.java @@ -99,7 +99,7 @@ public class DebuggerUtils { public Boolean invoke(JetFile file) { Integer startLineOffset = CodeInsightUtils.getStartLineOffset(file, lineNumber); assert startLineOffset != null : "Cannot find start line offset for file " + file.getName() + ", line " + lineNumber; - JetElement elementAt = PsiTreeUtil.getParentOfType(file.findElementAt(startLineOffset), JetElement.class); + JetDeclaration elementAt = PsiTreeUtil.getParentOfType(file.findElementAt(startLineOffset), JetDeclaration.class); return elementAt != null && className.getInternalName().equals(DebuggerPackage.findPackagePartInternalNameForLibraryFile(elementAt)); } diff --git a/idea/testData/debugger/customLibraryForTinyApp/inlineFunInLibrary/inlineFunInLibrary.kt b/idea/testData/debugger/customLibraryForTinyApp/inlineFunInLibrary/inlineFunInLibrary.kt new file mode 100644 index 00000000000..f5ef1ab10e7 --- /dev/null +++ b/idea/testData/debugger/customLibraryForTinyApp/inlineFunInLibrary/inlineFunInLibrary.kt @@ -0,0 +1,5 @@ +package customLib.inlineFunInLibrary + +public inline fun inlineFun(f: () -> Unit) { + 1 + 1 +} diff --git a/idea/testData/debugger/tinyApp/outs/breakpointInInlineFun.out b/idea/testData/debugger/tinyApp/outs/breakpointInInlineFun.out new file mode 100644 index 00000000000..dcf05d1088e --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/breakpointInInlineFun.out @@ -0,0 +1,7 @@ +LineBreakpoint created at inlineFunInLibrary.kt:3 +!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !APP_PATH!\classes;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! breakpointInInlineFun.BreakpointInInlineFunPackage +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +inlineFunInLibrary.kt:4 +Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/breakpointInInlineFun.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/breakpointInInlineFun.kt new file mode 100644 index 00000000000..027b287037e --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/breakpointInInlineFun.kt @@ -0,0 +1,9 @@ +package breakpointInInlineFun + +import customLib.inlineFunInLibrary.* + +fun main(args: Array) { + inlineFun { } +} + +// ADDITIONAL_BREAKPOINT: inlineFunInLibrary.kt:public inline fun inlineFun \ No newline at end of file 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 2bc965afdc2..e23dc6ce265 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -61,6 +61,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat doSingleBreakpointTest(fileName); } + @TestMetadata("breakpointInInlineFun.kt") + public void testBreakpointInInlineFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/breakpointInInlineFun.kt"); + doSingleBreakpointTest(fileName); + } + @TestMetadata("callableBug.kt") public void testCallableBug() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/callableBug.kt");