*/
package com.intellij.debugger;
-import com.intellij.debugger.impl.AlternativeJreIndexHelper;
+import com.intellij.debugger.impl.AlternativeJreClassFinder;
import com.intellij.debugger.impl.DebuggerManagerImpl;
import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.execution.ExecutionException;
@Nullable
@Override
public Sdk getAlternativeJre() {
- return AlternativeJreIndexHelper.getAlternativeJre(environment.getRunProfile());
+ return AlternativeJreClassFinder.getAlternativeJre(environment.getRunProfile());
}
}
import com.intellij.debugger.PositionManager;
import com.intellij.debugger.SourcePosition;
import com.intellij.debugger.engine.evaluation.EvaluateException;
-import com.intellij.debugger.impl.AlternativeJreIndexHelper;
+import com.intellij.debugger.impl.AlternativeJreClassFinder;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
import com.intellij.debugger.requests.ClassPrepareRequestor;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
-import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.*;
import com.intellij.psi.impl.compiled.ClsClassImpl;
-import com.intellij.psi.impl.java.stubs.index.JavaStubIndexKeys;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
-import com.intellij.psi.stubs.StubIndex;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.DocumentUtil;
import com.intellij.util.containers.ContainerUtil;
// first check alternative jre if any
Sdk alternativeJre = myDebugProcess.getSession().getAlternativeJre();
if (alternativeJre != null) {
- try {
- psiClass = ContainerUtil.getFirstItem(StubIndex.getElements(JavaStubIndexKeys.CLASS_FQN,
- originalQName.hashCode(),
- project,
- AlternativeJreIndexHelper.getSearchScope(alternativeJre),
- PsiClass.class));
-
+ psiClass = findClass(project, originalQName, AlternativeJreClassFinder.getSearchScope(alternativeJre));
if (psiClass instanceof ClsClassImpl) { //try to find sources
PsiFile psiSource = findSourceFile((ClsClassImpl)psiClass, alternativeJre);
if (psiSource != null) {
return psiSource;
}
}
- }
- catch (IndexNotReadyException ignored) {
- }
}
if (psiClass == null) {
- GlobalSearchScope searchScope = myDebugProcess.getSearchScope();
- psiClass = DebuggerUtils.findClass(originalQName, project, searchScope); // try to lookup original name first
- if (psiClass == null) {
- int dollar = originalQName.indexOf('$');
- if (dollar > 0) {
- final String qName = originalQName.substring(0, dollar);
- psiClass = DebuggerUtils.findClass(qName, project, searchScope);
- }
- }
+ psiClass = findClass(project, originalQName, myDebugProcess.getSearchScope());
}
if (psiClass != null) {
return null;
}
+ @Nullable
+ private static PsiClass findClass(Project project, String originalQName, GlobalSearchScope searchScope) {
+ PsiClass psiClass = DebuggerUtils.findClass(originalQName, project, searchScope); // try to lookup original name first
+ if (psiClass == null) {
+ int dollar = originalQName.indexOf('$');
+ if (dollar > 0) {
+ psiClass = DebuggerUtils.findClass(originalQName.substring(0, dollar), project, searchScope);
+ }
+ }
+ return psiClass;
+ }
+
@Nullable
private static PsiFile findSourceFile(ClsClassImpl psiClass, Sdk alternativeJre) {
String sourceFileName = psiClass.getSourceFileName();
String packageName = ((PsiClassOwner)psiClass.getContainingFile()).getPackageName();
String relativePath = packageName.isEmpty() ? sourceFileName : packageName.replace('.', '/') + '/' + sourceFileName;
- for (VirtualFile file : AlternativeJreIndexHelper.getSourceRoots(alternativeJre)) {
+ for (VirtualFile file : AlternativeJreClassFinder.getSourceRoots(alternativeJre)) {
VirtualFile source = file.findFileByRelativePath(relativePath);
if (source != null && source.isValid()) {
PsiFile psiSource = psiClass.getManager().findFile(source);
*/
package com.intellij.debugger.impl;
-import com.intellij.execution.RunManager;
+import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.execution.configurations.ConfigurationWithAlternativeJre;
-import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.NonClasspathClassFinder;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.NonClasspathDirectoriesScope;
-import com.intellij.util.containers.SmartHashSet;
-import com.intellij.util.indexing.IndexableSetContributor;
+import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.Set;
+import java.util.List;
/**
* @author egor
*/
-public class AlternativeJreIndexHelper extends IndexableSetContributor {
- @NotNull
- @Override
- public Set<VirtualFile> getAdditionalRootsToIndex() {
- return Collections.emptySet();
+public class AlternativeJreClassFinder extends NonClasspathClassFinder {
+ public AlternativeJreClassFinder(Project project, DebuggerManagerEx manager) {
+ super(project);
+ manager.addDebuggerManagerListener(new DebuggerManagerAdapter() {
+ public void sessionCreated(DebuggerSession session) {
+ clearCache();
+ }
+
+ public void sessionRemoved(DebuggerSession session) {
+ clearCache();
+ }
+ });
}
- @NotNull
@Override
- public Set<VirtualFile> getAdditionalProjectRootsToIndex(@NotNull Project project) {
- SmartHashSet<VirtualFile> res = new SmartHashSet<>();
- for (RunConfiguration configuration : RunManager.getInstance(project).getAllConfigurationsList()) {
- Sdk jre = getAlternativeJre(configuration);
+ protected List<VirtualFile> calcClassRoots() {
+ Collection<DebuggerSession> sessions = DebuggerManagerEx.getInstanceEx(myProject).getSessions();
+ if (sessions.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<VirtualFile> res = ContainerUtil.newSmartList();
+ for (DebuggerSession session : sessions) {
+ Sdk jre = session.getAlternativeJre();
if (jre != null) {
res.addAll(getClassRoots(jre));
}
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.options.SettingsEditor;
-import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.util.indexing.UnindexedFilesUpdater;
import com.intellij.xdebugger.XDebugProcess;
import com.intellij.xdebugger.XDebugProcessStarter;
import com.intellij.xdebugger.XDebugSession;
}
final DebugProcessImpl debugProcess = debuggerSession.getProcess();
-
- // index alternative jdk if needed
- if (AlternativeJreIndexHelper.getAlternativeJre(env.getRunProfile()) != null) {
- DumbService.getInstance(debuggerSession.getProject()).queueTask(new UnindexedFilesUpdater(debuggerSession.getProject(), false));
- }
-
return XDebuggerManager.getInstance(env.getProject()).startSession(env, new XDebugProcessStarter() {
@Override
@NotNull
<debugger.syntheticProvider implementation="com.intellij.debugger.engine.DefaultSyntheticProvider"/>
<debugger.sourcePositionProvider implementation="com.intellij.debugger.engine.DefaultSourcePositionProvider" order="last"/>
<debugger.sourcePositionHighlighter implementation="com.intellij.debugger.engine.JavaSourcePositionHighlighter"/>
- <indexedRootsProvider implementation="com.intellij.debugger.impl.AlternativeJreIndexHelper"/>
+ <java.elementFinder implementation="com.intellij.debugger.impl.AlternativeJreClassFinder" order="last"/>
<debugger.nodeRenderer implementation="com.intellij.debugger.ui.tree.render.ColorObjectRenderer"/>
<debugger.nodeRenderer implementation="com.intellij.debugger.ui.tree.render.ImageObjectRenderer"/>