From f71e24403f7590acb765a611774e197562b82b5f Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 20 Jul 2016 17:02:57 +0300 Subject: [PATCH] Refactoring: working with smap methods --- .../idea/filters/InlineSmapPositionUtil.kt | 48 +++++++++++-------- .../idea/filters/KotlinExceptionFilter.kt | 2 +- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/filters/InlineSmapPositionUtil.kt b/idea/src/org/jetbrains/kotlin/idea/filters/InlineSmapPositionUtil.kt index 50db343919b..0a94b8446f7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/filters/InlineSmapPositionUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/filters/InlineSmapPositionUtil.kt @@ -40,29 +40,35 @@ import org.jetbrains.org.objectweb.asm.ClassReader import org.jetbrains.org.objectweb.asm.ClassVisitor import java.io.File -fun readClassFile(jvmName: JvmClassName, file: VirtualFile, lineNumber: Int, project: Project): ByteArray? { +fun isInlineFunctionLineNumber(file: VirtualFile, lineNumber: Int, project: Project): Boolean { + val linesInFile = file.toPsiFile(project)?.getLineCount() ?: return false + return lineNumber > linesInFile +} + +fun readClassFile(jvmName: JvmClassName, file: VirtualFile, project: Project, sourceCondition: (VirtualFile) -> Boolean = { true }): ByteArray? { val fqNameWithInners = jvmName.fqNameForClassNameWithoutDollars.tail(jvmName.packageFqName) - if (ProjectRootsUtil.isLibrarySourceFile(project, file)) { - val classId = ClassId(jvmName.packageFqName, Name.identifier(fqNameWithInners.asString())) + when { + ProjectRootsUtil.isLibrarySourceFile(project, file) -> { + val classId = ClassId(jvmName.packageFqName, Name.identifier(fqNameWithInners.asString())) - val fileFinder = JvmVirtualFileFinder.SERVICE.getInstance(project) - val classFile = fileFinder.findVirtualFileWithHeader(classId) ?: return null - return classFile.contentsToByteArray() + val fileFinder = JvmVirtualFileFinder.SERVICE.getInstance(project) + val classFile = fileFinder.findVirtualFileWithHeader(classId) ?: return null + return classFile.contentsToByteArray() + } + + ProjectRootsUtil.isProjectSourceFile(project, file) && sourceCondition(file) -> { + 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 classByByDirectory.readBytes() + } + + else -> return null } - - if (!ProjectRootsUtil.isProjectSourceFile(project, file)) return null - - val linesInFile = file.toPsiFile(project)?.getLineCount() ?: return null - if (lineNumber <= linesInFile) return null - - 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 classByByDirectory.readBytes() } private fun findClassFileByPath(packageName: String, className: String, outputDir: VirtualFile): File? { @@ -82,9 +88,9 @@ private fun findClassFileByPath(packageName: String, className: String, outputDi fun parseStrata(strata: String?, line: Int, project: Project, isKotlin2: Boolean, searchScope: GlobalSearchScope): Pair? { if (strata == null) return null - val mappings = SMAPParser.parse(strata) + val smap = SMAPParser.parse(strata) - val mappingInfo = mappings.fileMappings.firstOrNull { + val mappingInfo = smap.fileMappings.firstOrNull { it.getIntervalIfContains(line) != null } ?: return null diff --git a/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt b/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt index 43b0e573d4f..d9f8cd23ac8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt +++ b/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt @@ -78,7 +78,7 @@ class KotlinExceptionFilter(private val searchScope: GlobalSearchScope) : Filter } private fun getHyperlinkInfoIfInline(jvmName: JvmClassName, file: VirtualFile, lineNumber: Int, project: Project): InlineFunctionHyperLinkInfo? { - val bytes = readClassFile(jvmName, file, lineNumber, project) ?: return null + val bytes = readClassFile(jvmName, file, project, { isInlineFunctionLineNumber(it, lineNumber, project) }) ?: return null return readDebugInfoForInlineFun(bytes, lineNumber, project) }