prefer files from the original resolve context in debugger fields, this helps when we have same fqn classes in the project (for example in a lib and a module), in this case now we choose some random file.

This commit is contained in:
Egor.Ushakov
2016-09-26 17:59:47 +03:00
parent f1c87220b3
commit bf89bd9cb5
6 changed files with 22 additions and 16 deletions
@@ -21,10 +21,13 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaCodeFragment;
import com.intellij.psi.JavaRecursiveElementVisitor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLocalVariable;
import com.intellij.psi.search.DelegatingGlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.StringBuilderSpinAllocator;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.xdebugger.XDebugSession;
@@ -37,6 +40,7 @@ import com.sun.jdi.ObjectReference;
import com.sun.jdi.Value;
import org.jetbrains.annotations.NotNull;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
@@ -55,11 +59,11 @@ public class CodeFragmentFactoryContextWrapper extends CodeFragmentFactory {
}
public JavaCodeFragment createCodeFragment(TextWithImports item, PsiElement context, Project project) {
return myDelegate.createCodeFragment(item, wrapContext(project, context), project);
return prepareResolveScope(myDelegate.createCodeFragment(item, wrapContext(project, context), project));
}
public JavaCodeFragment createPresentationCodeFragment(TextWithImports item, PsiElement context, Project project) {
return myDelegate.createPresentationCodeFragment(item, wrapContext(project, context), project);
return prepareResolveScope(myDelegate.createPresentationCodeFragment(item, wrapContext(project, context), project));
}
public boolean isContextAccepted(PsiElement contextElement) {
@@ -75,6 +79,20 @@ public class CodeFragmentFactoryContextWrapper extends CodeFragmentFactory {
public EvaluatorBuilder getEvaluatorBuilder() {
return myDelegate.getEvaluatorBuilder();
}
private static JavaCodeFragment prepareResolveScope(JavaCodeFragment codeFragment) {
GlobalSearchScope originalResolveScope = codeFragment.getResolveScope();
codeFragment.forceResolveScope(new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(codeFragment.getProject())) {
final Comparator<VirtualFile> myScopeComparator = Comparator.comparing(originalResolveScope::contains);
@Override
public int compare(@NotNull VirtualFile file1, @NotNull VirtualFile file2) {
// prefer files from the original resolve scope
int res = myScopeComparator.compare(file1, file2);
return res != 0 ? res : super.compare(file1, file2);
}
});
return codeFragment;
}
private PsiElement wrapContext(Project project, final PsiElement originalContext) {
if (project.isDefault()) return originalContext;
@@ -36,7 +36,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.JavaConstantExpressionEvaluator;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiTypesUtil;
@@ -69,7 +68,6 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder {
if (codeFragment == null) {
throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.invalid.expression", text.getText()));
}
codeFragment.forceResolveScope(GlobalSearchScope.allScope(project));
DebuggerUtils.checkSyntax(codeFragment);
return factory.getEvaluatorBuilder().build(codeFragment, position);
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,7 +46,6 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.SimpleColoredText;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.util.IncorrectOperationException;
@@ -97,7 +96,6 @@ public class ValueHint extends AbstractValueHint {
TextWithImportsImpl textWithImports = new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, myCurrentExpression.getText());
CodeFragmentFactory factory = DebuggerUtilsEx.findAppropriateCodeFragmentFactory(textWithImports, myCurrentExpression);
JavaCodeFragment codeFragment = factory.createCodeFragment(textWithImports, myCurrentExpression.getContext(), getProject());
codeFragment.forceResolveScope(GlobalSearchScope.allScope(getProject()));
return factory.getEvaluatorBuilder().build(codeFragment, debuggerContext.getSourcePosition());
}
@@ -33,7 +33,6 @@ import com.intellij.debugger.jdi.StackFrameProxyImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.extractMethod.PrepareFailedException;
import com.intellij.refactoring.extractMethodObject.ExtractLightMethodObjectHandler;
import com.intellij.xdebugger.frame.XValueModifier;
@@ -65,10 +64,7 @@ public abstract class EvaluationDescriptor extends ValueDescriptorImpl{
public PsiCodeFragment createCodeFragment(PsiElement context) {
TextWithImports text = getEvaluationText();
final PsiCodeFragment fragment =
DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context).createCodeFragment(text, context, myProject);
fragment.forceResolveScope(GlobalSearchScope.allScope(myProject));
return fragment;
return DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context).createCodeFragment(text, context, myProject);
}
public final Value calcValue(final EvaluationContextImpl evaluationContext) throws EvaluateException {
@@ -22,7 +22,6 @@ import com.intellij.debugger.impl.DebuggerUtilsImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.reference.SoftReference;
import org.jetbrains.annotations.Nullable;
@@ -73,7 +72,6 @@ public abstract class CachedEvaluator {
}
cache.myPsiChildrenExpression = null;
JavaCodeFragment codeFragment = myDefaultFragmentFactory.createCodeFragment(myReferenceExpression, psiClassAndType.first, project);
codeFragment.forceResolveScope(GlobalSearchScope.allScope(project));
codeFragment.setThisType(psiClassAndType.second);
DebuggerUtils.checkSyntax(codeFragment);
cache.myPsiChildrenExpression = codeFragment instanceof PsiExpressionCodeFragment ? ((PsiExpressionCodeFragment)codeFragment).getExpression() : null;
@@ -27,7 +27,6 @@ import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.xdebugger.XExpression;
import com.intellij.xdebugger.XSourcePosition;
@@ -92,7 +91,6 @@ public class JavaDebuggerEditorsProvider extends XDebuggerEditorsProviderBase {
if (text != null) {
CodeFragmentFactory factory = DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context);
JavaCodeFragment codeFragment = factory.createPresentationCodeFragment(text, context, project);
codeFragment.forceResolveScope(GlobalSearchScope.allScope(project));
if (context != null) {
PsiType contextType = context.getUserData(DebuggerUtilsImpl.PSI_TYPE_KEY);