store alternative source map in project user data

This commit is contained in:
Egor.Ushakov
2015-12-23 17:15:43 +03:00
parent 27e7e1a657
commit 933c8d7400
4 changed files with 21 additions and 12 deletions
@@ -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());
}
@@ -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) {
@@ -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<String, String> ourAlternativeSources = new ConcurrentHashMap<String, String>();
private static final Key<Map<String, String>> 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<String, String> map = project.getUserData(DEBUGGER_ALTERNATIVE_SOURCE_MAPPING);
if (map == null) {
map = new ConcurrentHashMap<String, String>();
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<String, String> map = project.getUserData(DEBUGGER_ALTERNATIVE_SOURCE_MAPPING);
return map != null ? map.get(className) : null;
}
@Nullable
@@ -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() {