Change receiver for initialization calls and don't resolve callee to constructors

Callee is now a receiver for these cases, previously it was `null`.
Callee is not replaced with constructors to have an ability to map it onto self/cls parameters and process `(cls: Type[T], ...) -> T` annotations.
Stay with the previous behaviour for navigation and looking for target element.

GitOrigin-RevId: c0f9894cf50fd5d7fd325f095976d096fb948e89
This commit is contained in:
Semyon Proshev
2020-11-11 13:40:09 +03:00
committed by intellij-monorepo-bot
parent be15656e6d
commit fbbb78bc4e
27 changed files with 419 additions and 261 deletions

View File

@@ -69,20 +69,77 @@ public abstract class PyCommonResolveTest extends PyCommonResolveTestCase {
assertInstanceOf(targetElement, PyFunction.class);
}
public void testToConstructor() {
PsiElement target = resolve();
assertInstanceOf(target, PyFunction.class);
assertEquals(PyNames.INIT, ((PyFunction)target).getName());
public void testInitialization() {
assertResolvesTo(
"class Foo:\n" +
" pass\n" +
"Foo()\n" +
" <ref>",
PyClass.class,
"Foo"
);
}
public void testInitializationWithDunderInit() {
assertResolvesTo(
"class Foo:\n" +
" def __init__(self):\n" +
" pass\n" +
"Foo()\n" +
" <ref>",
PyClass.class,
"Foo"
);
}
// PY-17877
public void testInitializingToMetaclassDunderCall() {
assertResolvesTo(LanguageLevel.getLatest(), PyFunction.class, PyNames.CALL);
public void testInitializationWithMetaclassDunderCall() {
assertResolvesTo(
"class MyMeta(type):\n" +
" def __call__(cls, p1, p2):\n" +
" pass\n" +
"\n" +
"class MyClass(metaclass=MyMeta):\n" +
" pass\n" +
"\n" +
"MyClass()\n" +
" <ref>",
PyClass.class,
"MyClass"
);
}
public void testInitializationWithDunderInitAndMetaclassDunderCall() {
assertResolvesTo(
"class MyMeta(type):\n" +
" def __call__(cls, p1, p2):\n" +
" pass\n" +
"\n" +
"class MyClass(metaclass=MyMeta):\n" +
" def __init__(self): pass\n" +
"\n" +
"MyClass()\n" +
" <ref>",
PyClass.class,
"MyClass"
);
}
// PY-17877, PY-41380
public void testInitializingNotToMetaclassSelfArgsKwargsDunderCall() {
assertResolvesTo(LanguageLevel.getLatest(), PyClass.class, "MyClass");
public void testInitializationWithMetaclassSelfArgsKwargsDunderCall() {
assertResolvesTo(
"class MyMeta(type):\n" +
" def __call__(cls, *args, **kwargs):\n" +
" pass\n" +
"\n" +
"class MyClass(metaclass=MyMeta):\n" +
" pass\n" +
"\n" +
"MyClass()\n" +
" <ref>",
PyClass.class,
"MyClass"
);
}
public void testInitOrNewReturnsInitWhenNewIsFirst() {