From 709caf3efb1a218b1a89861c39975c43ea79eb8b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 16 Mar 2010 18:34:22 +0300 Subject: [PATCH] complete keyword arguments taken from __init__ of superclass (PY-505) --- .../psi/impl/PyReferenceExpressionImpl.java | 34 ++++++++++++------- .../testData/completion/initParams.after.py | 4 +++ python/testData/completion/initParams.py | 4 +++ .../completion/superInitParams.after.py | 7 ++++ python/testData/completion/superInitParams.py | 7 ++++ .../python/PythonCompletionTest.java | 8 +++++ 6 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 python/testData/completion/initParams.after.py create mode 100644 python/testData/completion/initParams.py create mode 100644 python/testData/completion/superInitParams.after.py create mode 100644 python/testData/completion/superInitParams.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index 1e0c1d288e17..faab26aa18b9 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -505,18 +505,13 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere if (callee instanceof PyReferenceExpression) { PsiElement def = ((PyReferenceExpression)callee).resolve(); if (def instanceof PyFunction) { - ((PyFunction)def).getParameterList().acceptChildren( - new PyElementVisitor() { - @Override - public void visitPyParameter(PyParameter par) { - PyNamedParameter n_param = par.getAsNamed(); - assert n_param != null; - if (! n_param.isKeywordContainer() && ! n_param.isPositionalContainer()) { - ret.add(LookupElementBuilder.create(n_param.getName() + "=").setIcon(n_param.getIcon(0))); - } - } - } - ); + addKeywordArgumentVariants((PyFunction) def, ret); + } + else if (def instanceof PyClass) { + PyFunction init = ((PyClass) def).findMethodByName(PyNames.INIT, true); // search in superclasses + if (init != null) { + addKeywordArgumentVariants(init, ret); + } } } } @@ -552,6 +547,21 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere return ret.toArray(); } + private static void addKeywordArgumentVariants(PyFunction def, final List ret) { + def.getParameterList().acceptChildren( + new PyElementVisitor() { + @Override + public void visitPyParameter(PyParameter par) { + PyNamedParameter n_param = par.getAsNamed(); + assert n_param != null; + if (! n_param.isKeywordContainer() && ! n_param.isPositionalContainer()) { + ret.add(LookupElementBuilder.create(n_param.getName() + "=").setIcon(n_param.getIcon(0))); + } + } + } + ); + } + public boolean isSoft() { return false; } diff --git a/python/testData/completion/initParams.after.py b/python/testData/completion/initParams.after.py new file mode 100644 index 000000000000..3b8b83a7d7d0 --- /dev/null +++ b/python/testData/completion/initParams.after.py @@ -0,0 +1,4 @@ +class C: + def __init__(self, auno=True): pass + +c = C(auno=) diff --git a/python/testData/completion/initParams.py b/python/testData/completion/initParams.py new file mode 100644 index 000000000000..e4c5b04cda00 --- /dev/null +++ b/python/testData/completion/initParams.py @@ -0,0 +1,4 @@ +class C: + def __init__(self, auno=True): pass + +c = C(au) diff --git a/python/testData/completion/superInitParams.after.py b/python/testData/completion/superInitParams.after.py new file mode 100644 index 000000000000..7e830e95a5f4 --- /dev/null +++ b/python/testData/completion/superInitParams.after.py @@ -0,0 +1,7 @@ +class B: + def __init__(self, auno=True): pass + +class C(B): + pass + +c = C(auno=) diff --git a/python/testData/completion/superInitParams.py b/python/testData/completion/superInitParams.py new file mode 100644 index 000000000000..c6514cc8ec20 --- /dev/null +++ b/python/testData/completion/superInitParams.py @@ -0,0 +1,7 @@ +class B: + def __init__(self, auno=True): pass + +class C(B): + pass + +c = C(au) diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index f435804a05ab..f507279a7858 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -35,6 +35,14 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { doTest(); } + public void testInitParams() throws Exception { + doTest(); + } + + public void testSuperInitParams() throws Exception { // PY-505 + doTest(); + } + public void testPredefinedMethodName() throws Exception { doTest(); }