From bf89bd9cb5386f16cf79285f7320b92f02621387 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 26 Sep 2016 17:58:43 +0300 Subject: [PATCH] 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. --- .../CodeFragmentFactoryContextWrapper.java | 22 +++++++++++++++++-- .../expression/EvaluatorBuilderImpl.java | 2 -- .../com/intellij/debugger/ui/ValueHint.java | 4 +--- .../ui/impl/watch/EvaluationDescriptor.java | 6 +---- .../ui/tree/render/CachedEvaluator.java | 2 -- .../debugger/JavaDebuggerEditorsProvider.java | 2 -- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java index 6183d59f03c4..277a037b19e8 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java @@ -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 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; diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java index 749f0e1944af..977bfe7a54a4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java @@ -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); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.java b/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.java index ebac8ed49565..5e2bdc5aa862 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.java @@ -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()); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java index 7c461e1008ca..05464f5e77dc 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java @@ -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 { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java index afbaf03bb741..131d22e633d0 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java @@ -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; diff --git a/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java b/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java index 2af4c3caef60..447f83dbb91c 100644 --- a/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java +++ b/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java @@ -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);