From 46e3bd8845ff8600a770fa8d131dc045e35bccec Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Thu, 28 Jan 2016 15:45:13 +0300 Subject: [PATCH] PY-18253: Context passed to PyLineMarkerNavigator#search We used to use loose context that prevents user from accessing other classes. We use user-initiated context now since this navigation is user-initiated action --- .../python/codeInsight/PyLineMarkerNavigator.java | 6 ++++-- .../python/codeInsight/PyLineMarkerProvider.java | 13 ++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/PyLineMarkerNavigator.java b/python/src/com/jetbrains/python/codeInsight/PyLineMarkerNavigator.java index ef98e4b57b63..500c49e8ddc1 100644 --- a/python/src/com/jetbrains/python/codeInsight/PyLineMarkerNavigator.java +++ b/python/src/com/jetbrains/python/codeInsight/PyLineMarkerNavigator.java @@ -22,6 +22,8 @@ import com.intellij.psi.NavigatablePsiElement; import com.intellij.psi.PsiElement; import com.intellij.util.Processor; import com.intellij.util.Query; +import com.jetbrains.python.psi.types.TypeEvalContext; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.event.MouseEvent; @@ -34,7 +36,7 @@ import java.util.List; public abstract class PyLineMarkerNavigator implements GutterIconNavigationHandler { public void navigate(final MouseEvent e, final T elt) { final List navElements = new ArrayList(); - Query elementQuery = search(elt); + final Query elementQuery = search(elt, TypeEvalContext.userInitiated(elt.getProject(), elt.getContainingFile())); if (elementQuery == null) return; elementQuery.forEach(new Processor() { public boolean process(final T psiElement) { @@ -51,5 +53,5 @@ public abstract class PyLineMarkerNavigator implements Gut protected abstract String getTitle(T elt); @Nullable - protected abstract Query search(T elt); + protected abstract Query search(T elt, @NotNull TypeEvalContext context); } diff --git a/python/src/com/jetbrains/python/codeInsight/PyLineMarkerProvider.java b/python/src/com/jetbrains/python/codeInsight/PyLineMarkerProvider.java index 66050ee35f48..9693c7f4b681 100644 --- a/python/src/com/jetbrains/python/codeInsight/PyLineMarkerProvider.java +++ b/python/src/com/jetbrains/python/codeInsight/PyLineMarkerProvider.java @@ -108,9 +108,8 @@ public class PyLineMarkerProvider implements LineMarkerProvider, PyLineSeparator } @Nullable - protected Query search(final PsiElement elt) { + protected Query search(final PsiElement elt, @NotNull final TypeEvalContext context) { if (!(elt.getParent() instanceof PyFunction)) return null; - final TypeEvalContext context = TypeEvalContext.codeAnalysis(elt.getProject(), null); return PySuperMethodsSearch.search((PyFunction)elt.getParent(), context); } }; @@ -121,12 +120,12 @@ public class PyLineMarkerProvider implements LineMarkerProvider, PyLineSeparator } @Nullable - protected Query search(final PsiElement elt) { + protected Query search(final PsiElement elt, @NotNull final TypeEvalContext context) { List result = new ArrayList(); PyClass containingClass = PsiTreeUtil.getParentOfType(elt, PyClass.class); if (containingClass != null && elt instanceof PyTargetExpression) { - for (PyClass ancestor : containingClass.getAncestorClasses(null)) { - final PyTargetExpression attribute = ancestor.findClassAttribute(((PyTargetExpression)elt).getReferencedName(), false, null); + for (PyClass ancestor : containingClass.getAncestorClasses(context)) { + final PyTargetExpression attribute = ancestor.findClassAttribute(((PyTargetExpression)elt).getReferencedName(), false, context); if (attribute != null) { result.add(attribute); } @@ -141,7 +140,7 @@ public class PyLineMarkerProvider implements LineMarkerProvider, PyLineSeparator return "Choose Subclass of " + elt.getName(); } - protected Query search(final PyClass elt) { + protected Query search(final PyClass elt, @NotNull TypeEvalContext context) { return PyClassInheritorsSearch.search(elt, true); } }; @@ -151,7 +150,7 @@ public class PyLineMarkerProvider implements LineMarkerProvider, PyLineSeparator return "Choose Overriding Method of " + elt.getName(); } - protected Query search(final PyFunction elt) { + protected Query search(final PyFunction elt, @NotNull TypeEvalContext context) { return PyOverridingMethodsSearch.search(elt, true); } };