From 6867165ababae1b902a92a343fdce3143268e4ac Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Tue, 17 Nov 2015 16:20:42 +0300 Subject: [PATCH] Fix navigation from stack trace to inline function calls in inner classes --- .../kotlin/idea/filters/KotlinExceptionFilter.kt | 9 +++++++-- .../inlineFunInnerClassFromLibrary.kt | 9 +++++++++ .../inlineFunctionFile.kt | 5 +++++ .../inlineFunctionInnerClass.kt | 16 ++++++++++++++++ .../inlineFunctionInnerClassInLbrary.kt | 13 +++++++++++++ .../KotlinExceptionFilterTestGenerated.java | 6 ++++++ 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 idea/testData/debugger/exceptionFilter/inlineFunInnerClassFromLibrary/inlineFunInnerClassFromLibrary.kt create mode 100644 idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionFile.kt create mode 100644 idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionInnerClass.kt create mode 100644 idea/testData/debugger/mockLibraryForExceptionFilter/inlineFunctionInnerClassInLbrary.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt b/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt index a2eed417350..04868eda59f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt +++ b/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.idea.util.DebuggerUtils import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.tail import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.utils.addToStdlib.check @@ -71,9 +72,13 @@ class KotlinExceptionFilter(private val searchScope: GlobalSearchScope) : Filter } private fun virtualFileForInlineCall(jvmName: JvmClassName, file: VirtualFile, lineNumber: Int, project: Project): OpenFileHyperlinkInfo? { + val fqNameWithInners = jvmName.fqNameForClassNameWithoutDollars.tail(jvmName.packageFqName) + if (ProjectRootsUtil.isInContent(project, file, false, true, false)) { + val classId = ClassId(jvmName.packageFqName, Name.identifier(fqNameWithInners.asString())) + val fileFinder = JvmVirtualFileFinder.SERVICE.getInstance(project) - val classFile = fileFinder.findVirtualFileWithHeader(ClassId(jvmName.packageFqName, jvmName.fqNameForClassNameWithoutDollars.shortName())) ?: return null + val classFile = fileFinder.findVirtualFileWithHeader(classId) ?: return null return readDebugInfoForInlineFun(classFile.contentsToByteArray(), lineNumber, project) } @@ -82,11 +87,11 @@ class KotlinExceptionFilter(private val searchScope: GlobalSearchScope) : Filter val linesInFile = file.toPsiFile(project)?.getLineCount() ?: return null if (lineNumber <= linesInFile) return null - val className = jvmName.fqNameForClassNameWithoutDollars.tail(jvmName.packageFqName).asString().replace('.', '$') val module = ProjectFileIndex.SERVICE.getInstance(project).getModuleForFile(file) val outputDir = CompilerPaths.getModuleOutputDirectory(module, /*forTests = */ false) ?: return null + val className = fqNameWithInners.asString().replace('.', '$') val classByByDirectory = findClassFileByPath(jvmName.packageFqName.asString(), className, outputDir) ?: return null return readDebugInfoForInlineFun(classByByDirectory.readBytes(), lineNumber, project) diff --git a/idea/testData/debugger/exceptionFilter/inlineFunInnerClassFromLibrary/inlineFunInnerClassFromLibrary.kt b/idea/testData/debugger/exceptionFilter/inlineFunInnerClassFromLibrary/inlineFunInnerClassFromLibrary.kt new file mode 100644 index 00000000000..3222e3b1aa4 --- /dev/null +++ b/idea/testData/debugger/exceptionFilter/inlineFunInnerClassFromLibrary/inlineFunInnerClassFromLibrary.kt @@ -0,0 +1,9 @@ +package inlineFunInnerClassFromLibrary + +fun box() { + inlineFunctionInnerClassInLbrary.A().Inner().test() +} + +// WITH_MOCK_LIBRARY: true +// FILE: inlineFunInLibrary.kt +// LINE: 4 \ No newline at end of file diff --git a/idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionFile.kt b/idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionFile.kt new file mode 100644 index 00000000000..dceffd6a7f9 --- /dev/null +++ b/idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionFile.kt @@ -0,0 +1,5 @@ +package inlineFunctionInnerClass + +inline fun foo(f: () -> Unit) { + null!! +} \ No newline at end of file diff --git a/idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionInnerClass.kt b/idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionInnerClass.kt new file mode 100644 index 00000000000..71ce3affea9 --- /dev/null +++ b/idea/testData/debugger/exceptionFilter/inlineFunctionInnerClass/inlineFunctionInnerClass.kt @@ -0,0 +1,16 @@ +package inlineFunctionInnerClass + +fun box() { + A().Inner().test() +} + +class A { + inner class Inner { + fun test() { + foo {} + } + } +} + +// FILE: inlineFunctionFile.kt +// LINE: 4 \ No newline at end of file diff --git a/idea/testData/debugger/mockLibraryForExceptionFilter/inlineFunctionInnerClassInLbrary.kt b/idea/testData/debugger/mockLibraryForExceptionFilter/inlineFunctionInnerClassInLbrary.kt new file mode 100644 index 00000000000..d365e1b9a8a --- /dev/null +++ b/idea/testData/debugger/mockLibraryForExceptionFilter/inlineFunctionInnerClassInLbrary.kt @@ -0,0 +1,13 @@ +package inlineFunctionInnerClassInLbrary + +fun box() { + A().Inner().test() +} + +class A { + inner class Inner { + fun test() { + inlineFunInLibrary.foo {} + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilterTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilterTestGenerated.java index 7a512a39bdc..df9cd85d179 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilterTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilterTestGenerated.java @@ -53,6 +53,12 @@ public class KotlinExceptionFilterTestGenerated extends AbstractKotlinExceptionF doTest(fileName); } + @TestMetadata("inlineFunInnerClassFromLibrary") + public void testInlineFunInnerClassFromLibrary() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/exceptionFilter/inlineFunInnerClassFromLibrary/"); + doTest(fileName); + } + @TestMetadata("inlineFunctionAnotherFile") public void testInlineFunctionAnotherFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/exceptionFilter/inlineFunctionAnotherFile/");