diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java b/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java index e14ef5d9257f..ba7c8e8cbe97 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java @@ -27,6 +27,7 @@ import com.intellij.execution.filters.LineNumbersMapping; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; import com.intellij.util.ThreeState; import com.intellij.xdebugger.frame.XStackFrame; import com.sun.jdi.InternalException; @@ -98,10 +99,12 @@ public class CompoundPositionManager extends PositionManagerEx implements MultiR } private static boolean checkCacheEntry(SourcePosition position, Location location) { - if (position == null || !position.getFile().isValid()) return false; - String url = DebuggerUtilsEx.getAlternativeSourceUrl(location.declaringType().name()); + if (position == null) return false; + PsiFile psiFile = position.getFile(); + if (!psiFile.isValid()) return false; + String url = DebuggerUtilsEx.getAlternativeSourceUrl(location.declaringType().name(), psiFile.getProject()); if (url == null) return true; - VirtualFile file = position.getFile().getVirtualFile(); + VirtualFile file = psiFile.getVirtualFile(); return file != null && url.equals(file.getUrl()); } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java index 583fe223a628..1bc5a1af33a5 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java @@ -133,7 +133,8 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio return null; } - PsiFile psiFile = getPsiFileByLocation(getDebugProcess().getProject(), location); + Project project = getDebugProcess().getProject(); + PsiFile psiFile = getPsiFileByLocation(project, location); if(psiFile == null ) { return null; } @@ -149,7 +150,7 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio } // replace file with alternative - String altFileUrl = DebuggerUtilsEx.getAlternativeSourceUrl(location.declaringType().name()); + String altFileUrl = DebuggerUtilsEx.getAlternativeSourceUrl(location.declaringType().name(), project); if (altFileUrl != null) { VirtualFile altFile = VirtualFileManager.getInstance().findFileByUrl(altFileUrl); if (altFile != null) { diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java index b0b70f6b9d19..7ae4204fe882 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java @@ -49,7 +49,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.pom.Navigatable; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; @@ -705,15 +704,21 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { return text.replace("\t", StringUtil.repeat(" ", tabSize)); } - private static final Map ourAlternativeSources = new ConcurrentHashMap(); + private static final Key> DEBUGGER_ALTERNATIVE_SOURCE_MAPPING = Key.create("DEBUGGER_ALTERNATIVE_SOURCE_MAPPING"); - public static void setAlternativeSourceUrl(String className, String source) { - ourAlternativeSources.put(className, source); + public static void setAlternativeSourceUrl(String className, String source, Project project) { + Map map = project.getUserData(DEBUGGER_ALTERNATIVE_SOURCE_MAPPING); + if (map == null) { + map = new ConcurrentHashMap(); + project.putUserData(DEBUGGER_ALTERNATIVE_SOURCE_MAPPING, map); + } + map.put(className, source); } @Nullable - public static String getAlternativeSourceUrl(@Nullable String className) { - return ourAlternativeSources.get(className); + public static String getAlternativeSourceUrl(@Nullable String className, Project project) { + Map map = project.getUserData(DEBUGGER_ALTERNATIVE_SOURCE_MAPPING); + return map != null ? map.get(className) : null; } @Nullable diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java b/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java index e0e804adca61..229662154370 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java @@ -179,7 +179,7 @@ public class AlternativeSourceNotificationProvider extends EditorNotifications.P if (location != null) { VirtualFile vFile = item.getContainingFile().getVirtualFile(); if (vFile != null) { - DebuggerUtilsEx.setAlternativeSourceUrl(location.declaringType().name(), vFile.getUrl()); + DebuggerUtilsEx.setAlternativeSourceUrl(location.declaringType().name(), vFile.getUrl(), project); } } DebuggerUIUtil.invokeLater(new Runnable() {