From edf8e67c965dfc17f48db41b3287deef4c97127e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 26 Aug 2010 20:28:41 +0400 Subject: [PATCH] fix implementation of refersFromMethodToClass() (PY-1654) --- .../python/psi/resolve/PyResolveUtil.java | 17 +++++++++++------ python/testData/resolve/BuiltinVsClassMember.py | 7 +++++++ .../com/jetbrains/python/PyResolveTest.java | 5 +++++ 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 python/testData/resolve/BuiltinVsClassMember.py diff --git a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java index 436b8013a221..5e2effc5c1af 100644 --- a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java @@ -189,12 +189,17 @@ public class PyResolveUtil { * @see com.jetbrains.python.psi.PyUtil#getConcealingParent(com.intellij.psi.PsiElement) */ protected static boolean refersFromMethodToClass(final PsiElement inner, final PsiElement outer) { - return ( - inner != null && - PsiTreeUtil.isAncestor(outer, inner, false) && - (PyUtil.getConcealingParent(outer) instanceof PyClass) && // outer is in a class context - (PsiTreeUtil.getParentOfType(inner, PyFunction.class, false) != null) // inner is a function or method within the class - ); + if (inner == null) { + return false; + } + PsiElement outerClass = PyUtil.getConcealingParent(outer); + if (outerClass instanceof PyClass) { // outer is in a class context + PyFunction innerFunction = PsiTreeUtil.getParentOfType(inner, PyFunction.class, false); + if (innerFunction != null && innerFunction.getContainingClass() == outerClass) { // inner is a function or method within the class + return true; + } + } + return false; } /** diff --git a/python/testData/resolve/BuiltinVsClassMember.py b/python/testData/resolve/BuiltinVsClassMember.py new file mode 100644 index 000000000000..e5903764bcd0 --- /dev/null +++ b/python/testData/resolve/BuiltinVsClassMember.py @@ -0,0 +1,7 @@ +class Foo: + def eval(self, value): + pass + + def bar(self): + eval('foo') +# diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index 8fecc86a1d51..4ac78cd43b52 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -361,4 +361,9 @@ public class PyResolveTest extends PyResolveTestCase { public void testStarUnpackingInLoop() { // PY-1525 assertResolvesTo(LanguageLevel.PYTHON30, PyTargetExpression.class, "bbb"); } + + public void testBuiltinVsClassMember() { // PY-1654 + final PyFunction pyFunction = assertResolvesTo(PyFunction.class, "eval"); + assertEquals("__builtin__.py", pyFunction.getContainingFile().getName()); + } } \ No newline at end of file