Fixed unresolved reference to parameter inside lambda in decorator (PY-6083)

This commit is contained in:
Andrey Vlasovskikh
2012-03-23 17:42:04 +04:00
parent e9e9b8f6e2
commit cd0854afe1
3 changed files with 17 additions and 4 deletions
@@ -57,10 +57,12 @@ public class ScopeUtil {
@Nullable
public static ScopeOwner getResolveScopeOwner(PsiElement element) {
// References in default values of parameters are defined somewhere in outer scopes, as well as references in decorators and
// superclasses
if (PsiTreeUtil.getParentOfType(element, PyParameter.class, PyDecorator.class) != null) {
element = getScopeOwner(element);
// References in default values of parameters are defined somewhere in outer scopes, as well as references in decorators (if they are
// not inside a lambda, see PY-6083) and superclasses
final ScopeOwner initialScopeOwner = getScopeOwner(element);
if (!(initialScopeOwner instanceof PyLambdaExpression && PsiTreeUtil.getParentOfType(element, PyDecorator.class) != null) &&
PsiTreeUtil.getParentOfType(element, PyParameter.class, PyDecorator.class) != null) {
element = initialScopeOwner;
}
final PyClass containingClass = PsiTreeUtil.getParentOfType(element, PyClass.class);
if (containingClass != null && element != null &&
@@ -0,0 +1,6 @@
def f(y):
return y
@f(lambda xx: xx<ref>)
def g():
pass
@@ -457,4 +457,9 @@ public class PyResolveTest extends PyResolveTestCase {
final PyFunction function = assertResolvesTo(PyFunction.class, "getStore");
assertEquals("PluginMetaclass", function.getContainingClass().getName());
}
// PY-6083
public void testLambdaParameterInDecorator() {
assertResolvesTo(PyNamedParameter.class, "xx");
}
}