From ccc4e1c767c3ef04a6ed5efe0349a2be33cb328b Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Thu, 21 Aug 2014 13:03:13 +0400 Subject: [PATCH] Fix exception getting source position for library file --- .../plugin/debugger/JetPositionManager.java | 2 +- .../plugin/filters/JetExceptionFilter.java | 2 +- .../jet/plugin/util/DebuggerUtils.java | 33 +++++++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java index a0eb96cc562..1b084d6c64f 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java +++ b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java @@ -115,7 +115,7 @@ public class JetPositionManager implements PositionManager { JvmClassName className = JvmClassName.byInternalName(referenceInternalName); Project project = myDebugProcess.getProject(); - return DebuggerUtils.findSourceFileForClass(project, GlobalSearchScope.allScope(project), className, sourceName); + return DebuggerUtils.findSourceFileForClass(project, GlobalSearchScope.allScope(project), className, sourceName, location.lineNumber() - 1); } @NotNull diff --git a/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java b/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java index f79a6b732f7..e7ad6ae92f5 100644 --- a/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java +++ b/idea/src/org/jetbrains/jet/plugin/filters/JetExceptionFilter.java @@ -64,7 +64,7 @@ public class JetExceptionFilter implements Filter { String internalName = fullyQualifiedName.replace('.', '/'); JvmClassName jvmClassName = JvmClassName.byInternalName(internalName); - JetFile file = DebuggerUtils.findSourceFileForClass(project, searchScope, jvmClassName, fileName); + JetFile file = DebuggerUtils.findSourceFileForClass(project, searchScope, jvmClassName, fileName, element.getLineNumber() - 1); if (file == null) return null; VirtualFile virtualFile = file.getVirtualFile(); diff --git a/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java b/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java index 01eb621ba62..bdbb0536141 100644 --- a/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java @@ -19,17 +19,25 @@ package org.jetbrains.jet.plugin.util; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.libraries.LibraryUtil; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiTreeUtil; +import kotlin.Function1; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor; +import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; +import org.jetbrains.jet.plugin.codeInsight.CodeInsightUtils; +import org.jetbrains.jet.plugin.debugger.DebuggerPackage; import java.util.Collection; +import java.util.List; import static org.jetbrains.jet.plugin.stubindex.PackageIndexUtil.findFilesWithExactPackage; @@ -41,8 +49,9 @@ public class DebuggerUtils { public static JetFile findSourceFileForClass( @NotNull Project project, @NotNull GlobalSearchScope searchScope, - @NotNull JvmClassName className, - @NotNull final String fileName + @NotNull final JvmClassName className, + @NotNull final String fileName, + final int lineNumber ) { FqName packageFqName = getPackageFqNameForClass(className); @@ -66,6 +75,26 @@ public class DebuggerUtils { return file; } + boolean isInLibrary = KotlinPackage.any(filesWithExactName, new Function1() { + @Override + public Boolean invoke(JetFile file) { + return LibraryUtil.findLibraryEntry(file.getVirtualFile(), file.getProject()) != null; + } + }); + + if (isInLibrary) { + return KotlinPackage.singleOrNull(KotlinPackage.filter(filesWithExactName, new Function1() { + @Override + 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); + return elementAt != null && + className.getInternalName().equals(DebuggerPackage.findPackagePartInternalNameForLibraryFile(elementAt)); + } + })); + } + // In the rare case that there's more than one file with this name in this package, // we may actually need to analyze the project in order to find a file which produces this class // TODO: this code is not entirely correct, because it takes a session for only one file