From 3b78c94b35a7da2667f544094abc7eb101d13953 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 9 Aug 2011 20:04:14 +0200 Subject: [PATCH] improve Ctrl-hover popups, show name of function that owns the parameter (PY-4155) --- .../PythonDocumentationProvider.java | 25 ++++++++++++------- .../testData/quickdoc/HoverOverParameter.html | 2 ++ .../testData/quickdoc/HoverOverParameter.py | 3 +++ .../com/jetbrains/python/PyQuickDocTest.java | 8 ++++-- 4 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 python/testData/quickdoc/HoverOverParameter.html create mode 100644 python/testData/quickdoc/HoverOverParameter.py diff --git a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java index 064cb97012ee..a0cc2dc19650 100644 --- a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java +++ b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java @@ -32,7 +32,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -69,8 +68,8 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i PyClass cls = (PyClass)element; return describeDecorators(cls, LSame2, ", ", LSame1).add(describeClass(cls, LSame2, false, false)).toString(); } - else if (originalElement instanceof PyReferenceExpression) { - return describeExpression((PyExpression)originalElement); + else if (element instanceof PyTargetExpression || element instanceof PyNamedParameter) { + return describeExpression((PyExpression)element, originalElement); } return null; } @@ -101,14 +100,22 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i } @Nullable - private static String describeExpression(PyExpression expr) { + private static String describeExpression(PyExpression expr, PsiElement originalElement) { final String name = expr.getName(); if (name != null) { - final String kind = (expr instanceof PyNamedParameter) ? "parameter" : "variable"; - return String.format("%s \"%s\"\n%s", - kind, - name, - describeExpressionType(expr)); + StringBuilder result = new StringBuilder((expr instanceof PyNamedParameter) ? "parameter" : "variable"); + result.append(String.format(" \"%s\"", name)); + if (expr instanceof PyNamedParameter) { + final PyFunction function = PsiTreeUtil.getParentOfType(expr, PyFunction.class); + if (function != null) { + result.append(" of ").append(function.getContainingClass() == null ? "function" : "method"); + result.append(String.format(" \"%s\"", function.getName())); + } + } + if (originalElement instanceof PyExpression) { + result.append("\n").append(describeExpressionType((PyExpression)originalElement)); + } + return result.toString(); } return null; } diff --git a/python/testData/quickdoc/HoverOverParameter.html b/python/testData/quickdoc/HoverOverParameter.html new file mode 100644 index 000000000000..b833ca2979b0 --- /dev/null +++ b/python/testData/quickdoc/HoverOverParameter.html @@ -0,0 +1,2 @@ +parameter "self" of method "foo" +Inferred type: A diff --git a/python/testData/quickdoc/HoverOverParameter.py b/python/testData/quickdoc/HoverOverParameter.py new file mode 100644 index 000000000000..0d77b4cd6241 --- /dev/null +++ b/python/testData/quickdoc/HoverOverParameter.py @@ -0,0 +1,3 @@ +class A: + def foo(self): + self diff --git a/python/testSrc/com/jetbrains/python/PyQuickDocTest.java b/python/testSrc/com/jetbrains/python/PyQuickDocTest.java index ddb3de8c2297..5227fc4c0521 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickDocTest.java +++ b/python/testSrc/com/jetbrains/python/PyQuickDocTest.java @@ -82,8 +82,8 @@ public class PyQuickDocTest extends LightMarkedTestCase { Map marks = loadTest(); final PsiElement original_elt = marks.get(""); PsiElement ref_elt = original_elt.getParent(); // ident -> expr - final PyDocStringOwner doc_owner = (PyDocStringOwner)((PyReferenceExpression)ref_elt).getReference().resolve(); - checkByHTML(myProvider.getQuickNavigateInfo(doc_owner, original_elt)); + final PsiElement docOwner = ((PyReferenceExpression)ref_elt).getReference().resolve(); + checkByHTML(myProvider.getQuickNavigateInfo(docOwner, ref_elt)); } public void testDirectFunc() { @@ -212,4 +212,8 @@ public class PyQuickDocTest extends LightMarkedTestCase { public void testHoverOverMethod() { checkHover(); } + + public void testHoverOverParameter() { + checkHover(); + } }