From bb59f0adb33546d701a7666b47dcd9093bec02fe Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 7 Aug 2012 16:24:03 +0200 Subject: [PATCH] return weak type of class as return type of constructor call if the actual return type of __new__ is unknown (PY-6671) --- .../python/psi/impl/PyCallExpressionImpl.java | 6 ++++++ .../testData/completion/unknownNewReturnType.after.py | 11 +++++++++++ python/testData/completion/unknownNewReturnType.py | 11 +++++++++++ .../com/jetbrains/python/PythonCompletionTest.java | 4 ++++ 4 files changed, 32 insertions(+) create mode 100644 python/testData/completion/unknownNewReturnType.after.py create mode 100644 python/testData/completion/unknownNewReturnType.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionImpl.java index 9b709512be2a..0f22c649c5fe 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionImpl.java @@ -162,6 +162,12 @@ public class PyCallExpressionImpl extends PyElementImpl implements PyCallExpress } } if (t != null && !(t instanceof PyNoneType)) { + if (t instanceof PyTypeReference) { + PyType resolved = ((PyTypeReference)t).resolve(callee, context); + if (resolved == null) { + return new PyWeakClassType(cls, false); + } + } return t; } } diff --git a/python/testData/completion/unknownNewReturnType.after.py b/python/testData/completion/unknownNewReturnType.after.py new file mode 100644 index 000000000000..30573b8db2c9 --- /dev/null +++ b/python/testData/completion/unknownNewReturnType.after.py @@ -0,0 +1,11 @@ +def foo(): return foo() + +class Template(object): + def __new__(cls): + return foo() + + def xyzzy(self): + pass + +t = Template() +t.xyzzy() diff --git a/python/testData/completion/unknownNewReturnType.py b/python/testData/completion/unknownNewReturnType.py new file mode 100644 index 000000000000..b7a0bf3c8539 --- /dev/null +++ b/python/testData/completion/unknownNewReturnType.py @@ -0,0 +1,11 @@ +def foo(): return foo() + +class Template(object): + def __new__(cls): + return foo() + + def xyzzy(self): + pass + +t = Template() +t.x diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 9ae96c3b879c..c91ecf6fd1e3 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -584,4 +584,8 @@ public class PythonCompletionTest extends PyTestCase { public void testNoInitForSubmodules() { doMultiFileTest(); } + + public void testUnknownNewReturnType() { // PY-6671 + doTest(); + } }