PY-48012 Resolve and complete attributes in PEP 634 class patterns

Both are implemented other the type of the corresponding class.
References resolve to any readable attribute of a class, however
some obviously wrong variants such as special "dunder" attributes
and methods are intentionally excluded from completion suggestions.

GitOrigin-RevId: 5edac14f47cba39840b15b0dd7f21e2e46077261
This commit is contained in:
Mikhail Golubev
2021-10-15 17:36:56 +00:00
committed by intellij-monorepo-bot
parent d15bf8a552
commit 1421975c96
49 changed files with 698 additions and 8 deletions
@@ -0,0 +1,12 @@
import dataclasses
@dataclasses.dataclass
class C:
count: int
name: str
match C(count=42, name='foo'):
case C(<caret>):
pass
@@ -0,0 +1,11 @@
import typing
class C(typing.NamedTuple):
count: int
name: str
match C(count=42, name='foo'):
case C(<caret>):
pass
@@ -0,0 +1,6 @@
class C:
class_attr = 42
match C():
case C(class_attr=<caret>):
pass
@@ -0,0 +1,6 @@
class C:
class_attr = 42
match C():
case C(cla<caret>):
pass
@@ -0,0 +1,8 @@
class C:
def __init__(self):
self.__attr = 42
match C():
case C(__<caret>):
pass
@@ -0,0 +1,8 @@
class C:
def __init__(self):
self.__attr = 42
match C():
case C(__<caret>):
pass
@@ -0,0 +1,7 @@
class C:
attr = 42
match C():
case C(<caret>):
pass
@@ -0,0 +1,7 @@
class C:
def __init__(self):
self.instance_attr = 42
match C():
case C(instance_attr=<caret>=True):
pass
@@ -0,0 +1,7 @@
class C:
def __init__(self):
self.instance_attr = 42
match C():
case C(instance<caret>=True):
pass
@@ -0,0 +1,12 @@
class Base:
def __init__(self):
self.inherited_attr = 42
class C(Base):
pass
match C():
case C(inherited_attr=<caret>):
pass
@@ -0,0 +1,12 @@
class Base:
def __init__(self):
self.inherited_attr = 42
class C(Base):
pass
match C():
case C(inh<caret>):
pass
@@ -0,0 +1,8 @@
class C:
class InnerClass:
pass
match C():
case C(Inner<caret>):
pass
@@ -0,0 +1,7 @@
class C:
def __init__(self):
self.instance_attr = 42
match C():
case C(instance_attr=<caret>):
pass
@@ -0,0 +1,7 @@
class C:
def __init__(self):
self.instance_attr = 42
match C():
case C(ins<caret>):
pass
@@ -0,0 +1,8 @@
class C:
def method(self):
pass
match C():
case C(met<caret>):
pass
@@ -0,0 +1,9 @@
class C:
@property
def prop(self):
pass
match C():
case C(prop=<caret>):
pass
@@ -0,0 +1,9 @@
class C:
@property
def prop(self):
pass
match C():
case C(pro<caret>):
pass
@@ -0,0 +1,8 @@
class C:
def __init__(self):
self.attr = 42
match C():
case C(attr = <caret>):
pass
@@ -0,0 +1,8 @@
class C:
def __init__(self):
self.attr = 42
match C():
case C(attr<caret>):
pass
@@ -0,0 +1,6 @@
class C:
pass
match C():
case C(__<caret>):
pass
@@ -0,0 +1,7 @@
class C:
attr1 = 42
match C():
case C(attr1=42):
pass
@@ -0,0 +1,7 @@
class C:
attr1 = 42
match C():
case C(att<caret>r2=42):
pass
@@ -0,0 +1,7 @@
class C:
attr1 = 42
match C():
case C(attr1 = <caret>42):
pass
@@ -0,0 +1,7 @@
class C:
attr1 = 42
match C():
case C(att<caret>r2 = 42):
pass